今天主要来完善一下服务端用户消息处理程序。
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)- 无需编程,手把手带你轻松实现公众号自定义菜单和自动回复 一样,用户关注的自动回复也可以通过微信公众号后台中内置的配置来实现,配置页详见下图,可以去试一下。
注意:
- 要想使用此配置,也必须首先停用“服务器配置”
- 这个被关注回复能否与服务器配置共存,有兴趣的可以测试一下,我这里就不测了。不过我想应该无法共存,毕竟如果开了服务器配置,用户关注的消息是会被转发到咱们自己的服务器上的,微信自己的服务器就收不到这个消息了。
从今天开始,持续学习,开始搞事情。踩坑不易,欢迎关注我,围观我!
有任何问题,欢迎+vx:jasper_8017,我也是个小白,想与志同道合的朋友一起讨论,共同进步!