【全網首發】zabbix如何實現微信報警


       現實生產環境中,我們通常使用郵件和短信接受zabbix報警信息,但是郵件經常被工作人員擱置在角落中甚至被設置爲垃圾郵件被過濾掉。公司的短信接口又太貴,複雜環境中使用短息報警會使運維成本增加很多。微信提供了很好的第三方接口,我們可以利用微信報警以求降低運維成本。


       微信的第三方接口要求我們先申請一個企業號——傳送門:https://qy.weixin.qq.com/

wKiom1Xdse6jb8qUAAF-0yzIE1g187.jpg



(原文地址:http://wuhf2015.blog.51cto.com/8213008/1688614)

如何操作企業號?

        

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報警內容


#!/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=消息類型及數據格式


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.創建媒介

wKioL1XdvA-S9ZIYAAI8gDsIkfo318.jpg


        2.創建用戶

wKiom1XdujXzWXepAAL-lc57Odk945.jpg



        3.創建觸發器動作發送內容

wKiom1XdumKQEbqcAAKcDc9wWjk131.jpg


        4.設置觸發器動作發送方式

wKiom1XduoaCsgU4AANTb-Jnskg650.jpg




收到的微信消息:

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[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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章