使用这个服务的前提是,你必须要有一个微信订阅号,或者公众号,并且是通过认证的号
因为认证过后的号才有模版消息和获取用户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的机器的服务,等待其邮件和微信的告警推送。
- 微信硬件平台(八) 4 ESP8266通过微信公众号给用户推送消息
https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=自己申请微信公众号的TOKEN 输出结果: 由于aRDUINO串 ...
- 微信公众号实现无限制推送模板消息!可向指定openID群发
微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 以上就是模板消息,只有文字和跳转链接,没有封面图.在服务号的后台添加功能插件-模板消息即可. 模板消息,都是在后台选择一个群发 ...
- asp.net 实现微信公众平台的主动推送信息
通过学习借鉴朋友的实现方法进行整理(微信公众帐号主动发送消息给用户,asp.net版本). /// <summary> /// MD5 32位加密 /// </summary> ...
- PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制
2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...
- httpClient实现微信公众号消息群发
1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信openid的微信用户集合) 2.基本步骤 前提: 已经有认证的公众号或者测试公众账号 发送消息步骤: 发送一 ...
- 【微信公众号】将微信公众号消息里的FromUserName即OpenID转成UnionID
最近在调试微信公众号开发者模式,处理公众号消息,收到如下回调消息内容 <xml><ToUserName><![CDATA[gh_29********21]]>< ...
- zabbix 布署实践【5 使用邮箱SMTP SSL推送告警邮件】
由于传统的邮件推送脚本使用smtp 25端口,在各大邮箱提供商已不适用,已经向SSL过渡,这里以QQ邮箱为例,使用SSL 465端口 登录zabbix-server 进入 cd /usr/lib/za ...
- 为什么下载APP,扫描二维码,关注微信公众号,就会送牛奶送小礼品?下载使用量高,会怎样?
以前的老办法是到处贴广告,电视上,广播上各种宣传. 在互联网时代,企业要盈利,除了不断优化升级自己的产品和服务,大量推广宣传产品,还要懂得用户思维.现在有网站,有APP,有微信,有二维码,可以卖产品, ...
- zabbix 布署实践【7 H3C网络设备监控模版制作思路】
我们知道,zabbix安装后自带Template OS Linux 模版已满足了绝大部分Linux服务器的基础环境监控,只是我们在其模版上稍微修改,可配合将SWAP监控取消,另存为一个叫OS Linu ...
随机推荐
- c# in deep 之委托
通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做.使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收.尤其是假如某“短命”的对象调用 ...
- Helper Method
ASP.NET MVC 小牛之路]13 - Helper Method 我们平时编程写一些辅助类的时候习惯用“XxxHelper”来命名.同样,在 MVC 中用于生成 Html 元素的辅助类是 Sys ...
- TOGAF企业连续体和工具之架构资源库及架构工具的选择
TOGAF企业连续体和工具之架构资源库及架构工具的选择 3. 架构资源库 在一个企业,尤其是在一个大型企业中,建设一个成熟的架构往往会产生大量的工作产品.为了很好地管理和利用这些工作产品,企业需要制定 ...
- BFS和DFS详解
BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...
- socket1
socket的那些事(1) TCP/IP 简单介绍 应用层 (Application):应用层是个很广泛的概念,有一些基本相同的系统级 TCP/IP 应用以及应用协议,也有许多的企业商业应用和互联网应 ...
- PrintWriter返回值乱码问题
⑴response.setCharacterEncoding("utf-8"); ⑵response.setContentType("text/html; charset ...
- jQuery中的事件监听方式及异同点
jQuery中的事件监听方式及异同点 作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery&g ...
- JForum2.1.9 安装过程
JForum2.1.9 安装过程 JForum2.1.9 安装过程 2013/08/10 0:48 1.第一次接触 2013/08/08 在开源中国看到一个国外开源的Java论坛,然后下载JForum ...
- Arduino 3G shield using SoftwareSerial to control
On the 3G shield, by default the power pin is on D8 and reset pin is on D9. Make it HIGH then it wor ...
- 设计模式(二)-- 外观模式(Facade)
设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...