• zabbix如何实现微信报警 转载


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

           微信的第三方接口要求我们先申请一个企业号——传送门:https://qy.weixin.qq.com/

    wKiom1Xdse6jb8qUAAF-0yzIE1g187.jpg


    如何操作企业号?

            

    1.通讯录添加企业成员

               我们要提前把成员信息添加进组织部门,必填项+手机号或者微信号,这样别人扫描二维码的时候才能成功关注企业号。

               注意:这里有两个我们要用到信息,一个组织部门的ID,一个部门成员的账号(账号是自己手动指定的,不同于微信号,最好是字母加数字)

    wKioL1XdtBuiLXVDAAHDD0vrKSg634.jpg

    wKioL1XdtDiRoKCMAAEqjKrZKFM976.jpg

    2.应用中心创建应用

               我们要在这里创建应用,因为要通过应用发送消息给部门成员

               注意:这里要记住一个值,应用ID

    wKioL1XdtNrhy4ksAAJd_GEg0wk147.jpg

    wKiom1XdssPyNpyLAAI64-XqmvU369.jpg

    3.给部门设置管理员

              设置--->功能设置---->权限管理---->新建管理组

              管理员必须事先已经关注了企业号,并且已经设置好邮箱地址

    wKioL1XdtV-i5Ft8AACkSDs8ZW0789.jpg

             确定管理员可以读取通讯录,可以使用应用发消息。

             注意:我们需要管理员的CorpID和Secret

    wKiom1Xds6SDdSG3AAGN6FJeAM4015.jpg

    我们要准备这些东西:

    •     一个微信企业号

    •     企业号已经被部门成员关注

    •     企业号里有一个可以发消息的应用

    •     一个授权管理员,可以使用该应用给成员发消息

    我们要取到这些信息:

    •     成员账号

    •     组织部门ID

    •     应用ID

    •     CropID

    •     Secret


    如何调用微信接口?

           调用微信接口需要一个调用接口的凭证:access_token

           通过 :CropID 、Secret  才能获取到access_token,但是获取到的token有效期为两分钟

    wKiom1XdtwmAptH4AAIekhpqfOw154.jpg

    wKioL1XduUfDu9g9AAJwVnPAkg0159.jpg

            微信企业号接口调试工具传送门: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 '{ '
            printf ' "touser": "'"$UserID""", "
            printf ' "toparty": "'"$PartyID""", "
            printf ' "msgtype": "text", '
            printf ' "agentid": "'" $AppID """, "
            printf ' "text": { '
            printf ' "content": "'"$Msg""" "
            printf ' }, '
            printf ' "safe":"0" '
            printf '} '
    }
    /usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL

    为什么要这样写脚本?

          因为微信企业号开放的端口有固定的格式限制

          企业号支持的格式:http://qydev.weixin.qq.com/wiki/index.php?title=消息类型及数据格式

    wKioL1XduubyRJFqAALsaQ9yC6k980.jpg

    将脚本放入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.创建媒介

    wKioL1XdvA-S9ZIYAAI8gDsIkfo318.jpg

            2.创建用户

    wKiom1XdujXzWXepAAL-lc57Odk945.jpg

            3.创建触发器动作发送内容

    wKiom1XdumKQEbqcAAKcDc9wWjk131.jpg

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

    wKiom1XduoaCsgU4AANTb-Jnskg650.jpg


    收到的微信消息:

    wKiom1Xd2WeglciBAAHN6x1V2mk361.jpg


     附上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)

    关于换行问题:

    wKioL1X7vl7BvG5vAAD8zqecT6I165.jpg

    wKiom1X7vCXByPQ4AACBj98qAPo353.jpg

  • 相关阅读:
    搭建VueMint-ui框架
    vue项目创建
    jQuery选择器总结
    位运算
    Hash哈希
    并发编程(六)并发容器
    并发编程(五)AQS
    并发编程(四)显示锁
    Java中的几种代码块
    并发编程(三)原子操作CAS
  • 原文地址:https://www.cnblogs.com/liqing1009/p/4977105.html
Copyright © 2020-2023  润新知