【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月前
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
1月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
1月前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
2月前
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
991 11
技术小白如何利用DeepSeek半小时开发微信小程序?
|
2月前
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
393 11
|
5月前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
420 61
自动化微信朋友圈:Python脚本实现自动发布动态
|
3月前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
3326 15
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
2月前
|
Python
使用 Python 合并微信与支付宝账单,生成财务报告
这篇博客介绍了如何使用 Python 脚本合并微信与支付宝账单数据,生成自动化财务报告。通过 pandas 库,学习如何清洗、合并和分析账单数据,以及如何生成 Markdown 格式的财务报告。
|
3月前
|
JSON 缓存 小程序
微信小程序组件封装与复用:提升开发效率
本文深入探讨了微信小程序的组件封装与复用,涵盖组件的意义、创建步骤、属性与事件处理,并通过自定义弹窗组件的案例详细说明。组件封装能提高代码复用性、开发效率和可维护性,确保UI一致性。掌握这些技能有助于构建更高质量的小程序。
|
4月前
|
机器人 API 语音技术
企业微信接收语音消息并自动回复
本文介绍如何在企业微信中通过应用机器人实现语音消息的自动回复。具体步骤包括:创建企业微信应用,获取AgentID和Secret;使用AppFlow模版创建连接流并配置鉴权凭证;选择语音识别模型和大模型应用(如通义系列)进行自动回复;配置企业微信应用接收消息API及可信IP;最后测试应用功能。通过这些步骤,用户可以高效地利用大模型技术提升企业微信的使用体验。