自己动手实现一个QQ群管理机器人(use python)

 费德  2017/02/26 22:26  2,890 次

最近和朋友在做一个社群,这个社群的主要功能是群成员发布闲置信息,然后其他人进行抢单,交易大概就是下面这个样子。
20170226215717.png
优点是可以让所有的群成员看到,但是如果要检索几个小时的信息就比较困难了,于是我们最开始每天进行人工导入到我们做的一个网站中,随着每天发单量的增加,人工导入的方式不仅耗时间,而且每单的时间也不准确。
20170226220139.png
在这样的背景下,我就决定做一个QQ机器人,只要他们一发单,就自动导入和更新到数据库中,并且维持发单的秩序。
首先是技术选型,在github上搜索了一波,发现关于QQ机器人有不少这方面的项目,大概花了2个小时,试了几个项目后,找到了比较理想的一个项目(SmartQQBot)。
*github地址如下:https://github.com/Yinzo/SmartQQBot
20170226220758.png
查看一波文档后,大概了解了如何进行二次开发(写一个插件)。
创建一个文件 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,扫描二维码,最终运行效果如下:
20170226222018.png

20170226222103.png
把代码上传到远程云服务器上,然后执行nohup python run.py & 即可在后台自动运行了。

不过问题还有以下几个:

  • 程序在运行一天后,会因为登录cookie失效和退出。

  • 对于他们发单信息的识别规则还有较大的提升空间。

  • 如果可以再加上一个能够自动匹配[求购]和[出售],就能dafu提高成交率了。

 作者:费德

少年费德的奇幻漂流

本博客如无特殊说明皆为原创,转载请注明来源:自己动手实现一个QQ群管理机器人(use python)

添加新评论