使用Python进行微信公众号开发(二)接收消息

写在前面

《使用Python进行微信公众号开发》系列文章将与大家分享如何使用Python一步步搭建微信公众号后台服务器。

效果体验

扫码“是雯子吖”公众号进行体验

是雯子吖

配置自己的公众号后台进行体验

想要体验效果的小伙伴可以将微信公众号后台的 开发-> 基本配置 -> 服务器配置 中的Token随意配置,服务器地址配置为 https://apit.toodo.fun/wechatMP/ + Token,如

Token = hello  # 可随意设置,但是要保证与服务器地址最后一项相同
服务器地址:https://apit.toodo.fun/wechatMP/hello
消息加解密方式:明文模式或者兼容模式

如果配置成功的话,新关注你公众号的用户将会收到“Hi~ 终于等到你”,并且收到消息后会由我服务器上的机器人自动回复。

项目地址

GitHub:https://github.com/MR5356/toodoWechat

接收消息

微信用户向公众号发消息时,服务器会收到一个内容为XML数据的POST请求,服务器需要在5秒内做出回应,如果5秒内无法做出回应,可直接回复空串,否则微信将发起重试,总计三次。各类型的消息XML数据包结构如下:

消息类型

所有类型的消息都包含以下内容

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgId消息id,64位整型

文本消息

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType消息类型,文本为text
Content文本消息内容

图片消息

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
  <PicUrl><![CDATA[this is a url]]></PicUrl>
  <MediaId><![CDATA[media_id]]></MediaId>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType消息类型,图片为image
PicUrl图片链接(由系统生成)
MediaId图片消息媒体id,可以调用获取临时素材接口拉取数据。

语音消息

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1357290913</CreateTime>
  <MsgType><![CDATA[voice]]></MsgType>
  <MediaId><![CDATA[media_id]]></MediaId>
  <Format><![CDATA[Format]]></Format>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType语音为voice
MediaId语音消息媒体id,可以调用获取临时素材接口拉取数据。
Format语音格式,如amr,speex等
Recognition语音识别结果,需开启语音识别功能

视频消息

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1357290913</CreateTime>
  <MsgType><![CDATA[video]]></MsgType>
  <MediaId><![CDATA[media_id]]></MediaId>
  <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType视频为video
MediaId视频消息媒体id,可以调用获取临时素材接口拉取数据。
ThumbMediaId视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

小视频消息

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1357290913</CreateTime>
  <MsgType><![CDATA[shortvideo]]></MsgType>
  <MediaId><![CDATA[media_id]]></MediaId>
  <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType小视频为shortvideo
MediaId视频消息媒体id,可以调用获取临时素材接口拉取数据。
ThumbMediaId视频消息缩略图的媒体id,可以调用获取临时素材接口拉取数据。

位置信息

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1351776360</CreateTime>
  <MsgType><![CDATA[location]]></MsgType>
  <Location_X>23.134521</Location_X>
  <Location_Y>113.358803</Location_Y>
  <Scale>20</Scale>
  <Label><![CDATA[位置信息]]></Label>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType消息类型,地理位置为location
Location_X地理位置纬度
Location_Y地理位置经度
Scale地图缩放大小
Label地理位置信息

链接消息(个人微信公众号不用考虑)

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1351776360</CreateTime>
  <MsgType><![CDATA[link]]></MsgType>
  <Title><![CDATA[公众平台官网链接]]></Title>
  <Description><![CDATA[公众平台官网链接]]></Description>
  <Url><![CDATA[url]]></Url>
  <MsgId>1234567890123456</MsgId>
</xml>
参数描述
MsgType消息类型,链接为link
Title消息标题
Description消息描述
Url消息链接

代码片段

因为微信发送给服务器的是XML数据包,我们需要对数据进行解析,在Python当中,我们可以使用xmltodict函数包将xml数据包转换为字典。

msg = xmltodict.parse(request.data).get('xml')

我们可以根据xml数据中的MsgType参数来判断消息的类型

msgType = msg.get('MsgType')
if msgType == 'text':
    print('这是文字消息')
if msgType == 'image':
    print('这是图片消息')
......

本小节完整代码

from WechatMP import WechatMP
import xmltodict

app = Flask(__name__)
Token = ''
appId = ''
secret = ''
wmp = WechatMP(Token=Token, appId=appId, secret=secret)


@app.before_request
def checkSignature():
    signature = request.values.get('signature')
    timestamp = request.values.get('timestamp')
    nonce = request.values.get('nonce')
    echostr = request.values.get('echostr')  # 仅在验证服务器时使用次参数
    if not wmp.checkSignature(timestamp=timestamp, nonce=nonce, signature=signature):
        abort(404)
    if echostr:
        return echostr


@app.route('/')
def main():
    msg = xmltodict.parse(request.data).get('xml')
    msgType = msg.get('MsgType')
    res = wmp.replyText(msg, 'Hi~ 终于等到你啦')
    if msgType == 'text':
        res = wmp.replyText(msg, msg.get('Content'))
    if msgType == 'image':
        res = wmp.replyImage(msg, msg.get('MediaId'))
    return xmltodict.unparse(res)


if __name__ == '__main__':
    app.run(port=8001)

系列文章

使用Python进行微信公众号开发(一)服务器对接:https://blog.csdn.net/m0_49475727/article/details/115236330

参考文档

开发者文档-接收普通消息:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html

下面是我自己运营的微信小程序“但行趣事”和公众号“微电脑”,更多的技术文章以及视频我会放到小程序和公众号当中,有志同道合的小伙伴也可以在小程序(联系客服按钮)或者公众号(直接留言)当中联系我们

但行趣事小程序
微电脑公众号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我雯子小姐的小爷

是雯子吖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值