xingyu655 发表于 2019-1-18 09:43:39

【全网首发】zabbix如何实现微信报警



       现实生产环境中,我们通常使用邮件和短信接受zabbix报警信息,但是邮件经常被工作人员搁置在角落中甚至被设置为垃圾邮件被过滤掉。公司的短信接口又太贵,复杂环境中使用短息报警会使运维成本增加很多。微信提供了很好的第三方接口,我们可以利用微信报警以求降低运维成本。
  

       微信的第三方接口要求我们先申请一个企业号——传送门:https://qy.weixin.qq.com/
http://s3.运维网.com/wyfs02/M00/72/28/wKiom1Xdse6jb8qUAAF-0yzIE1g187.jpg
  

(原文地址:http://wuhf2015.blog.运维网.com/8213008/1688614)
如何操作企业号?
      
1.通讯录添加企业成员


         我们要提前把成员信息添加进组织部门,必填项+手机号或者微信号,这样别人扫描二维码的时候才能成功关注企业号。
         注意:这里有两个我们要用到信息,一个组织部门的ID,一个部门成员的账号(账号是自己手动指定的,不同于微信号,最好是字母加数字)


http://s3.运维网.com/wyfs02/M01/72/25/wKioL1XdtBuiLXVDAAHDD0vrKSg634.jpg
  

http://s3.运维网.com/wyfs02/M00/72/25/wKioL1XdtDiRoKCMAAEqjKrZKFM976.jpg
  

  2.应用中心创建应用
  

           我们要在这里创建应用,因为要通过应用发送消息给部门成员
           注意:这里要记住一个值,应用ID
http://s3.运维网.com/wyfs02/M02/72/25/wKioL1XdtNrhy4ksAAJd_GEg0wk147.jpg
http://s3.运维网.com/wyfs02/M00/72/28/wKiom1XdssPyNpyLAAI64-XqmvU369.jpg
  

  3.给部门设置管理员
  

            设置--->功能设置---->权限管理---->新建管理组
            管理员必须事先已经关注了企业号,并且已经设置好邮箱地址
  

http://s3.运维网.com/wyfs02/M00/72/25/wKioL1XdtV-i5Ft8AACkSDs8ZW0789.jpg
           确定管理员可以读取通讯录,可以使用应用发消息。
           注意:我们需要管理员的CorpID和Secret
  

http://s3.运维网.com/wyfs02/M00/72/28/wKiom1Xds6SDdSG3AAGN6FJeAM4015.jpg
  我们要准备这些东西:

[*]  一个微信企业号
[*]  企业号已经被部门成员关注
[*]  企业号里有一个可以发消息的应用
[*]  一个授权管理员,可以使用该应用给成员发消息
  

  我们要取到这些信息:

[*]  成员账号
[*]  组织部门ID
[*]  应用ID
[*]  CropID
[*]  Secret
  

  

  如何调用微信接口?
  

         调用微信接口需要一个调用接口的凭证:access_token
         通过 :CropID 、Secret才能获取到access_token,但是获取到的token有效期为两分钟
  

http://s3.运维网.com/wyfs02/M01/72/29/wKiom1XdtwmAptH4AAIekhpqfOw154.jpg
http://s3.运维网.com/wyfs02/M02/72/25/wKioL1XduUfDu9g9AAJwVnPAkg0159.jpg
  

        微信企业号接口调试工具传送门:http://qydev.weixin.qq.com/debug
  

  

  

  Shell脚本原理
  

      使用:
      curl -s -Gurl         获取 AccessToken

      使用:
      curl --dataurl   传送凭证调用企业号接口
  

        zabbix会传递三个参数给脚本,$1是消息接收账号,$2报警标题,$3报警内容
  

#!/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=消息类型及数据格式
  

http://s3.运维网.com/wyfs02/M02/72/25/wKioL1XduubyRJFqAALsaQ9yC6k980.jpg
  

  

  将脚本放入zabbix默认执行路径下
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.创建媒介
http://s3.运维网.com/wyfs02/M01/72/25/wKioL1XdvA-S9ZIYAAI8gDsIkfo318.jpg
  

        2.创建用户
http://s3.运维网.com/wyfs02/M01/72/29/wKiom1XdujXzWXepAAL-lc57Odk945.jpg
  

  

  
        3.创建触发器动作发送内容
http://s3.运维网.com/wyfs02/M02/72/29/wKiom1XdumKQEbqcAAKcDc9wWjk131.jpg
  

        4.设置触发器动作发送方式

  
http://s3.运维网.com/wyfs02/M01/72/29/wKiom1XduoaCsgU4AANTb-Jnskg650.jpg
  

  

  收到的微信消息:
http://s3.运维网.com/wyfs02/M01/72/2A/wKiom1Xd2WeglciBAAHN6x1V2mk361.jpg
  

   附上python脚本
#!/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      
    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)  

  关于换行问题:
  
http://s3.运维网.com/wyfs02/M02/73/60/wKioL1X7vl7BvG5vAAD8zqecT6I165.jpg
http://s3.运维网.com/wyfs02/M02/73/63/wKiom1X7vCXByPQ4AACBj98qAPo353.jpg



页: [1]
查看完整版本: 【全网首发】zabbix如何实现微信报警