微信公众号开发

本篇文章介绍微信公众号的开发

微信公众号开发是基于微信官方提供的接口所进行的二次开发。

1.开发换境搭建

我们先来了解一下微信公众号开发的原理

示意图

img

当我们在微信公众号后台发送消息时,数据会转发到微信服务器上,如果我们在公众号后台配置了接口信息,那么微信服务器会将数据转发到开发者服务器。由开发者服务器做出响应, 再经过微信服务器转发到微信公众号客户端。这就是微信公众号开发的原理。

由于我们需要在公众号后台配置接口,所以并不能直接把本地启动的服务直接配置到公众号后台。这里我们需要使用到一款内网穿透工具ngork, 将我们本地启动的服务映射到一个公网IP上,但是经过测试发现,ngork的域名都被微信屏蔽了。所以,在公众号后台配置是无法使用的。

这里我找到了另一款价格在接受范围的内网穿透工具-量子互联

量子互联官网:https://www.uulap.com/nattunnel

内网穿透非常简单,下面介绍如何将本地的服务映射到一个公网IP

1.登录量子互联控制台

img

2.选择解析线路

如果域名已备案,选择s5线路,如果域名未备案,选择香港服务器线路

3.域名映射

点击配置隧道

img

将自定义域名解析到s5线路

img

阿里云域名解析如下

img

这样我们就配置好了

4.下载客户端

登录token获取

内网列表 >> TOKEN

img

填写token登录即可

img

5.这里我们使用flask框架架设我们的后端服务器

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask


app = Flask(__name__)


@app.route("/")
def index():
print("视图函数")
return "success"


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

启动服务之后,我们就可以通过自定义域名访问本地开发的项目。

映射关系图解如下

img

这样我们就完成了开发换境的搭建,我们可以通过自定义域名访问本机的Web服务。

2.公众号后台配置

登录公众号后台,点击开发 》基本配置

img

如果此时我们点击提交,可以看到提示信息,token校验失败

img

这是由于我们需要在本地服务器进行校验token值,这里说一下微信校验的原理。当我们在公众后后台配置好URL地址后,所有通过公众号发送的消息都会转发到该地址。并且URL会携带四个参数signaturetimestampnonceechostr

signature是对timestamp, nonce, 以及token(约定好的令牌信息)这三个参数进行sha1加密, 如果校验通过,那么就返回echostr给微信服务器。说明此次请求确实是微信服务器发过来的。因为我们的接口是暴露在公网的,
别人当然也可以发送网络请求到我们的服务器。如果没有这个检验,那么别人就可以随意访问我们的接口。

这里采用一个第三方库wechatpy完成信息校验。

安装方式

1
pip install wechatpy

示例代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from flask import Flask, request
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException


app = Flask(__name__)


@app.route("/")
def index():
if (request.method == "GET"):
signature = request.args.get('signature')
timestamp = request.args.get('timestamp')
nonce = request.args.get('nonce')
echostr = request.args.get('echostr')
token = "12345678"
try:
check_signature(token, signature, timestamp, nonce)
except InvalidSignatureException:
# 处理异常情况或忽略
return "校验失败"

# 校验成功
return echostr


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

当我们校验了token值之后,就可以提交成功了。

最终配置信息如下

img

3.数据交互格式

用户通过公众号发送消息经由微信服务器转发到我们本地的服务器,数据交互使用的是XML格式,请求方式为POST请求。所以我们需要接受并解析微信服务器转发的数据

数据交互格式如下

1
2
3
4
5
6
7
8
<xml>
<ToUserName><![CDATA[gh_c05fc02889f7]]></ToUserName>
<FromUserName><![CDATA[o0OD401vI_a3nAdb2mit4pH2Kv7Y]]></FromUserName>
<CreateTime>1629213457</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></Content>
<MsgId>23324730089305663</MsgId>
</xml>

我们可以获取到的信息有接收用户,发送用户,时间戳,消息类型,发送内容,消息id等字段信息。这里可以使用wechatpy这个第三方库解析XML格式的数据

用法如下

1
2
3
4
from wechatpy import parse_message
xml_str = request.data
# 解析xml格式数据
msg = parse_message(xml_str)

4.数据提取

1
msg = parse_message(xml_str)

msg是一个TextMessage对象,有以下这些属性

公共属性

1
2
3
4
5
6
7
name	            value

id 消息id, 64 位整型。
source 消息的来源用户,即发送消息的用户。
target 消息的目标用户。
create_time 消息的发送时间,UNIX 时间戳
type 消息的类型

文本消息特有属性

1
content	          消息的内容

数据提取示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
xml_str = request.data
# 解析xml格式数据
msg = parse_message(xml_str)
# 1.目标用户信息
target = msg.target
# 2.发送用户信息
source = msg.source
# 3.消息类型
msgType = msg.type
# 4.消息内容
msgCcontent = msg.content

print(target, source, msgType, msgCcontent)

"""
打印内容如下
gh_c05fc02889f7 o0OD401vI_a3nAdb2mit4pH2Kv7Y text 你好
"""

5.请求处理

前面已经说过微信服务器的数据交互格式是XML格式,所以响应请求也应该将数据包装成XML格式。同样借助wechatpy这个封装好的第三方库回复用户消息。

示例代码如下

1
2
3
4
5
6
7
8
9
10
from wechatpy.replies import TextReply

# 响应内容
reply = TextReply()
reply.source = target
reply.target = source
reply.content = '你好! 欢迎关注逍遥编程公众号!'

# 包装成XML格式的数据
xml = reply.render()

来看一下公众号回复的效果

img

这样就具备了回复消息的能力。基于此可以扩展非常多的东西,比如用户发送一张图片,可以利用百度API图像识别技术给颜值打分并将计算好的结果返回给用户,也可以和爬虫程序对接,用户回复某一个关键字,利用写好的脚本爬取数据并返回给用户。另外也可以更加方便维护和管理公众号的粉丝。再比如,可以记录公众号粉丝的关注或取消关注时间,做一些统计工作。

6.消息类型

最后简单说一下,消息类型有哪些呢?

主要有以下几种

文本消息 | 图片消息 |语音消息 |视频消息 |地理位置消息 |链接消息 |短视频消息

我们可以参考官方给出的文档进行二次开发

微信开发官文档:https://developers.weixin.qq.com/doc/

当然echatpy这个第三方库能让我们的代码变得更加简洁高效

wechatpy官方文档:http://docs.wechatpy.org/


微信公众号开发
http://cxycsx.vip/2023/08/31/其他/微信公众号开发/
作者
程序员陈师兄
发布于
2023年8月31日
许可协议