現實生產環境中,我們通常使用郵件和短信接受zabbix報警信息,但是郵件經常被工作人員擱置在角落中甚至被設置爲垃圾郵件被過濾掉。公司的短信接口又太貴,複雜環境中使用短息報警會使運維成本增加很多。微信提供了很好的第三方接口,我們可以利用微信報警以求降低運維成本。
微信的第三方接口要求我們先申請一個企業號——傳送門:https://qy.weixin.qq.com/
(原文地址:http://wuhf2015.blog.51cto.com/8213008/1688614)
如何操作企業號?
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報警內容
#!/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默認執行路徑下
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腳本
#!/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)
關於換行問題: