微信公众号接入其他接口教程(附python源码)

公众号接入其他接口教程(附源码)

文章来源微信公众号:NLP随手记

前置准备

一个域名

一台服务器

一个公众号

域名配置

在你的域名服务商新建二级域名并绑定服务器主机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端口

具体参考来源,请点击此处

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云天徽上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值