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

譚勇發表於2018-08-18

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

 

相關文章