文章目錄
- 前言
- 一、webwx 子產品介紹
- 二、微信智能聊天
前言
本篇文章作為系列第三篇文章,将實作一個微信智能聊天機器人:
系列其它文章請參考:
python web微信應用(一) 微信協定分析
python web微信應用(二) webwx 子產品源碼
python web微信應用(四) 監測自己被群組消息 @
python web微信應用(五) 自動下載下傳接收的圖檔/語音/視訊
python web微信應用(六) 監測微信撤回的消息
一、webwx 子產品介紹
目前支援消息來源: 群組、公衆号、聯系人、自己
目前支援消息類型: 文本,位置,連結,圖檔,語音,視訊,名片,表情,檔案,撤回
不同消息類型所攜帶的字段也不同,具體如下:
類型 | 字段 |
---|---|
必有字段 | 字元串類型,取值 “GROUP/SUBSCRIPTION/CONTACT/MYSELF/UNSUPPORTED”, 表示消息來源于群組/公衆号/聯系人/自己/不支援 字元串類型,表示發送者的身份,由系統配置設定,@@開頭表示群組,@開頭表示聯系人或者公衆号 字元串類型,取值 “TEXT/POSITION/IMAGE/VOICE/VIDEO/CARD/ANIMATION/FILE/REVOKE/UNSUPPORTED”, 表示消息類型是文本/位置/圖檔/語音/視訊/名片/表情/檔案/撤回/不支援 字元串類型,表示消息的唯一 id,由系統配置設定 |
| |
GROUP | 字元串類型,表示發送者所在的群組昵稱 字元串類型,表示發送者的昵稱 : 字元串類型,表示發送者設定的自己在該群的顯示名稱,沒有則為 ‘’ 布爾類型,表示自己是否被 @ |
SUBSCRIPTION | 字元串類型,表示發送者公衆号昵稱 |
CONTACT | 字元串類型,表示發送者昵稱 字元串類型,表示發送者備注名 |
MYSELF | 字元串類型,表示自己的昵稱 |
| |
TEXT | 字元串類型,表示接收到的消息内容 |
POSITION | 字元串類型,浮點數,表示緯度 字元串類型,浮點數,表示經度 字元串類型,整數,表示縮放比例 字元串類型,表示位置的标簽名稱 字元串類型,表示位置的具體名稱 |
IMAGE | 整數類型,表示圖檔高度 整數類型,表示圖檔寬度 字元串類型,表示圖檔在伺服器的資源 id,由系統配置設定,用于下載下傳使用 函數類型,表示下載下傳圖檔的函數 調用 ,将下載下傳圖檔到目前目錄,儲存檔案名為 img_mediaId.jpg |
VOICE | 整數類型,表示語音時長,機關毫秒 字元串類型,表示圖檔在伺服器的資源 id,由系統配置設定,用于下載下傳使用 函數類型,表示下載下傳語音的函數 調用 ,将下載下傳語音到目前目錄,儲存檔案名為 voice_mediaId.mp3 |
VIDEO | 整數類型,表示視訊高度 整數類型,表示視訊寬度 整數類型,表示視訊時長,機關秒 字元串類型,表示視訊在伺服器的資源 id,由系統配置設定,用于下載下傳使用 函數類型,表示下載下傳視訊的函數 調用 ,将下載下傳視訊到目前目錄,儲存檔案名為 video_mediaId.mp4 |
CARD | 字元串類型,表示微信号 字元串類型,表示昵稱 字元串類型,表示别名 字元串類型,表示省 字元串類型,表示城市 字元串類型,表示性别,0-未知 1-男 2-女 字元串類型,表示注冊地 |
ANIMATION | 整數類型,表示表情高度 整數類型,表示表情寬度 |
FILE | 字元串類型,表示檔案名 字元串類型,表示 encry 檔案名 字元串類型,表示檔案大小,機關位元組 字元串類型,表示視訊多媒體 id,由系統配置設定,用于下載下傳使用 函數類型,表示下載下傳檔案的函數 調用 ,将下載下傳檔案到目前目錄,儲存檔案名為 ‘fileName’ 字段值 |
REVOKE | 字元串類型,表示被撤回的那條消息的 id |
UNSUPPORTED | 沒有可選字段 |
二、微信智能聊天
智能聊天機器人實作分為三個步驟:
-
從發送方接收消息
通過
子產品可以接收聯系人/群組/公衆号發來的文本/圖檔/語音/視訊/位置/表情/檔案等消息類型,不同消息類型能擷取到不同的消息内容webwx
-
生成智能聊天内容
通過
或emotibot
機器人,我們可以擷取智能聊天内容。首先在這些機器人網站上申請一個賬号,擷取 API_ID 或者 APP_KEY 等資訊,然後 POST 請求就可以擷取智能的聊天回複内容tuling
-
發送聊天内容到發送方
通過
子產品可以發送 文本、圖檔、視訊、普通檔案到聯系人/群組/公衆号webwx
下面是智能聊天的完整代碼:
對來自聯系人,備注名是張三,消息類型是普通文本的消息進行特定處理,通過
emotibot
或
tuling
機器人擷取聊天内容,然後發送回給張三,進而實作智能聊天
import json
import requests
import webwx
EMOTIBOT_API_ID = "xxx" # 申請的 API_ID
EMOTIBOT_API_URL = "http://idc.emotibot.com/api/ApiKey/openapi.php"
TULING_API_KEY = "xxx" # 申請的 API_KEY
TULING_API_URL = "http://openapi.tuling123.com/openapi/api/v2"
def emotibot(req_text):
params = {
"cmd": "chat",
"appid": EMOTIBOT_API_ID,
"userid": "xiaoming",
"text": req_text,
"location": "hangzhou"
}
resp = requests.request("post", EMOTIBOT_API_URL, params=params)
dic = json.loads(resp.text)
resp_text = dic["data"][0]["value"]
return resp_text
def tuling(req_text):
req = {
"reqType": 0,
"perception": {
"inputText": {
"text": req_text
},
"selfInfo": {
"location": {
"city": "hangzhou",
"province": "zhejiang",
"street": "dongxin street"
}
}
},
"userInfo": {
"apiKey": TULING_API_KEY,
"userId": "xiaoming"
}
}
resp = requests.request("post", TULING_API_URL, json=req)
dic = json.loads(resp.text)
resp_text = dic["results"][0]["values"]["text"]
return resp_text
def process_msg(self, msg):
if msg['senderType'] == 'CONTACT' and msg['contactRemarkName'] == u'張三' and msg['msgType'] == 'TEXT':
req_text = msg['content']
# resp_text = emotibot(req_text) # 使用 emotibot 機器人擷取聊天内容
resp_text = tuling(req_text) # 使用 tuling 機器人擷取聊天内容
self.send_text(resp_text, msg['senderName'])
if __name__ == '__main__':
weChat = webwx.webwx()
weChat.register_process_msg_func(process_msg)
weChat.login()
weChat.run()