千家信息网

zabbix发送带图片的微信告警

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,zabbix发送带有图片的微信告警2.1 实现思路2.2 准备环境脚本是使用python脚本,运行环境为python 2.7.5依赖库提前安装:requests2.3 ×××tid,secret这部分
千家信息网最后更新 2024年11月27日zabbix发送带图片的微信告警

zabbix发送带有图片的微信告警

2.1 实现思路

2.2 准备环境

  • 脚本是使用python脚本,运行环境为python 2.7.5
  • 依赖库提前安装:requests

2.3 ×××tid,secret

这部分内容,可以查看前面不带图的文章有详细描述

2.4 脚本实现

#!/usr/bin/python#coding=utf-8_author__ = 'zhangdongdong'import requests, jsonimport urllib3import smtplib,sys,os,time,re,requestsfrom email.mime.image import MIMEImageif sys.getdefaultencoding() != 'utf-8':    reload(sys)    sys.setdefaultencoding('utf-8')urllib3.disable_warnings()class WechatImage(object): # 根据企业微信api接口文档,定义一个类,使用mpnews类型,https://qydev.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E7%B1%BB%E5%9E%8B%E5%8F%8A%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F    def get_token(self, corpid, secret): # 获取token        url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"        data = {"corpid": corpid,                "corpsecret": secret}        r = requests.get(url=url, params=data, verify=False)        token = r.json()['access_token']        return token    def get_image_url(self, token, path): # 上传临时素材图片,然后返回media_id        url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=image" % token        data = {"media": open(path, 'rb')}        r = requests.post(url=url, files=data)        dict_data = r.json()        return dict_data['media_id']    def get_messages( self,subject,content,path): #定义mpnews类型中的参数字典        data = ''        messages = {}        body = {}        content_html=text_to_html(content)        token = self.get_token(corpid, secret)        image = self.get_image_url(token, path)        content_html += "
" % (token, image) body["title"] = subject body['digest'] = content body['content'] = content_html body['thumb_media_id'] = image data = [] data.append(body) messages['articles'] = data return messages def send_news_message(self, corpid, secret,to_user, agentid,path): #定义发送mpnews类型的数据 token = self.get_token(corpid, secret) messages = self.get_messages( subject, content,path) url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % token data = {"toparty": to_user, # 企业号中的用户帐号 "agentid": agentid, # 企业号中的应用id "msgtype": "mpnews", "mpnews": messages, "safe": "0"} headers = {'content-type': 'application/json'} data_dict = json.dumps(data, ensure_ascii=False).encode('utf-8') r = requests.post(url=url, headers=headers, data=data_dict) return r.textdef text_to_html(text): #将邮件内容text字段转换成HTML格式 d=text.splitlines() #将邮件内容以每行作为一个列表元素存储在列表中 html_text='' for i in d: i='' + i + '
' html_text+=i + '\n' #为列表的每个元素后加上html的换行标签 return html_textdef get_itemid(): #获取报警的itemid itemid=re.search(r'监控ID:(\d+)',sys.argv[3]).group(1) return itemiddef get_graph(itemid): #获取报警的图表并保存 session=requests.Session() #创建一个session会话 try: loginheaders={ "Host":host, "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" } #定义请求消息头 payload = { "name":user, "password":password, "autologin":"1", "enter":"Sign in", } #定义传入的data login=session.post(url=loginurl,headers=loginheaders,data=payload) #进行登录 graph_params={ "from" :"now-10m", "to" : "now", "itemids" : itemid, "width" : "290", #图片的高宽参数 "height" : "40", } #定义获取图片的参数 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 Falseif __name__ == '__main__': user='Admin' #定义zabbix用户名 password='zabbix' #定义zabbix用户i密 graph_path='/usr/lib/zabbix/alertscripts/graph/' #定义图片存储路径,图片需要定时清理 graph_url='http://192.168.73.133/chart.php' #定义图表的url loginurl="http://192.168.73.133/index.php" #定义登录的url host='192.168.73.133' itemid=get_itemid() path =get_graph(itemid) to_user = str(sys.argv[1]) subject = str(sys.argv[2]) content = str(sys.argv[3]) corpid= "xxxxx" secret = "xxxxxxx" agentid = "1000002" wechat_img = WechatImage() wechat_img.send_news_message(corpid, secret,to_user, agentid, path)

2.5 定义报警媒介类型

打开zabbix监控web,在管理菜单中选择报警媒介类型,创建媒体类型,选择脚本,填写刚才编写的微信带图脚本名称zabbix_weixin_pic.py,脚本参数,最后添加


打开管理中的用户,点击需要设置邮件告警的用户,然后在报警媒介中添加报警媒介,在弹框中选择刚才定义的类型,然后填写企业微信中创建的部门id,最后添加

2.6 定义告警动作

  • 点击配置菜单中的动作,创建动作,然后根据图片进行填写
操作默认标题 Zabbix告警:副务器:{HOSTNAME}发生: {TRIGGER.NAME}故障!监控ID:{ITEM.ID}告警主机:{HOST.NAME}告警主机:{HOST.IP}告警时间:{EVENT.DATE} {EVENT.TIME}告警等级:{TRIGGER.SEVERITY}告警信息: {TRIGGER.NAME}告警项目:{TRIGGER.KEY}问题详情:{ITEM.NAME}:{ITEM.VALUE}当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}事件ID:{EVENT.ID}恢复操作Zabbix告警:副务器:{HOST.NAME}发生: {TRIGGER.NAME}已恢复!监控ID:{ITEM.ID}告警主机:{HOST.NAME}告警主机:{HOST.IP}告警时间:{EVENT.DATE} {EVENT.TIME}告警等级:{TRIGGER.SEVERITY}告警信息: {TRIGGER.NAME}告警项目:{TRIGGER.KEY}问题详情:{ITEM.NAME}:{ITEM.VALUE}当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}事件ID:{EVENT.ID}



2.7 测试效果

可以手动触发一个报警测试效果,手机上就可以收到带图的报警了,点击消息之后的页面也可以看到历史的图片


欢×××陈师傅"

图片 报警 类型 脚本 用户 主机 企业 参数 媒介 监控 内容 动作 数据 时间 邮件 选择 事件 信息 元素 图表 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 合肥正规网络技术咨询联系人 JDBC数据库两个步骤 我的世界服务器怎么关闭语音助手 网络安全违规清单 打电话总是显示无法连接服务器 西安乐驰天下网络技术有限公司 无锡自动软件开发定制价格 宜宾学院数据库试题 我们该怎么保护网络安全 提高网络安全防御能力 数据库查询表的大小 向境外支付软件开发费 什么服务器好 安全教育网络安全手抄报 安卓应用软件开发费用多少 文献搜索引擎和数据库的区别 高新区运营网络技术咨询热线 辽宁服务器租用虚拟主机 硬件基础知识软件开发 ddl操作数据库删除索引 高中生网络安全板报图片 联发科 软件开发面试 e5服务器cpu可以建模吗 自己搭建10000小型服务器 青海医院时钟监控网关服务器 gis 选中属性创建数据库 p图的软件开发 软件开发四技服务是什么 服务器主机如何安装win7 用友u8数据库如何取消两清
0