剛剛建立這個公衆號的時候,個人一個同事就找個人公衆號聊天,可是那個時候個人公衆號仍是僅支持根據關鍵詞,若是要作到支持智能回覆,那基本上就是不可能。而後我結合我以前作的微信自動回覆機器人的經歷,我首先就想到了圖靈機器人。是否是能夠把圖靈機器人和微信公衆號進行鏈接呢?因而我開始查看html
圖靈機器人的接口文檔python
微信公衆號web
發現其實只要咱們擁有一個公網的web服務器地址,微信公衆號和web服務器進行通訊,咱們對接收的微信公衆號消息進行解析轉發給圖靈機器人,圖靈機器人根據咱們請求的內容返回對應的回覆,咱們再將回復返回給微信公衆號便可。整個流程以下: json
首先咱們須要搭建一個web服務器用於接收微信公衆號的請求,咱們能夠經過flask進行搭建。flask
在pycharm中中新建一個工程和main.py文件,輸入以下內容:api
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0')
複製代碼
運行成功後,你能夠在瀏覽器上訪問本身的服務器 瀏覽器
接下來咱們須要將這個服務器映射到公網上獲取一個公網url,我這邊使用的ngrok,將下載的exe文件打開後,輸入「ngrok http 80」,就出現一個公網映射地址以下圖:服務器
將紅色框標註的地址拷貝到微信公衆號的開發-基本配置-服務器配置的服務器地址(此時不要點擊保存,由於咱們須要對字段信息進行處理,否者是不會校驗經過的)微信
查看微信公衆號的開發手冊,能夠了解到信息處理流程。app
# -*- coding:utf-8 -*-
from flask import Flask
from flask import request
import hashlib
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World!"
@app.route("/wechat", methods=["GET","POST"])
def weixin():
if request.method == "GET": # 判斷請求方式是GET請求
my_signature = request.args.get('signature') # 獲取攜帶的signature參數
my_timestamp = request.args.get('timestamp') # 獲取攜帶的timestamp參數
my_nonce = request.args.get('nonce') # 獲取攜帶的nonce參數
my_echostr = request.args.get('echostr') # 獲取攜帶的echostr參數
token = 'Your token' # 必定要跟剛剛填寫的token一致
# 進行字典排序
data = [token,my_timestamp ,my_nonce ]
data.sort()
# 拼接成字符串,進行hash加密時須要爲字符串類型
temp = ''.join(data)
#建立一個hash對象
s = hashlib.sha1()
#對建立的hash對象更新須要加密的字符串
s.update(data.encode("utf-8"))
#加密處理
mysignature = s.hexdigest()
# 加密後的字符串可與signature對比,標識該請求來源於微信
if my_signature == mysignature:
return my_echostr
else:
return ""
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
複製代碼
再次運行程序,此時再在微信公衆號的配置頁面點擊提交能夠看到提交成功的提示信息。而後再咱們的ngrok上能夠看到200 OK的GET鏈接信息
剛剛咱們在程序中判斷了一個GET的鏈接信息就是進行通訊認證的程序,若鏈接信息是一個POST請求那即是咱們公衆號的轉發信息了。接下來咱們須要對這個POST信息進行處理,提取出消息內容轉發給圖靈機器人便可。
# -*- coding:utf-8 -*-
from flask import Flask
from flask import request
import hashlib
import tyuling_replay
import time
import re
import ReplayFromExcel
import xml.etree.ElementTree as ET
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World!"
@app.route("/wechat", methods=["GET","POST"])
def weixin():
if request.method == "GET": # 判斷請求方式是GET請求
my_signature = request.args.get('signature') # 獲取攜帶的signature參數
my_timestamp = request.args.get('timestamp') # 獲取攜帶的timestamp參數
my_nonce = request.args.get('nonce') # 獲取攜帶的nonce參數
my_echostr = request.args.get('echostr') # 獲取攜帶的echostr參數
# my_token = request.args.get('token')
print(my_signature)
print(my_timestamp)
print(my_nonce)
print(my_echostr)
# print(my_token)
token = '123456' # 必定要跟剛剛填寫的token一致
# 進行字典排序
data = [token,my_timestamp ,my_nonce ]
data.sort()
# 拼接成字符串,進行hash加密時需爲字符串
data = ''.join(data)
#建立一個hash對象
s = hashlib.sha1()
#對建立的hash對象更新須要加密的字符串
s.update(data.encode("utf-8"))
#加密處理
mysignature = s.hexdigest()
print("handle/GET func: mysignature, my_signature: ", mysignature, my_signature)
# 加密後的字符串可與signature對比,標識該請求來源於微信
if my_signature == mysignature:
return my_echostr
else:
return ""
else:
# 解析xml
xml = ET.fromstring(request.data)
toUser = xml.find('ToUserName').text
fromUser = xml.find('FromUserName').text
msgType = xml.find("MsgType").text
createTime = xml.find("CreateTime")
# 判斷類型並回復
if msgType == "text":
content = xml.find('Content').text
#根據公衆號粉絲的ID生成符合要求的圖靈機器人userid
if len(fromUser)>31:
tuling_userid = str(fromUser[0:30])
else:
tuling_userid = str(fromUser)
tuling_userid=re.sub(r'[^A-Za-z0-9]+', '', tuling_userid)
#調用圖靈機器人API返回圖靈機器人返回的結果
tuling_replay_text = tyuling_replay.get_message(content,tuling_userid)
return reply_text(fromUser, toUser, tuling_replay_text)
else:
return reply_text(fromUser, toUser, "我只懂文字")
def reply_text(to_user, from_user, content):
""" 以文本類型的方式回覆請求 """
return """ <xml> <ToUserName><![CDATA[{}]]></ToUserName> <FromUserName><![CDATA[{}]]></FromUserName> <CreateTime>{}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{}]]></Content> </xml> """.format(to_user, from_user, int(time.time() * 1000), content)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
複製代碼
咱們將圖靈機器人的調用封裝在一個tyuling_replay模塊中,具體內容以下:
import json
import urllib.request
tuling_key='圖靈機器人的APIkey'
api_url = "http://openapi.tuling123.com/openapi/api/v2"
def get_message(message,userid):
req = {
"perception":
{
"inputText":
{
"text": message
},
"selfInfo":
{
"location":
{
"city": "",
"province": "",
"street": ""
}
}
},
"userInfo":
{
"apiKey": tuling_key,
"userId": userid
}
}
req = json.dumps(req).encode('utf8')
http_post = urllib.request.Request(api_url, data=req, headers={'content-type': 'application/json'})
response = urllib.request.urlopen(http_post)
response_str = response.read().decode('utf8')
response_dic = json.loads(response_str)
results_code = response_dic['intent']['code']
print(results_code)
if results_code == 4003:
results_text = "4003:%s"%response_dic['results'][0]['values']['text']
else:
results_text = response_dic['results'][0]['values']['text']
return results_text
複製代碼
詳細的內容能夠參考圖靈機器人的API接入文檔。
至此,咱們的微信公衆號自動回覆機器人就作好了,可是免費版的圖靈機器人天天的調用次數也是有限,如何完全解決這個問題呢?咱們後續再講咱們的方法。
關注微信公衆號「菜鳥小白的學習分享」回覆「101」獲取微信公衆號自動回覆機器人源碼哦。
關注微信公衆號——菜鳥小白的學習分享 媽媽不再用擔憂我找不到路了