最近在微信公众号做了一个自动回复的程序,主要功能是cpu性能查询与对比,数据有限,只能对比个跑分,但是对有些人来说也是有点用的,生成的对比图可以直观的看到两个cpu的大概性能差距。
本文介绍如何实现的微信自动回复,并给出实现的代码。
消息的接收:
首先需要有个服务器,用来接收消息,不要求是公网服务器,只要通过外网的某个端口能访问就可以,也可以是家用网直接用ip,也可以使用动态域名。
然后本文使用的是Python,需要提前安装Python,需要安装flask等组件,使用pip install flask安装即可。
代码实现:
from flask import Flask, request, make_response # 导入 Flask 框架的核心模块和其他必要的模块
import xml.etree.ElementTree as ET # 导入 XML 解析库
import hashlib # 导入哈希算法库
import os # 导入操作系统接口库
import time # 导入 time 模块
app = Flask(__name__) # 创建 Flask 应用实例
# 微信配置
#WECHAT_TOKEN = os.environ.get('WECHAT_TOKEN') # 从环境变量中获取微信 Token,用于验证请求的有效性
WECHAT_TOKEN = "aaaaaabbbbbbcccccc" #这个地方修改token
# 签名验证函数
def verify_signature(signature, timestamp, nonce):
# 将传入的参数排序
sorted_params = sorted([WECHAT_TOKEN, timestamp, nonce])
# 将排序后的参数拼接成一个字符串
concatenated_string = ''.join(sorted_params)
# 对字符串进行 SHA1 哈希运算
hash_object = hashlib.sha1(concatenated_string.encode('utf-8'))
# 获取哈希值
calculated_signature = hash_object.hexdigest()
# 比较传入的签名和计算得到的签名是否一致
return calculated_signature == signature
# 组装返回的 XML 格式消息
def create_response_xml(to_user, from_user, create_time, content):
# 定义 XML 模板
template = """
<xml>
<ToUserName><![CDATA[{to_user}]]></ToUserName>
<FromUserName><![CDATA[{from_user}]]></FromUserName>
<CreateTime>{create_time}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{content}]]></Content>
<FuncFlag>0</FuncFlag>
</xml>
"""
# 使用模板格式化参数,生成 XML 字符串
return template.format(to_user=to_user, from_user=from_user, create_time=create_time, content=content)
# Flask 路由处理器
@app.route('/wechat', methods=['GET', 'POST'])
def wechat():
if request.method == 'GET':
# GET 请求用于验证服务器是否可用,微信平台会发送一个签名、时间戳、随机数和回显串
signature = request.args.get('signature', '') # 获取签名
timestamp = request.args.get('timestamp', '') # 获取时间戳
nonce = request.args.get('nonce', '') # 获取随机数
echostr = request.args.get('echostr', '') # 获取回显串
# 验证签名是否正确
if verify_signature(signature, timestamp, nonce):
# 如果签名正确,返回回显串,表示验证通过
return make_response(echostr)
# 如果签名不正确,返回错误信息和状态码
return make_response("Invalid signature"), 403
elif request.method == 'POST':
# POST 请求用于处理来自微信的消息
xml_data = request.data.decode('utf-8') # 解码接收到的数据
root = ET.fromstring(xml_data) # 解析 XML 数据
# 提取 XML 中的信息
msg_type = root.find('MsgType').text # 消息类型
content = root.find('Content').text # 消息内容
user_id = root.find('FromUserName').text # 发送方的微信用户名
from_user = root.find('ToUserName').text # 接收方的微信用户名(通常是公众号的微信号)
if msg_type == 'text':
# 如果是文本消息,构造回复内容
reply_content = f"您发送的消息是:{content}"
create_time = int(time.time()) # 获取当前时间戳
# 生成 XML 格式的回复消息
response_xml = create_response_xml(user_id, from_user, create_time, reply_content)
# 返回 XML 格式的响应
return make_response(response_xml)
# 如果不是文本消息,返回提示信息
return make_response("仅支持文本消息")
# 当脚本直接运行时启动 Flask 应用
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=True) # 启动 Flask 应用,监听所有 IP 地址,端口 5001,开启调试模式
以上代码仅包含简单的回复逻辑,微信端发送消息"****",回复"您发送的消息是:****"。需要增加逻辑就自行添加,我做的功能是查询cpu,是连接了数据库,并且写了很多查询逻辑的。这个地方仅演示了如何接收消息,如何回复回去。
消息的发送:
测试可以用测试号:
去微信公众平台申请测试号,很简单就能申请。
配置上接受消息的服务器的地址URL和token
关注这个测试号,微信就可以直接用手机发消息测试了
效果如下:
本地调试:
测试前准备
安装 Flask: 确保你已经安装了 Flask。如果没有安装,可以使用 pip 安装:
pip install Flask
环境变量设置: 确保 WECHAT_TOKEN
环境变量已设置。你可以通过命令行临时设置这个环境变量,或者将其设置为系统的环境变量。
export WECHAT_TOKEN=your_token_here
测试 GET 请求
启动应用: 在终端运行代码:
python your_script.py
你应该看到类似这样的输出,表示应用正在运行:
Running on http://0.0.0.0:5001/
Debug mode: on
发送 GET 请求: 使用浏览器或者 curl 工具向你的应用发送 GET 请求。例如,使用 curl:
curl -G http://localhost:5001/wechat -d 'signature=signature_value' -d 'timestamp=timestamp_value' -d 'nonce=nonce_value' -d 'echostr=echostr_value'
替换 signature_value
, timestamp_value
, nonce_value
, 和 echostr_value
为实际的值。如果签名验证通过,你应该能看到返回的 echostr_value
。
测试 POST 请求
模拟 POST 请求: 你可以使用 Postman 或者 curl 来发送 POST 请求。下面是一个 curl 示例:
curl -X POST -d "<xml><ToUserName><![CDATA[toUser]]></CDATA></ToUserName><FromUserName><![CDATA[fromUser]]></CDATA></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></CDATA></MsgType><Content><![CDATA[this is a test]]></CDATA></Content><MsgId>1234567890123456</MsgId></xml>" http://localhost:5001/wechat
这将发送一个 XML 格式的 POST 请求,如果一切正常,你应该会看到类似这样的响应:
<xml>
<ToUserName><![CDATA[fromUser]]></ToUserName>
<FromUserName><![CDATA[toUser]]></FromUserName>
<CreateTime>1234567890</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[您发送的消息是:this is a test]]></Content>
<FuncFlag>0</FuncFlag>
</xml>
注意事项
确保
WECHAT_TOKEN
的值与微信开发者平台中设置的一致。测试时使用的
signature
,timestamp
,nonce
值应该符合微信服务器的要求。如果你在开发过程中遇到任何问题,检查控制台输出的日志信息,看看是否有异常信息提示。
评论区