自己动手实现一个QQ群管理机器人(use python)
最近和朋友在做一个社群,这个社群的主要功能是群成员发布闲置信息,然后其他人进行抢单,交易大概就是下面这个样子。
优点是可以让所有的群成员看到,但是如果要检索几个小时的信息就比较困难了,于是我们最开始每天进行人工导入到我们做的一个网站中,随着每天发单量的增加,人工导入的方式不仅耗时间,而且每单的时间也不准确。
在这样的背景下,我就决定做一个QQ机器人,只要他们一发单,就自动导入和更新到数据库中,并且维持发单的秩序。
首先是技术选型,在github上搜索了一波,发现关于QQ机器人有不少这方面的项目,大概花了2个小时,试了几个项目后,找到了比较理想的一个项目(SmartQQBot)。
*github地址如下:https://github.com/Yinzo/SmartQQBot
查看一波文档后,大概了解了如何进行二次开发(写一个插件)。
创建一个文件 auto_system_plugin.py,放置到smart_qq_plugins文件夹内
# coding: utf-8
from random import randint
from smart_qq_bot.messages import GroupMsg, PrivateMsg
from smart_qq_bot.signals import on_all_message, on_bot_inited
from smart_qq_bot.logger import logger
import MySQLdb
import datetime
conn= MySQLdb.connect(
host='127.0.0.1',
port = 3306,
user='xxx',
passwd='xxx',
db ='xxx',
charset='utf8'
)
cur = conn.cursor()
@on_bot_inited("PluginManager")
def manager_init(bot):
logger.info("Plugin Manager is available now:)")
@on_all_message(name="AutoSystem")
def sample_plugin(msg, bot):
"""
:type bot: smart_qq_bot.bot.QQBot
:type msg: smart_qq_bot.messages.GroupMsg
"""
msg_id = randint(1, 10000)
# 发送一条群消息
if isinstance(msg, GroupMsg):
content = msg.content;
index = 0
for index in range(0,len(content)):
if(content[index].isdigit() == False):
break
if index == 0:
bot.send_friend_msg("发单格式有误,请以序号开头。", msg.from_uin, msg_id)
return
number = int(content[:index]) #编号
string = content[index:len(content)].strip() #编号后面的字符串
if string[:1] == '出':
err_code = add(msg,number,string,1)
if err_code < 0:
bot.send_group_msg("编号"+str(number)+"已被使用,你可以使用编号"+str(get_latest_order()), msg.from_uin, msg_id);
if err_code > 0:
bot.send_group_msg("编号"+str(number)+"暂不可用,你可以使用编号"+str(get_latest_order()), msg.from_uin, msg_id);
return
if string[:1] == '求' or string[0:1] == '收' or string[0:1] == '买':
err_code = add(msg,number,string,2)
if err_code < 0:
bot.send_group_msg("编号"+str(number)+"已被使用,你可以使用编号"+str(get_latest_order()), msg.from_uin, msg_id);
if err_code > 0:
bot.send_group_msg("编号"+str(number)+"暂不可用,你可以使用编号"+str(get_latest_order()), msg.from_uin, msg_id);
return
if string[:1] == '结' or string[0:1] == '截':
over(msg,number)
return
else:
bot.send_group_msg("请按照群公告中规定的格式发单。", msg.from_uin, msg_id);
return
# 发送一条私聊消息
# elif isinstance(msg, PrivateMsg):
# bot.send_friend_msg("请按照群公告中规定的格式发单。", msg.from_uin, msg_id);
def add(msg,number,string,order_type):
now = datetime.datetime.now()
now.strftime('%Y-%m-%d')
sql = "select * from `erhuo_books` where order_id = '%d'" %(number)
cur.execute(sql)
results = cur.fetchall()
if len(results)>0:
latest_order = get_latest_order();
return -latest_order
latest_order = get_latest_order();
if (number != latest_order):
return latest_order;
insert_sql = "insert into `erhuo_books` (`name`,`owner_id`,`type`,`order_id`,`create_date`) \
values ('%s','%d','%d','%s','%s') " %(string[1:],get_user_id(msg),order_type,str(number),now)
cur.execute(insert_sql)
return 0
def over(msg,number):
sql = "update `erhuo_books` set status = 0 where owner_id = '%d' and order_id = '%d' "%(get_user_id(msg),number)
cur.execute(sql)
def get_user_id(msg):
qq = msg.src_sender_id
if len(qq)<6:
return -1
find_sql = "select * from `erhuo_users` where `qq` = '%s' limit 1" % (qq)
cur.execute(find_sql)
results = cur.fetchall()
#未注册,则使用该QQ号和前六位作为密码
if len(results)<1:
password = qq[0:6]
insert_sql = "insert into `erhuo_users` (`qq`,`password`) values ('%s','%s')" %(qq,password)
cur.execute(insert_sql)
cur.execute(find_sql)
results = cur.fetchall()
#获取用户id
for row in results:
return int(row[0])
def get_latest_order():
sql = "select max(order_id) from `erhuo_books`";
cur.execute(sql)
results = cur.fetchall()
for row in results:
return int(row[0])+1
在plugin.json中,plugin_on字段中,填入新插件名字,文件可能是这样
{
"plugin_packages": [],
"plugin_on": [
"manager",
"satoru",
"sample_plugin"
]
}
启动机器人,会在console看到插件已经载入
运行python run.py,扫描二维码,最终运行效果如下:
把代码上传到远程云服务器上,然后执行nohup python run.py & 即可在后台自动运行了。
不过问题还有以下几个:
程序在运行一天后,会因为登录cookie失效和退出。
对于他们发单信息的识别规则还有较大的提升空间。
如果可以再加上一个能够自动匹配[求购]和[出售],就能dafu提高成交率了。
最新文章
全部分类