侧边栏壁纸
  • 累计撰写 54 篇文章
  • 累计创建 31 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

技术分享-使用Python实现微信自动回复

nankle
2024-09-21 / 0 评论 / 0 点赞 / 11 阅读 / 7399 字
温馨提示:
本文最后更新于 2024-09-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

最近在微信公众号做了一个自动回复的程序,主要功能是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

关注这个测试号,微信就可以直接用手机发消息测试了

效果如下:

Screenshot_2024-09-21-21-21-39-926_com.tencent.mm-edit.jpg

本地调试:

测试前准备

安装 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 值应该符合微信服务器的要求。

  • 如果你在开发过程中遇到任何问题,检查控制台输出的日志信息,看看是否有异常信息提示。

0

评论区