之前更新关于彤宝的博客会分享给老婆,但是每次手动分享有点麻烦,所以就有了这篇文章了。
0.前期准备
- 首先博客开启RSS,这个网上有很多的教程,这边就不多赘述了,放个为hexo博客添加RSS订阅功能的链接。
- 编写企业微信通知简单的程序,这个后面说
- 需要编写一个Node-RED流
1.开始折腾
增加了订阅功能之后,就能够通过他来获得博客网站以及文章的信息,内容如下图所示
不过 image 这个字段是后面自己加上的,因为推送的时候想把封面也推送过去。修改的地方如下:
# 先到刚刚安装的那个插件目录下
cd blog/node_modules/hexo-generator-feed
# 编辑 atom.xml
vi atom.xml
在图示位置,添加如下内容:
<image>{{ post.img | formatUrl}}</image>
【⚠️注意】在文章的头上需要有img
这个字段,如果你的封面是别的字段,注意更换。
到目前为止,数据已经齐活了。下面整企业微信通知的代码。这边是使用的Python
代码写的比较简单,按照企业微信的逻辑来即可。这边是官方API地址照着来就行。
# -*- coding: utf-8 -*-
import json
import requests
from bottle import route, run, request
import configparser
from requests import RequestException, ReadTimeout
cfg = configparser.ConfigParser()
cfg.read('qy.ini')
TOKEN_API = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s"
SEND_API = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s"
global access_token
access_token = cfg.get('QYParam', 'access_token')
agentid = cfg.get('QYParam', 'agentid')
@route('/getToken')
def getToken():
# 获得企业信息
# print("getToken start")
corpid = cfg.get('QYParam', 'corpid')
corpsecret = cfg.get('QYParam', 'corpsecret')
url = TOKEN_API % (corpid, corpsecret)
# print("url=" + str(url))
ret = json.loads(requests.get(url).text)
errcode = str(ret["errcode"])
if errcode == "0":
global access_token
access_token = ret["access_token"]
cfg.set("QYParam", "access_token", ret["access_token"])
cfg.write(open('qy.ini', 'w'))
return ret
@route('/sendMsg')
def sendmsg():
url = SEND_API % access_token
print("sendmsg url=" + str(url))
data = json.dumps({
"touser": "xxx",
"msgtype": "textcard",
"agentid": agentid,
"textcard": {
"title": "博客通知",
"description": "<div class=\"gray\">2016年9月26日</div> <div class=\"normal\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\"highlight\">请于2016年10月10日前联系行政同事领取</div>",
"url": "http://www.wangxingyang.com",
"btntxt": "更多"
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
})
try:
response = requests.request("POST", url, data=data)
except ReadTimeout:
return "Connection timeout...."
except ConnectionError:
return "Connection Error...."
except RequestException:
return "Unknown Error"
ret = json.loads(response.text)
errcode = str(ret["errcode"])
if errcode == "42001":
# 重新获得Token
getToken()
# 重新发送
sendmsg()
return response.text
@route('/sendNewsMsg', method='POST')
def sendNewsMsg():
url = SEND_API % access_token
# print("sendmsg url=" + str(url))
title = request.POST.get('title').encode("latin1").decode("utf-8")
link = request.POST.get('link').encode("latin1").decode("utf-8")
img = request.POST.get('img').encode("latin1").decode("utf-8")
summary = request.POST.get('summary').encode("latin1").decode("utf-8")
data = json.dumps({
"touser": "xxx",
"msgtype": "news",
"agentid": agentid,
"news": {
"articles": [
{
"title": title,
"description": summary,
"url": link,
"picurl": img,
}
]
},
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}).encode('utf-8')
try:
response = requests.request("POST", url, data=data)
except ReadTimeout:
return "Connection timeout...."
except ConnectionError:
return "Connection Error...."
except RequestException:
return "Unknown Error"
ret = json.loads(response.text)
errcode = str(ret["errcode"])
if errcode == "42001":
# 重新获得Token
getToken()
# 重新发送
sendmsg()
return response.text
run(host='localhost', port=8080, debug=True)
这个代码我放到树莓派上了,接着就是通过Node-RED
来调这个接口。当然你也可以直接用Node-RED
来实现,我比较喜欢封装下,不然流得搞的老长。
最后看看Node-RED流
没啥特别的就不贴代码了。
最后效果如下图:
2.写在最后
这个还可以扩展,比如加上在文章上加上推送开关,或者要推送的人,这样就可以实现个性化通知了。