zabbix 布署实践【6 使用微信公众号-消息模版推送告警】

时间:2022-09-23 17:26:15
使用这个服务的前提是,你必须要有一个微信订阅号,或者公众号,并且是通过认证的号
因为认证过后的号才有模版消息和获取用户openid等信息的权限 ,如下,登录微信公众号的登录页后,底下有个接口权限的展示
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
 
我们可以理解为它类传于邮件发送告警的思路,
首先,你需要关注你们的微信公众号,其次zabbix后需要能调用腾讯的API接口,发送业务通知消息到指定的OpenID的人员
其次,你要有发送对象的openID,它就类似于是邮箱地址。需要将这个OpenID配置到用户的告警媒介,让其传参给我们的脚本中,
 
至于如何获取(已关注你公众号的微信用户的OpenID),可参考以下链接的PHP方法获得。
当然,如果你本身不是很懂PHP,并且你的公众号只有内部使用的话,人员使用得少,获取用户的OpenID,只需在公众号上配置一个回调的80端口域名,这个回调域名是你配置在你掌控的后台服务器上,在此服务器上安装nginx后,可以跟这个公众号进行交互,比如回复消息,或点击相关的公众号的链接按钮,通过查看微信回调过程中,携带的URL中,也是可以看出当前操作者的OpenID的,
如下截图,tail 一下回调服务器上的nginx的access log, 在openid=XXXXX  到&字符之前的这段ID就是OpenID
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
 zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
有了接收告警的OpenID人员后,接来就是简单的创建脚本和动作了。
 
在zabbix 服务器端的数据库中,先创建一张表来作存放zabbix端发起微信API接口时返回的token(token请求是有次数的,并且token的失效时间较长,我们需要灵活应用)
 
mysql -u root -p
 
use zabbix;
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `wechat_token`;
CREATE TABLE `wechat_token` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `token` varchar(300) NOT NULL,
  `time_available` float(100,0) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
INSERT INTO `wechat_token` VALUES ('1', 'zRKH6VmKhNFLUBPwhKKeZb0KzZbfDOn8OYpl9zBEqzoQqFg-iU5Lry0mNZdKzliQYdhaq19_0qIT9LnFkw_SSJ7GrtolSJHcgCT6Kt-Pa9J8w1uG54a-fbJS2bvKoriMZNZdCGASGS', '1484297600');
 
 
 
退出数据库,
在服务器端的以下目录,创建发送微信脚本
 
 
# yum install  MySQL-python -y
 
cd /usr/lib/zabbix/alertscripts
 
[root@zabbixserver alertscripts]# vi wechat_monitor.py
#!/usr/bin/python
# coding=utf-8
 
import json
import time,sys
import MySQLdb
import requests
 
class wechat_monitor():
 
    appID = "wxe72b2acXXXXX"
    appsecret = "ed4f3975ebbfXXXXXXXXXXXXX"
    tempId = "HvPyBT6zIXj700B8hDN51DQXXXXXXXXXXXXXX"
    userOpenId = "o7oUNwLP2UXXXXXXXXXXXXXX"
 
    sendMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="
    template = {'touser' : userOpenId,
                'template_id' : tempId,
                'url ' : "https://mail.qq.com",
                'topcolor ' : '#7B68EE',
                'data' : "" }
 
    tonkenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appID +"&secret=" + appsecret
 
    db_host = "127.0.0.1"
    db_port = 3306
    db_user = "root"
    db_password = "venic8888"
    db_name = "zabbix"
    now = time.time()
 
    def __init__(self):
 
        conn = self.__connections()
        cur=conn.cursor()
        selectSql = "select * from wechat_token"
        cur.execute(selectSql)
        data = cur.fetchone()
        if (int( self.now) - int(data[2])) < 3200:
            self.token = data[1]
        else:
            self.__getToken()
            updateSql = 'UPDATE wechat_token SET token="'+self .token+'",time_available=' +str(self.now)
            try:
                cur.execute(updateSql)
                conn.commit()
            except Exception, e:
                conn.rollback()
                print "数据库更新失败"
                print "Exception:" + e
        self.__closeDatabase(conn,cur)
 
    def __getToken(self):
#       print self.tonkenURL
        res = requests.post( self.tonkenURL)
        self.token = json.loads(res.text)["access_token"]
 
    def sendMessage(self,data):
        self.template["url" ] = ""
        self.template["data"] = data
        res = requests.post( self.sendMessageUrl + self.token, json.dumps(self.template))
        return res
 
    def __connections(self):
        try:
            conn = MySQLdb.connect(self.db_host,self.db_user,self.db_password, self.db_name,charset="utf8")
        except Exception, e:
            print "数据库连接失败"
            print "Exception:" + e
        return conn
 
    def __closeDatabase(self,conn,cur):
        try:
            cur.close()
            conn.close()
        except Exception, e:
            print "数据库关闭失败"
            print "Exception:" + e
 
if __name__ == '__main__':
    wm = wechat_monitor()
    wm.template["touser"] = sys.argv[1]
 
    data = {"first" : { "value" : sys.argv[2 ],"color" : "#173177" },
            "performance":{"value" : sys.argv[3],"color" : "#173177" },
            "time":{"value" :time.ctime(),"color" : "#173177" },
            "remark":{"value" : "更多内容请登录邮箱查看!","color" : "#173177"}}
    res = wm.sendMessage(data)
 
保存赋权。
chmod +x /usr/lib/zabbix/alertscripts/wechat_monitor.py
 
在报警媒介中,创建一个类型,启命叫WeChat
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
zabbix 布署实践【6 使用微信公众号-消息模版推送告警】

zabbix 布署实践【6 使用微信公众号-消息模版推送告警】

zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
分析一下上面的微信脚本。
    appID = "wxe72bXXXXXXXXXX"-------这是公众号的ID(已认证过的。公众号平台上会一次性提供,需要自己留存)
    appsecret = "ed4f3975ebbf17b2XXXXXXXXXXXXX"-------这是VIFI产品公众号的密钥(已认证过的。公众号平台上会一次性提供,需要自己留存)
    tempId = "HvPyBT6zIXj700B8hXXXXXXXXXXXXXXXX"---------这是这个公众号的消息模版的ID(必须是认证过的。才有权限,公众号平台上会一次性提供,需要自己留存)
    userOpenId = "o7oUNwEl4nRKXXXXXXXX" 是我自己的OpenID用来测试提前赋值用的。
 
 
 
 
如果要抛开zabbix,先自测微信公众号的接口的话,可以通过以下脚本在自己电脑上的eclips上跑一下看看能否收到
 
#!/usr/bin/python
# coding=utf-8
 
import json
import time
 
import requests
 
appID = "wxe72bXXXXXXXXXXXXXX"
appsecret = "ed4f3975ebbf1XXXXXXXXXXXXXX"
tempId = "HvPyBT6zIXj700B8hXXXXXXXXXXXXXXXXX"
userOpenId = "o7oUNwLP2XXXXXXXXXXXXXXX"
 
sendMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="
template = {'touser' : userOpenId,
            'template_id' : tempId,
            'url ' : "https://mail.qq.com",
            'topcolor ' : '#7B68EE',
            'data' : "" }
 
tonkenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appID +"&secret=" + appsecret
 
res = requests.post( tonkenURL)
token = json.loads(res.text)["access_token"]
 
def sendMessage(data):
    template["url" ] = ""
    template["data"] = data
    res = requests.post( sendMessageUrl + token, json.dumps(template))
    return res
 
if __name__ == '__main__':
 
    data = {"first" : { "value" : '',"color" : "#173177" },
            "performance":{"value" : '',"color" : "#173177" },
            "time":{"value" :time.ctime(),"color" : "#173177" },
            "remark":{"value" : "更多内容请登录邮箱查看!","color" : "#173177"}}
 
    res = sendMessage(data)
 
 
 接下来就是测试zabbix能否正常运行这个脚本。
首次先在zabbix服务器上自测一下
python /usr/lib/zabbix/alertscripts/wechat_monitor.py  你的OpenID  test  test
 
正常后,再定义zabbix的dashboard界面
管理员再添加一个告警媒介
 zabbix 布署实践【6 使用微信公众号-消息模版推送告警】

关闭一台agent的机器的服务,等待其邮件和微信的告警推送。

zabbix 布署实践【6 使用微信公众号-消息模版推送告警】的更多相关文章

  1. 微信硬件平台(八) 4 ESP8266通过微信公众号给用户推送消息

    https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=自己申请微信公众号的TOKEN 输出结果:  由于aRDUINO串 ...

  2. 微信公众号实现无限制推送模板消息!可向指定openID群发

    微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 以上就是模板消息,只有文字和跳转链接,没有封面图.在服务号的后台添加功能插件-模板消息即可. 模板消息,都是在后台选择一个群发 ...

  3. asp&period;net 实现微信公众平台的主动推送信息

    通过学习借鉴朋友的实现方法进行整理(微信公众帐号主动发送消息给用户,asp.net版本). /// <summary> /// MD5 32位加密 /// </summary> ...

  4. PHP版微信公共平台消息主动推送&comma;突破订阅号一天只能发送一条信息限制

    2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...

  5. httpClient实现微信公众号消息群发

    1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信openid的微信用户集合) 2.基本步骤 前提: 已经有认证的公众号或者测试公众账号 发送消息步骤: 发送一 ...

  6. 【微信公众号】将微信公众号消息里的FromUserName即OpenID转成UnionID

    最近在调试微信公众号开发者模式,处理公众号消息,收到如下回调消息内容 <xml><ToUserName><![CDATA[gh_29********21]]>&lt ...

  7. zabbix 布署实践【5 使用邮箱SMTP SSL推送告警邮件】

    由于传统的邮件推送脚本使用smtp 25端口,在各大邮箱提供商已不适用,已经向SSL过渡,这里以QQ邮箱为例,使用SSL 465端口 登录zabbix-server 进入 cd /usr/lib/za ...

  8. 为什么下载APP,扫描二维码,关注微信公众号,就会送牛奶送小礼品?下载使用量高,会怎样?

    以前的老办法是到处贴广告,电视上,广播上各种宣传. 在互联网时代,企业要盈利,除了不断优化升级自己的产品和服务,大量推广宣传产品,还要懂得用户思维.现在有网站,有APP,有微信,有二维码,可以卖产品, ...

  9. zabbix 布署实践【7 H3C网络设备监控模版制作思路】

    我们知道,zabbix安装后自带Template OS Linux 模版已满足了绝大部分Linux服务器的基础环境监控,只是我们在其模版上稍微修改,可配合将SWAP监控取消,另存为一个叫OS Linu ...

随机推荐

  1. sqlserver 乐观并发模式

    一开始不怎么理解乐观并发模式是什么. 这种模式可以在死锁问题上使用. 在sql中 这样就是乐观并发模式. SqlServer默认开启的是悲观并发模式 例如:

  2. jquery事件核心源码分析

    我们从绑定事件开始,一步步往下看: 以jquery.1.8.3为例,平时通过jquery绑定事件最常用的是on方法,大概分为下面3种类型: $(target).on('click',function( ...

  3. Laravel之路——file缓存修改为redis缓存

    1.Session: 修改.evn文件: SESSION_DRIVER:redis (如果还不行的话,修改config/session.php的driver) 2.缓存修改为redis 注意:使用 L ...

  4. WordPress下载安装简单配置实例

    1.下载https://cn.wordpress.org/ 2.复制wp-config-sample.php为wp-config.php 3.创建一个wordpress数据库 4.修改wp-confi ...

  5. Toad for Oracle的安装

    分享一下Oracle 10gToad for Oracle的安装步骤   三年前用过Oracle,单纯的“用过”,主要就是说对数据库的一些操作,还不包含创建一些存储过程之类的,所以对Oracle仅仅只 ...

  6. mysql----ERROR 1040 &lpar;HY000&rpar;&colon; Too many connections

    http://gwokae.mewggle.com/wordpress/index.php/archives/683 查看最大链接 mysql -h alg-db14 -u bfdroot -pqia ...

  7. Codeforces899C Dividing the numbers&lpar;数论&rpar;

    http://codeforces.com/problemset/problem/899/C tot为奇数时,绝对差为1:tot为偶数时,绝对差为0. 难点在于如何输出. #include<io ...

  8. spring 对jdbc的简化

    spring.xml <!-- 加载属性配置文件 --> <util:properties id="db" location="classpath:db ...

  9. DDA画线算法

    #include<stdio.h> #include"graphics.h" #include<math.h> #include<stdlib.h&g ...

  10. NFS服务的端口分配

    常规的一些NFS服务设置我们已经了解了.那么对于端口问题,很多朋友并不是很清楚.这里我们就来详细介绍一下端口的分配.portmapper在NFS服务启动的时候给每一个NFS服务分配了一个动态的端口,如 ...