Loading... ## 前言 我们通常收到的报警,都是文字,是把动作中的消息内容当成了正文参数传给脚本,然后邮件或者微信进行接收,往往只能看到当前值,无法直观的获取到历史当天该监控项的运行曲线图,因此根据此需求,使用python编写脚本来分别对邮件告警和微信告警,进行升级,报警内容中加入了当天的历史趋势图,功夫不负有心人,已成功解锁,并实践成功,因此分享出来供大家参考。 ## 指导 ### 脚本代码 主要修改: * zabbix * zabbix连接 * 管理员账号 * 管理员密码 * 企业微信 * 企业ID * 应用的Secret ```python #!/usr/bin/python # encoding: utf-8 import sys import requests import json import os import time import re import logging logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别 filename='/var/log/zabbix/wxwork_new.log', filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志 #a是追加模式,默认如果不写的话,就是追加模式 format= '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s' #日志格式 ) zabbix_url = 'xxxxxxx' url = 'http://'+zabbix_url+'/zabbix/api_jsonrpc.php' headers = {'Content-Type': 'application/json-rpc'} graph_path = '/data/zabbix/images/' # 定义图片存储路径 graph_url = 'http://'+zabbix_url+'/zabbix/chart.php' # 定义图表的url loginurl = "http://'+zabbix_url+'/zabbix/index.php" # 定义登录的url def uploadImg(path,accessToken): #img_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=" + key + "&type=file" img_url = "https://qyapi.weixin.qq.com/cgi-bin/media/uploadimg?access_token="+accessToken files = {'media': open(path, 'rb')} r = requests.post(img_url, files=files) re = json.loads(r.text) print(re) return re['url'] def get_itemid(message): try: print(message) pattern = re.compile(ur'ITEMID:(\d+)') itemid = pattern.search(message).group(1) return itemid except Exception as e: return 0 def get_imgUrl(itemid): session = requests.Session() try: loginheaders = { "Host": zabbix_url, "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" } # 定义请求消息头 payload = { "name": '管理员账号', "password": '管理员密码', "autologin": "1", "enter": "Sign in", } # 定义传入的data login = session.post(url=loginurl, headers=loginheaders, data=payload) print(login) graph_params = { "from": "now-10m", "to": "now", "itemids[]": itemid, "width": "400", } # 定义获取图片的参数 graph_req = session.get(url=graph_url, params=graph_params) # 发送get请求获取图片数据 time_tag = time.strftime("%Y%m%d%H%M%S", time.localtime()) graph_name = 'baojing_' + time_tag + '.png' # 用报警时间来作为图片名进行保存 graph_name = os.path.join(graph_path, graph_name) # 使用绝对路径保存图片 with open(graph_name, 'wb', ) as f: f.write(graph_req.content) # 将获取到的图片数据写入到文件中去 return graph_name except Exception as e: print(e) return False def getAccessToken(): api_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企业ID&corpsecret=应用的Secret" content = requests.get(api_url) #print(content.json()) return content.json().get("access_token") def getImgUrl(mediaId,accessToken): api_url = "https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token="+accessToken+"&media_id="+mediaId content = requests.get(api_url) print(mediaId) print(content.json()) return content.json().get("url") def send_message(imgUrl,title,desc,openUrl,key): # 发送消息 url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + key # message = title # sys.argv[3] params = { "msgtype": "template_card", "template_card": { "card_type": "news_notice", "source": { "desc": "Zabbix网络警报", "desc_color": 0 }, "vertical_content_list":{ "title": "详细信息", "desc": desc }, "main_title": { "title": title }, "card_image": { "url": imgUrl }, "card_action": { "type": 1, "url": openUrl, "appid": "APPID", "pagepath": "PAGEPATH" } } } logging.info(json.dumps(params)); req = requests.post(url, data=json.dumps(params)) print(req.json()) def send_message_text(title,desc,openUrl,key): # 发送消息 url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + key # message = title # sys.argv[3] params = { "msgtype": "template_card", "template_card": { "card_type": "text_notice", "source": { "desc": "Zabbix网络警报", "desc_color": 0 }, "sub_title_text": desc, "main_title": { "title": title }, "card_action": { "type": 1, "url": openUrl, "appid": "APPID", "pagepath": "PAGEPATH" } } } logging.info(json.dumps(params)); req = requests.post(url, data=json.dumps(params)) print(req.json()) if __name__ == '__main__': message = sys.argv[2] print(message) itemid = get_itemid(message) if itemid == 0: send_message_text(sys.argv[1],sys.argv[2],"http://"+zabbix_url+"/zabbix/zabbix.php?action=dashboard.list",sys.argv[4]) else: imgpath = get_imgUrl(itemid) accessToken = getAccessToken(); imgUrl = uploadImg(imgpath,accessToken) print(imgUrl) send_message(imgUrl,sys.argv[1],sys.argv[2],imgUrl,sys.argv[4]) ``` 将脚本放入到:`/usr/lib/zabbix/alertscripts/wxcom.py` ### 设置报警媒介 ![](https://minio-api.open.yantao.wiki:16666/blog-image/2024/07/17/66979b024554a.png) xml模板文件下载:[点击下载](https://minio.open.yantao.wiki:16666/api/v1/buckets/blog-image/objects/download?prefix=2024%2F07%2F17%2Fzbx_export_mediatypes.xml) ### 设置企业微信机器人的webhook ![](https://minio-api.open.yantao.wiki:16666/blog-image/2024/07/17/66979bcf3122c.png) ## 效果展示 ![](https://minio-api.open.yantao.wiki:16666/blog-image/2024/07/17/66979be3ab7e6.png) 最后修改:2024 年 10 月 05 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏