天天看點

python實作一個QQ群聊天機器人

最近由于項目需求,需要做個QQ群的聊天機器人用于回答咨詢的問題。在這樣的情況下,我開始了QQ機器人的踩坑之旅。

這個機器人需求就是在群裡有人@機器人+問題時,機器人通過檢測資訊是否有@之後,提取其中問題再進行檢索。其實就相當于一個制作一個簡單的問答系統基于QQ群這個平台。

通過查找的資料來看,QQ聊天機器人目前都是基于SmartQQ協定開發的。那麼首先讓我們來了解一下SmartQQ,這裡貼上wiki對SmartQQ的解釋:

WebQQ是騰訊于2009年9月15日正式推出的一項服務,該服務可以使使用者在不安裝QQ軟體的情況下使用QQ的部分服務。
2013年9月,WebQQ改名SmartQQ釋出。它在界面方面和手機QQ非常相似,聊天方式則又和Pad版的QQ類似。
域名為w.qq.com
由于安全問題,限制為僅能掃描二維碼登入。
                
至此,已經了解到QQ機器人是基于什麼基礎開發的了,若是自己根據SmartQQ協定開發一套API就太費時費力了。首先,我到github上搜尋了一波之後,發現有許多QQ機器人相關的項目,其中不乏有使用python開發的架構。花了一點時間download了一些項目測試之後,找到了一個比較友好的項目--------SmartQQBot
github位址如下:https://github.com/Yinzo/SmartQQBot
           
python實作一個QQ群聊天機器人

檢視一波文檔後,大概了解了如何進行二次開發(寫一個插件)。可以直接在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的回答是提問者想要的結果。