【打死不做程式設計師】python3+qqBot+圖靈機器人實現qq聊天機器人
原理:
通過Python3的qqBot開源庫,基於騰訊的smartQQ協議登入個人QQ,實現監控、收集QQ訊息,進而通過圖靈機器人API接入方式實現自動聊天。
零、前期準備:
1、Python3
2、qqBot & requests & re
3、申請圖靈機器人
一、安裝Python3的3個庫:
Windows下開啟cmd命令提示符,進入python,嘗試import匯入一下庫。若均已安裝,則顯示如下:
1 Microsoft Windows [版本 10.0.17134.407] 2 (c) 2018 Microsoft Corporation。保留所有權利。 3 4 C:\Users\20173>python 5 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 6 Type "help", "copyright", "credits" or "license" for more information. 7 >>> import qqbot 8 >>> import requests9 >>> import re 10 >>>
若未安裝,則可直接輸入pip安裝
C:\Users\20173>pip install qqbot ... C:\Users\20173>pip install requests ... C:\Users\20173>pip install re ...
二、關於qqBot:
若成功安裝qqBot後,安裝路徑應該在Python安裝路徑的 \Lib\site-packages\qqbot 裡
此時進入qqbot下的 plugins 子目錄下,並直接修改 sample.py 外掛檔案
原始sample.py外掛內容如下:
1 # -*- coding: utf-8 -*- 2 3 # 外掛載入方法: 4 # 先執行 qqbot ,啟動成功後,在另一個命令列視窗輸入: qq plug qqbot.plugins.sample 5 6 def onQQMessage(bot, contact, member, content): 7 if content == '-hello': 8 bot.SendTo(contact, '你好,我是QQ機器人') 9 elif content == '-stop': 10 bot.SendTo(contact, 'QQ機器人已關閉') 11 bot.Stop()
可以容易得知,contact引數代表聯絡人(qq好友、群、臨時會話),content代表接受的訊息內容。
他們的實際意義如下:
1 bot : QQBot 物件,提供 List/SendTo/Stop/Restart 等介面,詳見本文件第五節 2 contact : QContact 物件,訊息的傳送者,具有 ctype/qq/uin/nick/mark/card/name 等屬性 3 member : QContact 物件,僅當本訊息為“群訊息”或“討論組訊息”時有效,代表實際發訊息的成員(群成員) 4 content : str 物件,接受的訊息內容
若想詳細瞭解可參考Github原始碼地址:https://github.com/pandolia/qqbot
由此,我們可以知道,我們只需對str物件型別的 content 引數進行處理,並把結果通過呼叫 bot.SendTo(contact, "要回復內容") 即可
三、關於圖靈機器人及呼叫的API:
首先是接入說明(詳細說明:https://www.kancloud.cn/turing/www-tuling123-com/718227):
-->API V2.0是基於圖靈機器人平臺語義理解、深度學習等核心技術,為廣大開發者和企業提供的線上服務和開發介面。
-->編碼方式 UTF-8(呼叫圖靈API的各個環節的編碼方式均為UTF-8)
-->介面地址 http://openapi.tuling123.com/openapi/api/v2
-->請求方式 HTTP POST
-->請求引數 請求引數格式為 json
也就是說,我們只需把上一步的 content 內容寫到指定位置的 json 裡,然後把發到介面地址,再從響應的內容裡提取所要的回覆內容即可。
四、程式碼實現:
以下即為sample.py檔案內容:
# -*- coding: utf-8 -*- import json import requests import re # 外掛載入方法: # 先在命令列執行 qqbot ,
# 啟動成功後,在另一個命令列視窗輸入: qq plug qqbot.plugins.sample def answerMessage(ask_message): url = 'http://openapi.tuling123.com/openapi/api/v2' body = { "reqType":0, "perception": { "inputText": { "text": "" } }, "userInfo": { "apiKey": "此處填機器人的APIKey(32位16進位制數字)", "userId": "此處填圖靈機器人的使用者名稱(六位數字)" } } body['perception']['inputText']['text'] = ask_message data = json.dumps(body) response = requests.post(url, data = data) retext = response.text answ_text = re.findall((re.compile('{.*?results":.*?values.*?text":"(.*?)"}', re.S)), retext) text = str(answ_text[0]) try: answ_shows = re.findall((re.compile('{.*?showtext":"(.*?)",', re.S)), retext) return str(answ_shows[0]) except IndexError: answ_names = re.findall((re.compile('{.*?name":"(.*?)",', re.S)), retext) answ_urls = re.findall((re.compile('{.*?detailurl":"(.*?)"}', re.S)), retext) try: for index in range(3): text = text+"\n原標題"+str(index+1)+":"+str(answ_names[index])+"\n連結地址:"+str(answ_urls[index]) return (text) except IndexError: return (str(answ_text[0])) def onQQMessage(bot, contact, member, content): answer = answerMessage(content) bot.SendTo(contact, answer)
這裡我有對新聞資訊和查詢天氣做了處理,中間有幾個異常處理,想簡單的話可分析下API說明,不用這麼多也行的。
五、啟動方式
首先啟動qqbot:
這是不出意外的話會彈出照片視窗,掃描二維碼即可登入;
若長時間不彈出二維碼,請自行找到地址(如上圖,我的是:C:\Users\20173\.qqbot-tmp\plugins),手動開啟並掃描登陸。
成功後繼續顯示如下:
其次載入sample.py外掛:
再開啟一個終端(上買啟動那個不要關閉),輸入:qq plug qqbot.plugins.sample
拓展:有興趣可研究下.json檔案用處及用法,還有re,requests等。
另外這裡也可對此機器人回覆內容等進行進一步的探索和拓展。
***每天進步一點點***
===感激並前行著===