来杯菊花茶

生活不只是眼前的苟且,还有诗和远方

0%

利用微信实现自动发送监控告警

最近笔者的项目需要找到一种方法能自动将Python爬虫产生的一些结果用告警的信息的方式发送到手机上,以往我们用来发送告警的方式往往是短信或者邮件,但是这两种方式要么不够灵活要么实时性不够。现在越来越多的互联网应用选择用微信作为平台发送告警信息,这种方式的前提就是你的应用需要能够访问到微信的服务器。
根据笔者的了解,目前集成微信告警主要有两种方式:

  • 用个人号发送告警
  • 用公众号(企业号)发送告警

个人号发送告警

顾名思义,虽然也是调用微信的API实现发送信息,但是这种方式需要使用个人账号扫描登录以后脚本才能运行,另外从接受告警的形式上看起来也就像是跟一个人在聊天。当前已经有很多热心的大神将微信的接口封装成了更加易于调用的接口SDK,如wxpywechat sender可以大大简化接口调用的复杂度,感兴趣的读者可以自行研究,上述两个项目的文档已经写的非常详细了

公众号发送告警

使用公众号发送告警,从形式上看起来更加正式,并且不需要扫码登录,更适合部署在服务器上长期运行。因为近期微信的企业号和公众号做了合并,因此申请的流程有了一些变化,但是总体来说更加简单了,即使没有真正的公司注册信息也同样可以申请到,只是未验证主体信息的账号只能有200个成员,发送次数的限制为:帐号上限数*30人次/天

注册公众号(企业号)

现在申请的过程非常简单,申请入口:https://work.weixin.qq.com/

查看公众号

注册完成后可以进入到后台管理页面,点击微信插件,可以看到我们企业号的二维码,并可以进行添加成员等操作
微信插件

创建应用

在开始调用公众号的API之前,我们要先创建一个应用,告警可以发送到指定的应用中,同时我们还可以对应用授权,以限制可以看到告警的人员范围
创建应用
创建完成后,点击应用图标可以看到以下页面
应用信息
其中AgentId和Secret两个字段在后面的代码中要用到

微信API

要实现简单的消息发送,我们只需要用到两个微信的API接口

Python调用微信API

废话不多说,直接上代码

import json
import requests


class WeChatPub:
    s = requests.session()
    token = None

    def __init__(self):
        self.token = self.get_token("<corpid>", "<secret>")
        print("token is " + self.token)

    def get_token(self, corpid, secret):
        url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}".format(corpid, secret)
        rep = self.s.get(url)
        if rep.status_code == 200:
            return json.loads(rep.content)['access_token']
        else:
            print("request failed.")
            return None

    def send_msg(self, content):
        url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + self.token
        header = {
            "Content-Type": "application/json"
        }
        form_data = {
            "touser": "@all",
            "toparty": " PartyID1 | PartyID2 ",
            "totag": " TagID1 | TagID2 ",
            "msgtype": "textcard",
            "agentid": 1000002,
            "textcard": {
                "title": "领奖通知",
                "description": content,
                "url": "URL",
                "btntxt": "更多"
            },
            "safe": 0
        }
        rep = self.s.post(url, data=json.dumps(form_data).encode('utf-8'), headers=header)
        if rep.status_code == 200:
            return json.loads(rep.content)
        else:
            print("request failed.")
            return None


if __name__ == '__main__':
    wechat = WeChatPub()
    wechat.send_msg("<div class=\"gray\">2016年9月26日</div> <div class=\"normal\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\"highlight\">请于2016年10月10日前联系行政同事领取</div>")

CorpID在我的企业->企业信息 页面的最下面
mark
执行以后在目标群里会收到以下信息:
mark

接下来的事情就简单了,我们在已经准备好的爬虫脚本中需要告警的位置加上 wechat.send_msg()即可将相关的信息发送到我们的企业号上,实现自动发送告警。