admin管理员组

文章数量:1535545

最近由于项目需求,需要做个QQ群的聊天机器人用于回答咨询的问题。在这样的情况下,我开始了QQ机器人的踩坑之旅。
这个机器人需求就是在群里有人@机器人+问题时,机器人通过检测信息是否有@之后,提取其中问题再进行检索。其实就相当于一个制作一个简单的问答系统基于QQ群这个平台。
通过查找的资料来看,QQ聊天机器人目前都是基于SmartQQ协议开发的。那么首先让我们来了解一下SmartQQ,这里贴上wiki对SmartQQ的解释:

WebQQ是腾讯于2009915日正式推出的一项服务,该服务可以使用户在不安装QQ软件的情况下使用QQ的部分服务。
20139月,WebQQ改名SmartQQ发布。它在界面方面和手机QQ非常相似,聊天方式则又和Pad版的QQ类似。
域名为w.qq.com
由于安全问题,限制为仅能扫描二维码登录。
至此,已经了解到QQ机器人是基于什么基础开发的了,若是自己根据SmartQQ协议开发一套API就太费时费力了。首先,我到github上搜索了一波之后,发现有许多QQ机器人相关的项目,其中不乏有使用python开发的框架。花了一点时间download了一些项目测试之后,找到了一个比较友好的项目--------SmartQQBot
github地址如下:https://github/Yinzo/SmartQQBot

查看一波文档后,大概了解了如何进行二次开发(写一个插件)。可以直接在manage.py中,添加你要实现的代码。

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

@on_all_message(name="PluginManger[test]")
def test_bot(msg, bot):
    result = do_test(msg, bot)
    if result is not None:
        return bot.reply_msg(msg, result)

def do_test(msg, bot):
    content = msg.content
    content = Converter('zh-hans').convert(content)
    nick = bot.username
    atnick = '@'+nick
    content_1 = content.replace(' ', '')

    if atnick == content_1:
        answer = "请按照以下方法进行询问:{a} +您的问题".format(a=atnick)
        return "%s" % answer

    ask_message = content.replace(atnick+' ', '')

    if atnick in content:
        src_sender_name = msg.src_sender_name
        print("%s" % src_sender_name)
        try:
            answer = getanswers(ask_message)
        except:
            response_json = tuling(ask_message)
            answer = response_json.get('text')
            # answer = "抱歉,机器人无法理解您的意思,请换一种问法试试!"
        return "@%s %s"% (src_sender_name, answer)


def getanswers(ask_message):
    connection = sqlite3.connect('./LZ_ZX.sqlite3')
    sql = "select * from 'asks_answer' where class4='%{ask}%'".format(ask=ask_message)
    sql_like = "select * from 'asks_answer' where class4 LIKE '%{ask}%'".format(ask=ask_message)
    df = pd.read_sql_query(sql, connection)
    if len(df) == 0:
        df = pd.read_sql_query(sql_like, connection)
    df = df[df["part"] == '0']
    answer = df['answer']
    answer = answer.values
    answer_1 = answer[0]
    connection.close()
    return answer_1

不过问题还有一下几个:

  • 程序运行一天后,会因为登录cookie失效和退出
  • 程序在大约4个小时没有人访问的情况下会挂掉,不做出任何回应。
  • QQBot只能做出文本解析,和文本回应。这意味着这个项目的难点在于:怎样使得Bot的回答是提问者想要的结果。

本文标签: 机器人Pythonqq