使用这个服务的前提是,你必须要有一个微信订阅号,或者公众号,并且是通过认证的号
因为认证过后的号才有模版消息和获取用户openid等信息的权限 ,如下,登录微信公众号的登录页后,底下有个接口权限的展示

 
我们可以理解为它类传于邮件发送告警的思路,
首先,你需要关注你们的微信公众号,其次zabbix后需要能调用腾讯的API接口,发送业务通知消息到指定的OpenID的人员
其次,你要有发送对象的openID,它就类似于是邮箱地址。需要将这个OpenID配置到用户的告警媒介,让其传参给我们的脚本中,
 
至于如何获取(已关注你公众号的微信用户的OpenID),可参考以下链接的PHP方法获得。
当然,如果你本身不是很懂PHP,并且你的公众号只有内部使用的话,人员使用得少,获取用户的OpenID,只需在公众号上配置一个回调的80端口域名,这个回调域名是你配置在你掌控的后台服务器上,在此服务器上安装nginx后,可以跟这个公众号进行交互,比如回复消息,或点击相关的公众号的链接按钮,通过查看微信回调过程中,携带的URL中,也是可以看出当前操作者的OpenID的,
如下截图,tail 一下回调服务器上的nginx的access log, 在openid=XXXXX  到&字符之前的这段ID就是OpenID
 

有了接收告警的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

分析一下上面的微信脚本。
    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界面
管理员再添加一个告警媒介
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. WPF界面按钮美化

    在App.xaml里加入全局按钮样式 <Application x:Class="WpfButton.App" xmlns="http://schemas.micr ...

  2. BEncoding的编码与解码

    BEncoding的编码与解码   1. BEncoding规则 BEncoding是BitTorrent用在传输数据结构的编码方式,我们最熟悉的“种子”文件,它里面的元数据就是 BEncoding ...

  3. [NLP自然语言处理]计算熵和KL距离,java实现汉字和英文单词的识别,UTF8变长字符读取

    算法任务: 1. 给定一个文件,统计这个文件中所有字符的相对频率(相对频率就是这些字符出现的概率——该字符出现次数除以字符总个数,并计算该文件的熵). 2. 给定另外一个文件,按上述同样的方法计算字符 ...

  4. java判断字符串是否为乱码

    项目中有一个功能 在IE中GET方式提交会产生乱码 但有两个入口都会走这同一段代码 固不能直接转码,所以要进行判断传过来的该值是不是乱码 可用以下方式验证: java.nio.charset.Char ...

  5. Eclipse plugin web site 发布和版本更新

    Eclipse plugin web site 发布和版本更新 在eclipse插件开发过程中免不了要发布1.0, 1.1, 1.2…….等等,随着版本的递增,假如每次都发布一个插件zip包,那使用者 ...

  6. 伪ajax上传文件

    伪ajax上传文件   最近在折腾伪ajax异步上传文件. 网上搜索了一下,发现大部分方法的input file控件都局限于form中,如果是在form外的呢? 必须动态生成一个临时form和临时if ...

  7. Window Service 计划任务

    在ASP.NET中创建计划任务,就我个人而言,用过两种方式,一种是用SQL Server创建,把写好的SSIS包导入SQL Server创建的任务中,设置好时间让它去执行.还有一种就是利用window ...

  8. enode框架step by step之Staged event-driven architecture思想的运用

    enode框架step by step之Staged event-driven architecture思想的运用 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件 ...

  9. C#中WindowsForm常见控件的运用

    C#中WindowsForm常见控件的运用 -- 1.button(曹操,贡天子以令不臣): 属性;text:我们经常可以看见将按钮命名为“登入”,在其属性面板里面编辑text即可:如下图:      ...

  10. C#多线程,线程锁

    ];             ; i < ; i++) {                 threads[i]= ; i < ; i++) {                     R ...