1. 程式人生 > >基於python使用qqbot接入qq做一個簡單的文字消息自動回復

基於python使用qqbot接入qq做一個簡單的文字消息自動回復

備註 命令 ESS 消息響應 int 二維 參考 成功 nonetype

qqbot是一個免費開源的基於smartqqpython插件,如果默認安裝有pip,則可以直接在命令行下執行:pip install qqbot安裝qqbot,安裝成功後可以在命令行輸入qqbot help查看幫助文檔。如果直接輸入qqbot會自動彈出一個二維碼圖片,用手機qq掃碼即可啟動成功,會自動保存本次的登陸信息到本地文件,下次可以輸入qqbot -q qq號碼啟動,如果登陸信息沒有過期就可以不用掃碼登陸。qqbot啟動後,可以再開一個終端來操作qqbot,輸入:qq help|stop|restart,這三個命令分別是幫助文檔,停機和重啟。

下面實現自己的文字消息自動回復。qqbot提供了一個消息響應函數,我們只需要註冊這個消息響應函數就可以收到

qq消息了,這個消息響應函數的寫法如下:

from qqbot import QQBotSlot as qqbotslot,RunBot

@qqbotslot
def onQQMessage(bot,contact,member,content):

    if content == -hello:
        bot.SendTo(contact,你好)
    elif content==-stop:
        bot.SendTo(contact,機器人已關閉)
        bot.Stop()

if __name__==__main__:
    RunBot()

註意這個消息響應函數名必須是onQQMessage,函數參數也必須一致。

寫好消息響應函數後,保存為xx.py,如果qqbot已經啟動請關閉qqbot進程,然後在命令行輸入python xx.py -q qq號碼,這樣就可以啟動qqbot,並且會把xx.py自動註冊到qqbot的消息響應函數上,當qq收到消息時會在命令行上看到。還有一種運行xx.py的方式,就是把此文件當作一個插件,在qqbot運行過程中動態加載卸載。首先要將此文件保存在系統中可以import到的目錄下,如python的安裝目錄下的Lib/site-packages目錄,在qqbot啟動後,在另外一個控制臺輸入qq plug xx

就可以將onQQMessage函數註冊到qqbot中去,輸入qq unplugin xx。如果以插件形式加載xx.py,文件內容可以簡化,只保留def onMessage函數,其他的都可以刪除。

下面簡單介紹傳入onQQMessage的四個參數,botqqbot對象,提供了List/Send/Stop/Restart四個接口,List接口是一個查詢接口,可以主動查詢聯系人列表等信息,具體詳情還需查閱相關文檔,本案例沒用到這個接口,Send是一個發送消息的接口,Stop是停止qqbot的接口,Restart是重啟qqbot的接口。contact是消息的發送者對象,member僅本消息是群或者討論組的消息時才有效,代表發送消息的成員。content是一個str對象,消息的內容。

qqbot提供了幾種發送二維碼登陸驗證的方法,分別有GUI模式,郵箱模式,服務器模式,文本模式。默認是GUI模式,當開啟了其他模式時,GUI模式是關閉的。一般常用的是GUI和郵箱模式。在第一次啟動qqbot後,在電腦系統盤裏的用戶目錄C:\Users\個人電腦賬號名(有可能是C:\用戶\電腦的賬號名)目錄下會有一個.qqbot-tmp文件夾,在這個文件夾裏,有一個v2.3.conf文件,這個文件就是登陸驗證的配置文件,打開配置文件,裏面有介紹配置的作用,可以自己復制一份somebody更改為自己想要的登陸模式,假設我復制了一份somebody添加在somebody後面,並命名為some,修改定制some的內容,下次啟動時可以輸入qqbot -u some或者python xx.py -u some啟動qqbot

下面給出個人實現的qq上收到’笑話’消息時自動回復一條笑話,笑話是上篇博文抓取存儲的,從mysql數據庫裏獲取笑話的python代碼也在上篇博文。具體代碼如下。

from qqbot import QQBotSlot as qqbotslot,RunBot
import mysql

@qqbotslot
def onQQMessage(bot,contact,member,content):

    if content == 笑話:
        bot.SendTo(contact,mysql.get_one())
    elif content==-stop:
        bot.SendTo(contact,機器人已關閉)
        bot.Stop()

if __name__==__main__:
    RunBot()

下面給出contactmember對象的簡單說明。可以自己使用contact.__dict__獲得對象的屬性,註意,如果是一對一私聊則member對象將為NoneType。由於smartqq的限制,很多功能都缺失了,比如不能獲取到真實的qq號。

contact對象__dict__大致如下:

#{‘qq‘: ‘#NULL‘, ‘uin‘: ‘3285709011‘, ‘nick‘: ‘mytest2‘, ‘mark‘: ‘‘,
#  ‘name‘: ‘mytest2‘, ‘gcode‘: ‘3285709011‘, ‘ctype‘: ‘group‘}

uin唯一標識,群聊天時標識群,一對一私聊時標識qq。nick是群名稱,ctype說明本次消息是何種類型的,group表示是群,buddy表示是私聊。

member對象__dict__大致如下:

#{‘qq‘: ‘#NULL‘, ‘uin‘: ‘3012699167‘, ‘nick‘: ‘XX‘, ‘mark‘: ‘#NULL‘, # ‘card‘: ‘XXXX‘, ‘name‘: ‘XXXX‘, ‘join_time‘: -1, ‘last_speak_time‘: -1, # ‘role‘: ‘#NULL‘, ‘role_id‘: -1, ‘is_buddy‘: -1, ‘level‘: -1, ‘levelname‘: ‘#NULL‘, # ‘point‘: -1, ‘ctype‘: ‘group-member‘}

當私聊時此對象為NoneType,uin唯一標識群成員,nick標識qq昵稱,card表示群聊天裏發消息的那個qq昵稱備註。

其實通過onQQMessage我們已經可以做很多事情了,qqbot還提供了其他一些功能,可以參考百度相關資料得到。下一篇將介紹接入圖靈機器人實現智能聊天。

基於python使用qqbot接入qq做一個簡單的文字消息自動回復