zabbix如何实现微信报警
微信的第三方接口要求我们先申请一个企业号——传送门:https://qy.weixin.qq.com/
如何操作企业号?
1.通讯录添加企业成员
我们要提前把成员信息添加进组织部门,必填项+手机号或者微信号,这样别人扫描二维码的时候才能成功关注企业号。
注意:这里有两个我们要用到信息,一个组织部门的ID,一个部门成员的账号(账号是自己手动指定的,不同于微信号,最好是字母加数字)
2.应用中心创建应用
我们要在这里创建应用,因为要通过应用发送消息给部门成员
注意:这里要记住一个值,应用ID
3.给部门设置管理员
设置--->功能设置---->权限管理---->新建管理组
管理员必须事先已经关注了企业号,并且已经设置好邮箱地址
确定管理员可以读取通讯录,可以使用应用发消息。
注意:我们需要管理员的CorpID和Secret
我们要准备这些东西:
一个微信企业号
企业号已经被部门成员关注
企业号里有一个可以发消息的应用
一个授权管理员,可以使用该应用给成员发消息
我们要取到这些信息:
成员账号
组织部门ID
应用ID
CropID
Secret
如何调用微信接口?
调用微信接口需要一个调用接口的凭证:access_token
通过 :CropID 、Secret 才能获取到access_token,但是获取到的token有效期为两分钟
微信企业号接口调试工具传送门:http://qydev.weixin.qq.com/debug
Shell脚本原理
使用:
curl -s -G url 获取 AccessToken
使用:
curl --data url 传送凭证调用企业号接口
zabbix会传递三个参数给脚本,$1是消息接收账号,$2报警标题,$3报警内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #!/bin/bash ###SCRIPT_NAME:weixin.sh### ###send message from weixin for zabbix monitor### ###wuhf### ###V1-2015-08-25### CropID= 'xxxxxx' Secret= 'xxxxxx' GURL= "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret" Gtoken=$( /usr/bin/curl -s -G $GURL | awk -F\" '{print $4}' ) PURL= "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken" function body() { local int AppID=3 企业号中的应用 id local UserID=$1 部门成员 id ,zabbix中定义的微信接收者 local PartyID=1 部门 id ,定义了范围,组内成员都可接收到消息 local Msg=$( echo "$@" | cut -d " " -f3-) 过滤出zabbix传递的第三个参数 printf '{\n' printf '\t"touser": "' "$UserID "\"" ,\n" printf '\t"toparty": "' "$PartyID "\"" ,\n" printf '\t"msgtype": "text",\n' printf '\t"agentid": "' " $AppID "\"" ,\n" printf '\t"text": {\n' printf '\t\t"content": "' "$Msg "\"" \n" printf '\t},\n' printf '\t"safe":"0"\n' printf '}\n' } /usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL |
为什么要这样写脚本?
因为微信企业号开放的端口有固定的格式限制
企业号支持的格式:http://qydev.weixin.qq.com/wiki/index.php?title=消息类型及数据格式
将脚本放入zabbix默认执行路径下
1 2 3 | mv weixin.sh /usr/local/zabbix/share/zabbix/alertscripts chown zabbix.zabbix /usr/local/zabbix/share/zabbix/alertscripts/weixin .sh chmod +x /usr/local/zabbix/share/zabbix/alertscripts/weixin .sh |
服务器端
1.创建媒介
2.创建用户
3.创建触发器动作发送内容
4.设置触发器动作发送方式
收到的微信消息:
附上python脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #!/usr/bin/env python #coding: utf-8 import time import urllib,urllib2 import json import sys ''' 1 空 2 空 3 内容 ''' """ touser否成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送 toparty否部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 totag否标签ID列表,多个接收者用‘|’分隔。当touser为@all时忽略本参数 msgtype是消息类型,此时固定为:text agentid是企业应用的id,整型。可在应用的设置页面查看 content是消息内容 safe否表示是否是保密消息,0表示否,1表示是,默认0 """ # baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken' # securl = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token class WeChatMSG( object ): def __init__( self ,content): self .gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken' self .gettoken_content = { 'corpid' : 'xxxxxxx' , 'corpsecret' : 'xxxxxxxxxx' , } self .main_content = { "toparty" : "1" , "agentid" : "3" , "msgtype" : "text" , "text" :{ "content" :content, } } def get_access_token( self ,string): token_result = json.loads(string.read()) access_token = token_result[ 'access_token' ] return access_token.encode( 'utf-8' ) def geturl( self ,url,data): data = self .encodeurl(data) response = urllib2.urlopen( '%s?%s' % (url,data)) return response.read().decode( 'utf-8' ) def posturl( self ,url,data,isjson = True ): if isjson: data = json.dumps(data) response = urllib2.urlopen(url,data) return response.read().decode( 'utf-8' ) def encodeurl( self , dict ): data = '' for k,v in dict .items(): data + = '%s=%s%s' % (k,v, '&' ) return data if __name__ = = '__main__' : if len (sys.argv) = = 4 : touser,notuse,content = sys.argv[ 1 :] else : print 'error segments, now exit' sys.exit() msgsender = WeChatMSG(content) access_token_response = msgsender.geturl(msgsender.gettoken_url, msgsender.gettoken_content) access_token = json.loads(access_token_response)[ 'access_token' ] sendmsg_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token print msgsender.posturl(sendmsg_url,msgsender.main_content) |
关于换行问题:
目录 返回
首页