微信公众号开发(Python)[3]

本文最后更新于 2024年1月13日 下午

解析微信事件XML数据消息及响应

目录

  1. 微信公众号开发(一)——申请微信公众号以及配置流程简介
  2. 微信公众号开发(二)——解析微信请求及响应消息
  3. 微信公众号开发(三)——解析微信事件XML数据消息及响应
  4. 微信公众号开发(四)——公众号按钮设置及自己的微信按钮编辑器
  5. 微信公众号开发(五)——微信网页授权获取用户openId

获取提交的XML数据内容并解析

由于 xml 数据是在 请求体里以post方式提交上来的,所以不能像获取基本参数那样使用 request.args 去获取了,这部分数据在请求体里面,要获取这部分数据需要使用 request.stream 方法去获取到里面的内容。 而这个得到的是一个输入流,那么问题就变成了如何从输入流中读取其字符串, 可以直接用lxml库进行解析

1
2
3
4
5
6
7
8
9
10
11
12
def handle_message():
# 处理接收到的用户消息,并做出相应的回复
# 这里需要根据接收到的 XML 消息格式来解析用户发送的消息,并进行逻辑处理
# 返回符合微信公众号消息格式的 XML 内容作为回复
xml = etree.fromstring(request.stream.read())

MsgType = xml.find("MsgType").text
ToUserName = xml.find("ToUserName").text
FromUserName = xml.find("FromUserName").text
CreateTime = xml.find("CreateTime").text
MsgId = xml.find("MsgId").text
...
参数 描述
ToUserName 开发者微信号
FromUserName 发送方账号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型:
event:事件
text:文本消息
image:图片消息
voice:语音消息
video:视频消息
shortvideo:小视频消息
location:地理位置消息
link:链接消息
MsgId 消息id
Event 事件类型
subscribe:关注事件. 特别的:如果未关注公众号用户扫描参数二维码关注, 也是使用此值,不过此时EventKey的值有前缀qrscene_
unsubscribe取消关注事件
SCAN: 扫描带参数二维码事件
LOCATION: 上报地理位置事件
CLICK: 自定义key按钮菜单事件
VIEW: 自定义view按钮菜单事件
MASSSENDJOBFINISH: 群发消息结果事件
TEMPLATESENDJOBFINISH: 发送模板消息结果事件
EventKey 事件关键值
MenuId 菜单按钮ID
Content 文本消息内容
PicUrl 图片消息的图片链接(由系统生成)
MediaId 消息媒体id,可以调用获取临时素材接口拉取数据。
Format 语音消息格式,如amr,speex等
Recognition 语音识别结果,UTF8编码
ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
Location_X 地理位置纬度
Location_Y 地理位置经度
Scale 地图缩放大小
Label 地理位置信息
Title 链接消息标题
Description 链接消息描述
Url 链接消息链接
Ticket 事件,二维码的ticket,可用来换取二维码图片
Latitude 事件,上报地理位置,地理位置纬度
Longitude 事件,上报地理位置,地理位置经度
Precision 事件,上报地理位置,地理位置精度

响应微信消息或事件

先简单的处理一下普通文本消息吧,不管用户向我们出了什么样内容的文本消息,我们都回复:然后捏?

首先判断消息的类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@app.route('/wechat', methods=['POST'])
def handle_message():
xml = etree.fromstring(request.stream.read())

MsgType = xml.find("MsgType").text
ToUserName = xml.find("ToUserName").text
FromUserName = xml.find("FromUserName").text
CreateTime = xml.find("CreateTime").text
MsgId = xml.find("MsgId").text

send = f'<xml><ToUserName><![CDATA[{FromUserName}]]></ToUserName>' \
f'<FromUserName><![CDATA[{ToUserName}]]></FromUserName>' \
f'<CreateTime>{str(int(time()))}</CreateTime>'
if 'text' == MsgType:
send += f'<MsgType><![CDATA[{MsgType}]]></MsgType>' \
f'<Content><![CDATA[欢迎关注Noobbei]]></Content></xml>'
else:
send = 'success'
response = make_response(send)
response.content_type = 'application/xml'
return response

微信公众号开发(Python)[3]
https://blog.noobbei.top/2024/01/13/微信公众号开发(三)/
作者
Godbei
发布于
2024年1月13日
更新于
2024年1月13日
许可协议