二、微信公众号实现自动回复和天气查询

本文最后更新于: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,则出现:

python版本

没有的话安装即可,然后使用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
# coding=UTF-8
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
# coding=UTF-8
#handle.py
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"#这里需要替换成自己设置的Token
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
# map(sha1.update, list)
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库

1
pip3 install werobot

在Xshell中定位到wx文件夹,使用下列命令在80端口运行main.py

1
sudo python3 main.py 80

运行之后终端会出现: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
# coding=UTF-8
#webserver.py基于werobot开发框架的自定义回复功能
import werobot

robot = werobot.WeRoBot(token='a1b2c3d4')#这里需要替换成自己设置的Token,和handle.py文件中以及配置服务器的Token一致

# @robot.text 修饰的 Handler 只处理文本消息
@robot.text
def echo(message):
return message.content

# @robot.image 修饰的 Handler 只处理图片消息
@robot.image
def img(message):
return message.img

@robot.text
def first(message, session):
if 'first' in session:
return '你之前给我发过消息'
session['first'] = True
return '你之前没给我发过消息'

# 让服务器监听在 0.0.0.0:80
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()

在云服务器中运行webserver.py

1
sudo python3 webserver.py

然后向公众号发各种消息测试,服务器会监听到你的POST请求,并且会返回你的消息,如下两图

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
# coding=UTF-8
#webserver.py基于werobot开发框架的自定义回复功能
import werobot
import requests
import json

robot = werobot.WeRoBot(token='a1b2c3d4')#这里需要替换成自己设置的Token,和handle.py文件中以及配置服务器的Token一致

# @robot.text 修饰的 Handler 只处理文本消息
@robot.text
def echo(message):
#判断如果关键词里有"天气"
if "天气" in message.content:
#比如输入为"天气&北京",partition()将输入变为含有三个元素{"天气","&","北京"}数组
ret = message.content.partition('&')
#提取城市名
addr = ret[2]
#调用查询天气API,自己可以更换,网上有很多免费的API
url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + addr
response = requests.get(url=url)
result=json.loads(response.text)
#解析json
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 修饰的 Handler 只处理图片消息
@robot.image
def img(message):
return message.img

@robot.text
def first(message, session):
if 'first' in session:
return '你之前给我发过消息'
session['first'] = True
return '你之前没给我发过消息'

# 让服务器监听在 0.0.0.0:80
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()

然后传输到服务器,使用命令运行:

1
sudo python3 webserver.py

测试结果如下:

天气

注意事项

token一定要填写对,分别在handle.py和webserver.py中,一定要填写正确。


二、微信公众号实现自动回复和天气查询
https://jialiangz.github.io/2021/12/07/Net-lab2/
作者
爱吃菠萝
发布于
2021年12月7日
更新于
2022年5月19日
许可协议