【Python+微信】【企业微信开发入坑指北】1. 数据链路打通:接收用户消息处理并回复

简介: 【Python+微信】【企业微信开发入坑指北】1. 数据链路打通:接收用户消息处理并回复
  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:


上篇文章我们将企业微信自建应用与我们自己的服务器连接起来了,下面进行第二步,接收用户消息处理,并回复。

类比公众号开发的这篇文章,打通数据链路:【超详细!】Python微信公众号开发(2)

还是采用Flask框架。

0. 接收与被动回复消息的格式

0.1 消息格式(以文本消息为例)

看下官方文档:https://developer.work.weixin.qq.com/document/path/96466

0.1.1 接收消息格式

0.1.2 回复消息格式

接收到的消息格式为xml格式,回复内容的格式也是xml格式。

这里接收到的xml格式的内容和发送出去的xml格式的内容都是需要加密的,所以在接收到之后和回复消息之前都应该进行解密和加密处理。

该功能的限制,与微信公众号一样,也是只有5s的响应时间,总共重试三次:

了解了基本内容之后,我们开始编写代码

1. 编写代码

1.1 入口的处理

@app.route('/company_wechat', methods=['GET', 'POST']) 
def company_wechat():
    if request.method == 'GET':
        return signature(request, 0)
    else:
        print("收到请求......")
        return handle_user_message(request, 0)

如果是GET请求,就去校验是否是微信消息。

如果是POST请求,就进行相应处理并给出回复。

1.2 解密接收到的消息内容

上面提到了,企业微信服务转发过来的消息是经过加密的,需要我们自己解密。

原始发过来的消息示例如下:

解密代码:

user_message = request.data
msg_signature = request.args.get('msg_signature', '')
timestamp = request.args.get('timestamp', '')
nonce = request.args.get('nonce', '')
ret, sMsg = qy_api[i].DecryptMsg(user_message.decode('utf-8'), msg_signature, timestamp, nonce)
decrypt_data = {}
for node in list(fromstring(sMsg.decode('utf-8'))):
    decrypt_data[node.tag] = node.text
print(decrypt_data)

解密完之后的消息内容:

1.3 对消息内容进行处理,并封装回复的消息体

得到明文的消息内容之后,我们就可以对其进行相应的处理,并给出回复了。

示例代码如下,如果用户发过来一个“我帅吗”,就给用户回复一个“帅得一逼”

# 处理文本消息
if decrypt_data.get('Content', '') == '我帅吗':
    sRespData = """<xml>
        <ToUserName>{to_username}</ToUserName>
        <FromUserName>{from_username}</FromUserName> 
        <CreateTime>{create_time}</CreateTime>
        <MsgType>text</MsgType>
        <Content>{content}</Content>
        </xml>
        """.format(to_username=decrypt_data['ToUserName'],
                from_username=decrypt_data['FromUserName'],
                create_time=decrypt_data['CreateTime'],
                content="帅得一逼",)

最后,封装完之后不要忘了加密:

ret, send_msg = qy_api[i].EncryptMsg(sReplyMsg=sRespData, sNonce=nonce)
if ret == 0:
    return send_msg
else:
    print(send_msg)

1.4 运行效果

成功!

2. 完整代码

参考:https://gist.github.com/GentleCP/5d02f4e84b8c8905bcf67643223cd499

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request, make_response
from company_wechat_verify.WXBizMsgCrypt3 import WXBizMsgCrypt
from xml.etree.ElementTree import fromstring
app = Flask(__name__)
import xml.etree.ElementTree as ET   
def printXML(xml_content):
    # 创建XML元素
    element = ET.XML(xml_content)
    # 使用indent()函数进行格式化打印
    ET.indent(element)
    print(ET.tostring(element, encoding='unicode'))
qy_api = [
    WXBizMsgCrypt("xxx", "xxx", "xxx"), 
] #对应接受消息回调模式中的token,EncodingAESKey 和 企业信息中的企业id
# 开启消息接受模式时验证接口连通性
def signature(request, i): 
    msg_signature = request.args.get('msg_signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    echo_str = request.args.get('echostr', '')
    ret,sEchoStr=qy_api[i].VerifyURL(msg_signature, timestamp, nonce, echo_str)
    if (ret != 0):
        print("ERR: VerifyURL ret: " + str(ret))
        return("failed")
    else:
        return(sEchoStr)
def handle_user_message(request, i):
    '''
    接收用户消息,可进行被动响应
    '''
    user_message = request.data
    printXML(user_message)
    msg_signature = request.args.get('msg_signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    ret, sMsg = qy_api[i].DecryptMsg(user_message.decode('utf-8'), msg_signature, timestamp, nonce)
    decrypt_data = {}
    for node in list(fromstring(sMsg.decode('utf-8'))):
        decrypt_data[node.tag] = node.text
    # 解析后得到的decrypt_data: {"ToUserName":"企业号", "FromUserName":"发送者用户名", "CreateTime":"发送时间", "Content":"用户发送的内容", "MsgId":"唯一id,需要针对此id做出响应", "AagentID": "应用id"}
    # 用户应根据Content的内容自定义要做出的行为,包括响应返回数据,如下例子,如果发送的是123,就返回hello world
    print(decrypt_data)
            
    # 处理文本消息
    if decrypt_data.get('Content', '') == '我帅吗':
        sRespData = """<xml>
            <ToUserName>{to_username}</ToUserName>
            <FromUserName>{from_username}</FromUserName> 
            <CreateTime>{create_time}</CreateTime>
            <MsgType>text</MsgType>
            <Content>{content}</Content>
            </xml>
            """.format(to_username=decrypt_data['ToUserName'],
                    from_username=decrypt_data['FromUserName'],
                    create_time=decrypt_data['CreateTime'],
                    content="帅得一逼",)
            
    ret, send_msg = qy_api[i].EncryptMsg(sReplyMsg=sRespData, sNonce=nonce)
    if ret == 0:
        return send_msg
    else:
        print(send_msg)
@app.route('/company_wechat', methods=['GET', 'POST']) 
def company_wechat():
    if request.method == 'GET':
        return signature(request, 0)
    else:
        print("收到请求......")
        return handle_user_message(request, 0)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

3. 遇到的坑

其实也不能算是坑,应该算是惊吓。

刚开始没看具体发来的消息是什么,只是在收到请求的时候打了一行日志,结果… 发现一直在收到请求,着实吓到我了,不得不关了服务… 。

原本以为这是回复失败的尝试,但说明文档中说了只会重试3次,这里这么多请求,都是什么?

它其实是 Location 类型的消息,基本1s一次。

有这个消息的原因,是我在API接收消息是,勾选了 上报地理位置,并且在手机上,开启了位置权限。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是 同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:

相关文章
|
3月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
2月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
10天前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
136 7
|
21天前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
2月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
3月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
2月前
|
算法 程序员 API
电商程序猿开发实录:淘宝商品python(2)
本文分享了开发者在对接淘宝商品详情API过程中的真实经历,涵盖权限申请、签名验证、限流控制、数据解析及消息订阅等关键环节,提供了实用的Python代码示例,帮助开发者高效调用API,提升系统稳定性与数据处理能力。
|
3月前
|
数据采集 存储 数据库
Python爬虫开发:Cookie池与定期清除的代码实现
Python爬虫开发:Cookie池与定期清除的代码实现
|
4月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
351 1
|
4月前
|
存储 算法 数据可视化
用Python开发猜数字游戏:从零开始的手把手教程
猜数字游戏是编程入门经典项目,涵盖变量、循环、条件判断等核心概念。玩家通过输入猜测电脑生成的随机数,程序给出提示直至猜中。项目从基础实现到功能扩展,逐步提升难度,适合各阶段Python学习者。
206 0

热门文章

最新文章

推荐镜像

更多