利用 Python 给微信发消息?怎么做的?
起因
上周做过一个爬虫爬取课表的,本应该尽快出下半部分的内容的,但是嘛,中间放了个中秋假,就开始鸽了。
其实下半部分内容就是把爬到的课表进行格式化再通知自己而已。
其中我最先考虑的是使用 server 酱的,虽然 server 酱服务很到位,但是我想白嫖啊,因为我的 server 每天推送的次数已经全部安排得明明白白了。
接下来便有了用邮件提醒的想法,这个确实有得搞的,但今天先不说。
在我折腾我的路由后台时发现了里面的自建微信推送功能,便看到了微信开放平台的这个接口
那就开搞,又免费又是推送到微信又不会产生过多的邮件,你就说香不香吧
测试号申请
微信公众平台接口测试帐号申请
找到自己的 appID 和 appsecret
扫码自己的测试号二维码并且得到微信号(这个微信号不是真正的微信号,可以理解为微信的 ID)
新增一个模板
模板内容照着这个写1
{{title.DATA}} {{content.DATA}}
这样便可得到所需的内容
- appid
- appsecret
- 微信号
- 模板 ID
请求 token
首先看一下 [微信开放平台](模板消息 | 微信开放文档 (qq.com)) 的文档吧1
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
grant_type | string | 是 | 填写 client_credential | |
appid | string | 是 | 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态) | |
secret | string | 是 | 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid |
返回值
返回的 JSON 数据包
属性 | 类型 | 说明 |
---|---|---|
access_token | string | 获取到的凭证 |
expires_in | number | 凭证有效时间,单位:秒。目前是 7200 秒之内的值。 |
errcode | number | 错误码 |
errmsg | string | 错误信息 |
这就是获取一个临时的一次性通行证,我们需要拿着我们的身份信息 appid 和 secret 去给微信后台,微信知道是我就给我一个通行证让我利用这个通行证来进行发出信息1
2
3
4
5
6# 获取推送token
def get_token():
result = requests.get(
f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={app_id}&secret={app_secret}")
access_token = json.loads(result.text)
return access_token["access_token"]
推送消息
1 | POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN |
请求参数
参数 | 是否必填 | 说明 |
---|---|---|
touser | 是 | 接收者 openid |
template_id | 是 | 模板 ID |
url | 否 | 模板跳转链接(海外帐号没有跳转能力) |
miniprogram | 否 | 跳小程序所需数据,不需跳小程序可不用传该数据 |
appid | 是 | 所需跳转到的小程序 appid(该小程序 appid 必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏) |
pagepath | 否 | 所需跳转到小程序的具体页面路径,支持带参数,(示例 index?foo=bar),要求该小程序已发布,暂不支持小游戏 |
data | 是 | 模板数据 |
color | 否 | 模板内容字体颜色,不填默认为黑色 |
POST 数据说明
1 | { |
1 | # 推送消息 |
这里我们拿着上面请求回来的 token 和我们需要发送的标题和正文,我们便可以发送消息了
完整代码
1 | import json |