公众号接入其他接口教程(附源码)
前置准备
一个域名
一台服务器
一个公众号
域名配置
在你的域名服务商新建二级域名并绑定服务器主机IP
服务器配置
上传下面的python文件到你的服务器,并修改代码段中相应位置代码(token、port)
python
import time
from flask import Flask,make_response,request
from flask import Flask, request
from flask_caching import Cache
import xml.etree.cElementTree as ET
import hashlib
import requests
import re
import os
import random
#请将您的微信 token 填入这里
my_wx_token = "***********" # 自定义字母和数字组合即可,后续需要填入公众号后台
app = Flask(__name__)
env_dist = os.environ
cache = Cache(app, config={'CACHE_TYPE': 'simple', "CACHE_DEFAULT_TIMEOUT": 30})
# 推荐答案阈值,假设推荐列表第一个 推荐值超过该阈值
PRED_TH = 0.9
# 推荐答案列表长度
PRED_LEN = 5
# 没有答案的回答
DEFAULT_ANSWER = [
"我的知识库见底了^_^, 您可以换个问题试试",
"恭喜您触发彩蛋答案, 请把问题描述的更详细点吧",
"您的问题竟然把我难住了...有意思...",
"哼,再这么问, 我就生气啦",
"我不服, 再来!",
]
ANSWER_TYPE_MAP = {
"0": "网上办事",
"2": "办事指南",
"3": "一件事"
}
@app.route('/test',methods=['GET','POST'])
def wechat():
signature = request.args.get("signature", "")
timestamp= request.args.get("timestamp", "")
nonce= request.args.get("nonce", "")
echostr= request.args.get("echostr", "")
token=my_wx_token
data =[token, timestamp, nonce]
data.sort()
temp = ''.join(data)
sha1 = hashlib.sha1(temp.encode('utf-8'))
hashcode=sha1.hexdigest()
if hashcode == signature:
if request.method == 'GET':
return echostr
else:
return "error-return\r\n"
xmlData = ET.fromstring(request.stream.read())
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
ToUserName = xmlData.find('ToUserName').text
FromUserName = xmlData.find('FromUserName').text
CreateTime = xmlData.find('CreateTime').text
return generate_response_xml(FromUserName, ToUserName, xmlData.find('Content').text)
return echostr
def text_reply(FromUserName, ToUserName, output_content):
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())), output_content))
response.content_type = 'application/xml'
return response
def imgtext_reply(FromUserName, ToUserName, title="测试图文标题", desc="描述", picurl="http://***********:8082/test.png", url="http://**************:8082/"):
reply = f'''
<xml>
<ToUserName><![CDATA[{FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{ToUserName}]]></FromUserName>
<CreateTime>{str(int(time.time()))}</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[{title}]]></Title>
<Description><![CDATA[{desc}]]></Description>
<PicUrl><![CDATA[{picurl}]]></PicUrl>
<Url><![CDATA[{url}]]></Url>
</item>
</Articles>
</xml>
'''
response = make_response(reply)
response.content_type = 'application/xml'
return response
def generate_response_xml(FromUserName, ToUserName, input_content):
imgtext = False
if input_content.endswith(' 图文'):
imgtext = True
input_content = input_content[:-3]
output_list = generate_response(input_content)
# print('问题:', input_content)
first_item = output_list[0]
if output_list and imgtext:
# 测试图文消息
answer = first_item['answer']
title = first_item['title']
url = f"<a href='http://************:8082/intelligentCustomer/ics?q={title}' target='_blank'>{title}</a>"
if answer.startswith('<a'):
obj = re.match(r"<a.*href=[\'\"]{1}(.*)[\'\"]{1}.*target=.*", answer)
answer = "点击查看详情"
if obj:
url = obj.group(1)
return imgtext_reply(FromUserName, ToUserName, title=title, desc=answer , url = url)
output_content = random.choice(DEFAULT_ANSWER)
if output_list:
output_content = ""
pred_title = "您是否想问:"
start_index = 0
end_index = PRED_LEN
pred = round(float(first_item['pred']),3)
if pred >= PRED_TH:
# 第一个答案推荐值大于阈值,将作为最佳答案
answer = first_item['answer']
title = first_item['title']
answer_type = ANSWER_TYPE_MAP.get(first_item['type'], "网上办事")
output_content = f"为您匹配:【{answer_type}】{title}\n【参考回答】:{answer}"
start_index += 1
end_index += 1
pred_title = "\n\n您可能还想问:"
i = 0
for item in output_list[start_index:end_index]:
if i==0:
output_content += pred_title
i+=1
item_type = ANSWER_TYPE_MAP.get(item['type'], "网上办事")
item_title = item['title']
item_answer = item['answer']
item_pred = round(float(item['pred']),3) * 100
if not item_answer.startswith('<a'):
# 如果answer 不是一个链接,将title变成链接,扔给原来的页面做回答逻辑
item_answer = f"<a href='http://************:8082/intelligentCustomer/ics?q={item_title}' target='_blank'>{item_title}</a>"
output_content += f"\n【{item_type}】{item_answer}"
# print("答案: ", output_content)
return text_reply(FromUserName, ToUserName, output_content)
outofsevice_txt = ""
@cache.memoize(timeout=60)
def generate_response(prompt):
payload = {
"content": prompt
}
res = requests.post('http://***********:8082/faqsearch/FAQ',json=payload)
data = res.json().get("data", {})
if data == "":
data = {}
return data.get("result", {}).get("recall_rank", [])
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5050, debug=False)#开放xxxx端口