Python微信公众号开发(7)- 用户关注公众号的事件响应

今天主要来完善一下服务端用户消息处理程序。

0. 背景

之前解析并获取用户消息数据的代码:

def getUserMessageContentFromXML(xml_content):
    # 解析XML字符串
    root = ET.fromstring(xml_content)

    # 提取数据
    content = root.find('Content').text
    from_user_name = root.find('FromUserName').text
    to_user_name = root.find('ToUserName').text
    return content, from_user_name, to_user_name, msg_type

我们没有考虑消息类型。也就是下面xml消息中的MsgType字段:

<xml>
  <ToUserName>gh_fa8fa31e</ToUserName>
  <FromUserName>oNexy6R49UkCr1U</FromUserName>
  <CreateTime>1704424380</CreateTime>
  <MsgType>text</MsgType>
  <Content>test</Content>
  <MsgId>244099103</MsgId>
</xml>

这会导致一些消息处理时程序发生错误或崩溃:
在这里插入图片描述

要解决此问题很简单,只需要在解析xml时,判断一下消息类型为“text”,然后只处理text类型的消息即可。修复代码如下:

def getUserMessageContentFromXML(xml_content):
    # 解析XML字符串
    root = ET.fromstring(xml_content)

    # 提取数据
    msg_type = root.find('MsgType').text
    content = ""
    if (msg_type == 'text'):   # <-------这里
        content = root.find('Content').text  # <-------这里
    from_user_name = root.find('FromUserName').text
    to_user_name = root.find('ToUserName').text
    return content, from_user_name, to_user_name, msg_type

1. 事件类型的消息

除了“text”类型的消息,本文我们再来看下“event”消息类型。
“event”消息类型主要是在用户关注或取消关注微信公众号时触发的POST请求。
我们来看一下消息体:

  • 取消关注消息
    在这里插入图片描述
  • 关注消息:
    在这里插入图片描述
    可以看到,当用户关注时,MsgType为“event”类型,Event字段为“subscribe”,没有“Content”字段了。

2. 实现用户关注后的自动回复

看到了上面的消息类型和消息数据结构,想要实现“当用户关注公众号后,自动给用户发送一条欢迎消息、自我介绍消息、统计用户数量”等需求就非常容易了。话不多说,直接上修改后的代码:

## 定义的欢迎语,在用户关注公众号后,会立刻收到这一条回复
GL_CONST_WELCOME_TEXT = "你好,欢迎关注!希望我能帮到你,一起成长,持续提升!\n本站提供如下资料(持续增加中......): \
1. OpenAI GPT最佳实践教程资料,回复:GPT最佳实践 \
2. ChatGPT提示技巧指南,回复:gpt提示技巧 \
    如果无法获取,请联系vx:jasper_8017 \
"

def getUserMessageContentFromXML(xml_content):
    # 解析XML字符串
    root = ET.fromstring(xml_content)

    # 提取数据
    msg_type = root.find('MsgType').text # <----- 先提取消息类型
    if (msg_type == 'event'):  # <----- 根据消息类型获取字段
        content = root.find('Event').text
    elif (msg_type == 'text'):
        content = root.find('Content').text
    from_user_name = root.find('FromUserName').text
    to_user_name = root.find('ToUserName').text
    return content, from_user_name, to_user_name, msg_type

...... # 其余代码请参考之前文章,这里篇幅所限,不再赘述

@app.route('/wechatai', methods=['GET', 'POST']) 
def wechatai():
    if request.method == 'GET':
        return verify_wechat(request)
    else:
        # 处理POST请求
        print("user request data: ", request.data)
        printXML(request.data)
        # 解析用户信息
        user_message_content, from_user_name, to_user_name, msg_type = getUserMessageContentFromXML(request.data)
        print("user message content: ", user_message_content)
        
        response_content = ""
        if (msg_type == 'event'):
            if (user_message_content == 'subscribe'):
                response_content = GL_CONST_WELCOME_TEXT # 自定义的欢迎语,用户关注公众号后会立刻收到这一条回复消息
        elif (msg_type == 'text'):
            response_content = get_info_from_const_keywords(user_message_content)
            # None说明用户输入不是预设关键字,调用OpenAI API完成ChatGPT对话
            if (response_content is None): 
                # 调用OpenAI接口生成回复内容
                response_content = openai_test.get_chat_completion(user_message_content)
                print("response content: ", response_content)
        
        # 生成回复信息并返回
        return generate_response_xml(from_user_name, to_user_name, response_content)

看下效果:
在这里插入图片描述
可以看到当用户关注时,收到了咱们预设置的欢迎语。但是格式有点问题,没有换行。修改下欢迎语(在想换行的地方加 ‘\n’ 换行符即可):

GL_CONST_WELCOME_TEXT = "你好,欢迎关注!希望我能帮到你,一起成长,持续提升!\n本站提供如下资料(持续增加中......): \n \
1. OpenAI GPT最佳实践教程资料,回复:GPT最佳实践 \n \
2. ChatGPT提示技巧指南,回复:gpt提示技巧 \n \
    如果无法获取,请联系vx:jasper_8017 \n \
"

修改后效果如下:
在这里插入图片描述

3. 非编程方式实现用户关注的自动回复

【超详细!】Python微信公众号开发(5)- 无需编程,手把手带你轻松实现公众号自定义菜单和自动回复 一样,用户关注的自动回复也可以通过微信公众号后台中内置的配置来实现,配置页详见下图,可以去试一下。
在这里插入图片描述

注意:

  1. 要想使用此配置,也必须首先停用“服务器配置”
  2. 这个被关注回复能否与服务器配置共存,有兴趣的可以测试一下,我这里就不测了。不过我想应该无法共存,毕竟如果开了服务器配置,用户关注的消息是会被转发到咱们自己的服务器上的,微信自己的服务器就收不到这个消息了。

从今天开始,持续学习,开始搞事情。踩坑不易,欢迎关注我,围观我!
在这里插入图片描述

有任何问题,欢迎+vx:jasper_8017,我也是个小白,想与志同道合的朋友一起讨论,共同进步!

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

同学小张

如果觉得有帮助,欢迎给我鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值