博客发文通知 | 宁静致远

博客发文通知

正在加载一言...


之前更新关于彤宝的博客会分享给老婆,但是每次手动分享有点麻烦,所以就有了这篇文章了。

0.前期准备


  1. 首先博客开启RSS,这个网上有很多的教程,这边就不多赘述了,放个为hexo博客添加RSS订阅功能的链接。
  2. 编写企业微信通知简单的程序,这个后面说
  3. 需要编写一个Node-RED

1.开始折腾


增加了订阅功能之后,就能够通过他来获得博客网站以及文章的信息,内容如下图所示
RSS
不过 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.写在最后


这个还可以扩展,比如加上在文章上加上推送开关,或者要推送的人,这样就可以实现个性化通知了。


文章作者: 彤爸比
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彤爸比 !
评论
  目录