我想让公众号后台接入一个机器人,采用python,Flask框架,其中main.py文件内容如下:
import time
from flask import Flask, make_response, request
import xml.etree.cElementTree as ET
import hashlib, requests
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World!"
@app.route('/wechat', methods=['GET', 'POST'])
def wechat(): # 1、 获取携带的 signature、timestamp、nonce、echostr
if request.method == 'GET':
signature = request.args.get("signature", "")
timestamp = request.args.get("timestamp", "")
nonce = request.args.get("nonce", "")
echostr = request.args.get("echostr", "")
print("原始:",signature, timestamp, nonce, echostr)
token = "wxtokenone" # 这里是你写的那个token值
data = [token, timestamp, nonce]
data.sort() # 3、三个参数拼接成一个字符串并进行sha1加密
temp = ''.join(data)
sha1 = hashlib.sha1(temp.encode('utf-8'))
hashcode = sha1.hexdigest()
print("新的:",hashcode) # 4、对比获取到的signature与根据上面token生成的hashcode,如果一致,则返回echostr,对接成功
if hashcode == signature:
return echostr
else:
return "error"
else:
xmlData = ET.fromstring(request.stream.read())
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
question = xmlData.find('Content').text
ToUserName = xmlData.find('ToUserName').text
FromUserName = xmlData.find('FromUserName').text
# Content = xmlData.find('Content').text
Content = generate_response(question)
reply = '''
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>
'''
response = make_response(reply % (FromUserName, ToUserName, str(int(time.time())), Content))
response.content_type = 'application/xml'
return response
def generate_response(question):
api_url = "http://【服务器IP】/generate"
headers = {'Content-Type': 'application/json'}
payload = {
"instruction": question,
"input": "",
"parameters": {
"top_p": 0.7,
"max_tokens": 256
}
}
response = requests.post(api_url, headers=headers, json=payload)
if response.status_code == 200:
result = response.json()
answer = result['generated_text']
return answer
else:
return "Sorry, an error occurred."
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8091, debug=True) # 这里开放8091端口
我在本地调试时,代码正常,使用了cpolar内网穿透工具,微信公众号中基本配置正常(成功),如图所示:
但是,当我把代码(服务)部署到阿里云服务器上,代码运行正常,如图:
并设置了一个域名,该域名通过浏览器(公网)、微信内都可以正常访问。但是在修改公众号的基本配置的时候却出现“token验证失败”。如图:
这个问题该怎么解决啊……已经搞一整天了,头都秃了,求大神指点迷津!
能不能收到请求