天天看點

python web微信應用(三) 微信智能聊天機器人前言一、webwx 子產品介紹二、微信智能聊天

文章目錄

  • 前言
  • 一、webwx 子產品介紹
  • 二、微信智能聊天

前言

本篇文章作為系列第三篇文章,将實作一個微信智能聊天機器人:

系列其它文章請參考:

python web微信應用(一) 微信協定分析

python web微信應用(二) webwx 子產品源碼

python web微信應用(四) 監測自己被群組消息 @

python web微信應用(五) 自動下載下傳接收的圖檔/語音/視訊

python web微信應用(六) 監測微信撤回的消息

一、webwx 子產品介紹

目前支援消息來源: 群組、公衆号、聯系人、自己

目前支援消息類型: 文本,位置,連結,圖檔,語音,視訊,名片,表情,檔案,撤回

不同消息類型所攜帶的字段也不同,具體如下:

類型 字段
必有字段

'senderType':

字元串類型,取值 “GROUP/SUBSCRIPTION/CONTACT/MYSELF/UNSUPPORTED”, 表示消息來源于群組/公衆号/聯系人/自己/不支援

'senderName':

字元串類型,表示發送者的身份,由系統配置設定,@@開頭表示群組,@開頭表示聯系人或者公衆号

'msgType':

字元串類型,取值 “TEXT/POSITION/IMAGE/VOICE/VIDEO/CARD/ANIMATION/FILE/REVOKE/UNSUPPORTED”, 表示消息類型是文本/位置/圖檔/語音/視訊/名片/表情/檔案/撤回/不支援

'msgId':

字元串類型,表示消息的唯一 id,由系統配置設定

senderType:

GROUP

'groupNickName':

字元串類型,表示發送者所在的群組昵稱

'userNickName':

字元串類型,表示發送者的昵稱

'userDisplayName'

: 字元串類型,表示發送者設定的自己在該群的顯示名稱,沒有則為 ‘’

'meIsAt':

布爾類型,表示自己是否被 @
SUBSCRIPTION

'subscriptionNickName':

字元串類型,表示發送者公衆号昵稱
CONTACT

'contactNickName':

字元串類型,表示發送者昵稱

'contactRemarkName':

字元串類型,表示發送者備注名
MYSELF

'myNickName':

字元串類型,表示自己的昵稱

msgType:

TEXT

'content':

字元串類型,表示接收到的消息内容
POSITION

'x':

字元串類型,浮點數,表示緯度

'y':

字元串類型,浮點數,表示經度

'scale':

字元串類型,整數,表示縮放比例

'label':

字元串類型,表示位置的标簽名稱

'poiname':

字元串類型,表示位置的具體名稱
IMAGE

'imgHeight':

整數類型,表示圖檔高度

'imgWidth':

整數類型,表示圖檔寬度

'mediaId':

字元串類型,表示圖檔在伺服器的資源 id,由系統配置設定,用于下載下傳使用

'downloadFunc':

函數類型,表示下載下傳圖檔的函數

調用

msg['downloadFunc'](msg)

,将下載下傳圖檔到目前目錄,儲存檔案名為 img_mediaId.jpg
VOICE

'voiceLength':

整數類型,表示語音時長,機關毫秒

'mediaId':

字元串類型,表示圖檔在伺服器的資源 id,由系統配置設定,用于下載下傳使用

'downloadFunc':

函數類型,表示下載下傳語音的函數

調用

msg['downloadFunc'](msg)

,将下載下傳語音到目前目錄,儲存檔案名為 voice_mediaId.mp3
VIDEO

'imgHeight':

整數類型,表示視訊高度

'imgWidth':

整數類型,表示視訊寬度

'playLength':

整數類型,表示視訊時長,機關秒

'mediaId':

字元串類型,表示視訊在伺服器的資源 id,由系統配置設定,用于下載下傳使用

'downloadFunc':

函數類型,表示下載下傳視訊的函數

調用

msg['downloadFunc'](msg)

,将下載下傳視訊到目前目錄,儲存檔案名為 video_mediaId.mp4
CARD

'username':

字元串類型,表示微信号

'nickname':

字元串類型,表示昵稱

'alias':

字元串類型,表示别名

'province':

字元串類型,表示省

'city':

字元串類型,表示城市

'sex':

字元串類型,表示性别,0-未知 1-男 2-女

'regionCode':

字元串類型,表示注冊地
ANIMATION

'imgHeight':

整數類型,表示表情高度

'imgWidth':

整數類型,表示表情寬度
FILE

'fileName':

字元串類型,表示檔案名

'encryFileName':

字元串類型,表示 encry 檔案名

'fileSize':

字元串類型,表示檔案大小,機關位元組

'mediaId':

字元串類型,表示視訊多媒體 id,由系統配置設定,用于下載下傳使用

'downloadFunc':

函數類型,表示下載下傳檔案的函數

調用

msg['downloadFunc'](msg)

,将下載下傳檔案到目前目錄,儲存檔案名為 ‘fileName’ 字段值
REVOKE

'revokedMsgId':

字元串類型,表示被撤回的那條消息的 id
UNSUPPORTED 沒有可選字段

二、微信智能聊天

智能聊天機器人實作分為三個步驟:

  1. 從發送方接收消息

    通過

    webwx

    子產品可以接收聯系人/群組/公衆号發來的文本/圖檔/語音/視訊/位置/表情/檔案等消息類型,不同消息類型能擷取到不同的消息内容
  2. 生成智能聊天内容

    通過

    emotibot

    tuling

    機器人,我們可以擷取智能聊天内容。首先在這些機器人網站上申請一個賬号,擷取 API_ID 或者 APP_KEY 等資訊,然後 POST 請求就可以擷取智能的聊天回複内容
  3. 發送聊天内容到發送方

    通過

    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()