本文最后更新于:2022年5月19日 下午
准备
首先去微信公众平台 (qq.com)注册一个订阅号
第一步的准备工作就完成了
公众号的相关配置
修改名称
在你登陆之后,会提示你修改你的公众号名称,一定要修改,不然三天之后就自动注销。其实在注册的时候就新建过一个,这里随意修改一个喜欢的
绑定开发者账号
在左侧设置与开发->基本配置,成为开发者
然后点击设置与开发->开发者工具->web开发者工具->绑定开发者微信号。
到这里就基本完成设置了。
服务器配置
这里默认你已经看过之前的博客使用Xftp7和Xshell7链接服务器 - G-and-Z (gandz.top),已经拥有你的云服务器了。
进入设置与开发->基本配置
这里的服务器URL填写http(https)://云服务器公网IP/wx,一般没有证书都是http
令牌自己随意设置一个,比如这里我设置的a1b2c3d4
随机生成消息加解密密钥
开发使用明文加解密模式
到这里公众号的配置就结束了。
配置云服务器
使用Xshell7连接上你的云服务器,查看是否安装了python3,输入命令python3 --version
查看当前python版本(若没出现版本号可将命令中的3删除再试,这里推荐使用python3),若有python3,则出现:
没有的话安装即可,然后使用pip安装web库
1 2
| #使用python3 pip3 install web.py
|
然后新建main.py文件,填入以下代码,main.py负责监听80端口返回给前端信息
1 2 3 4 5 6 7 8 9 10 11
| import web from handle import Handle
urls = ( '/wx', 'Handle', )
if __name__ == '__main__': app = web.application(urls, globals()) app.run()
|
然后新建handle.py文件,将下面的代码复制到handle.py,handle.py负责接口验证Token,将token、timestamp、nonce三个参数进行字典序排序,将三个参数字符串拼接成一个字符串进行sha1加密 ,开发者获得加密后的字符串可与signature对比,标识该请求来源于微信,注意需要将第17行替换成自己设置的Token,这里Token上面已经设置为a1b2c3d4
,只能是数字和字母,3-32个字符。
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 29 30 31 32 33
|
import hashlib import web import sys
class Handle(object): def GET(self): try: data = web.input() if len(data) == 0: return "hello, this is handle view" signature = data.signature timestamp = data.timestamp nonce = data.nonce echostr = data.echostr token = "a1b2c3d4" list = [token, timestamp, nonce] list.sort() sha1 = hashlib.sha1() sha1.update(list[0].encode('utf-8')) sha1.update(list[1].encode('utf-8')) sha1.update(list[2].encode('utf-8')) hashcode = sha1.hexdigest() print ("handle/GET func: hashcode, signature: ", hashcode, signature) if hashcode == signature: return int(echostr) else: return "" except Exception as Argument: return Argument
|
然后将这两个文件都上传到云服务器,使用Xftp7连接,然后在root下新建wx文件夹,把main.py和handle.py传进wx文件夹
然后安装werobot库
在Xshell中定位到wx文件夹,使用下列命令在80端口运行main.py
运行之后终端会出现:http://0.0.0.0:80/
就证明成功了,然后向公众号随便发一条测试消息,目前还不会做出反应,但是终端会接收到你向服务器POST一个请求
自定义回复
在服务器端运行webserver.py,代码如下:文本信息回复代码在第7行到第10行,功能是将用户发送到公众号的消息发送给原用户,图片信息回复在第12行到第15行,功能是将用户发送到公众号的图片链接发送给原用户
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
|
import werobot
robot = werobot.WeRoBot(token='a1b2c3d4')
@robot.text def echo(message): return message.content
@robot.image def img(message): return message.img
@robot.text def first(message, session): if 'first' in session: return '你之前给我发过消息' session['first'] = True return '你之前没给我发过消息'
robot.config['HOST'] = '0.0.0.0' robot.config['PORT'] = 80 robot.run()
|
在云服务器中运行webserver.py
1
| sudo python3 webserver.py
|
然后向公众号发各种消息测试,服务器会监听到你的POST请求,并且会返回你的消息,如下两图
至此,公众号自动回复就完成了。
天气查询
这里使用的是查询天气的免费API接口,修改webserver.py
为下面的代码
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
import werobot import requests import json
robot = werobot.WeRoBot(token='a1b2c3d4')
@robot.text def echo(message): if "天气" in message.content: ret = message.content.partition('&') addr = ret[2] url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + addr response = requests.get(url=url) result=json.loads(response.text) data = result["data"]["forecast"][0]["date"] high = result["data"]["forecast"][0]["high"] fengli = result["data"]["forecast"][0]["fengli"] low = result["data"]["forecast"][0]["low"] fengxiang = result["data"]["forecast"][0]["fengxiang"] tian = result["data"]["forecast"][0]["type"] return "时间:" + data + "\n最好气温:" + high + "\n最低气温:" + low + "\n风向:" + fengxiang + "\n天气:" +tian else: return message.content
@robot.image def img(message): return message.img
@robot.text def first(message, session): if 'first' in session: return '你之前给我发过消息' session['first'] = True return '你之前没给我发过消息'
robot.config['HOST'] = '0.0.0.0' robot.config['PORT'] = 80 robot.run()
|
然后传输到服务器,使用命令运行:
1
| sudo python3 webserver.py
|
测试结果如下:
注意事项
token一定要填写对,分别在handle.py和webserver.py中,一定要填写正确。