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


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還提供了其他一些功能,可以參考百度相關資料得到。下一篇將介紹接入圖靈機器人實現智能聊天。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM