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, json
import urllib3
import smtplib,sys,os,time,re,requests
from email.mime.image import MIMEImage
if 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 += "<br/> <img src=‘https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s‘>" % (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.text
def text_to_html(text): #将邮件内容text字段转换成HTML格式
    d=text.splitlines()
    #将邮件内容以每行作为一个列表元素存储在列表中
    html_text=‘‘
    for i in d:
        i=‘‘ + i + ‘<br>‘
        html_text+=i + ‘\n‘
    #为列表的每个元素后加上html的换行标签
    return html_text
def get_itemid():
    #获取报警的itemid
    itemid=re.search(r‘监控ID:(\d+)‘,sys.argv[3]).group(1)
    return itemid
def 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 False
if __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 测试效果

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



欢×××陈师傅”

原文地址:https://blog.51cto.com/12970189/2448442

时间: 2024-08-26 09:04:46

zabbix发送带图片的微信告警的相关文章

zabbix 发送带图片的报警信息到微信

过程比较复杂 先用curl到报警对于itemid的图片 将图片上传到微信企业号 去的微信的mediaid 在发送给客户端.代码还在整理中

C#调用微博api发送带图片微博,模拟http请求

public void SendWeibo( ) { try { StringBuilder data = new StringBuilder(); string url = "https://api.weibo.com/2/statuses/upload.json";//发送带图片的接口 string t_news = "测试微博--今天天气不错"; //微博 string source = "123456"; //申请得来的微博App Key

zabbix详解:(五)添加微信告警配置

新时代,新事物,前两年大伙还在想着怎么用短信告警比较合理的时候,这回微信告警已经悄悄进入人们视线,邮件报警就变得落后了,甚至有些大牛公司,微信告警还能做成图形告警,把监控图形也发上去,想当NB的架构. 添加微信告警配置: 微信告警的原理其实是利用微信企业号接口,把告警信息发送到微信企业号发布内容,然后关注这个企业号的微信用户就能收到微信信息了,达到了微信告警的结果. 所以我们要做的事情是: 第一,创建一个微信公众号 第二,写一个调用微信公众号接口的脚本 第三,在zabbix_web配置相关信息

[Java] JavaMail 发送带图片的 html 格式的邮件

JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的邮件. 发送纯文本的邮件可参照 JavaMail 简单案例. 具体例子 EmailHelper, Email 的帮助类,向帮助类提供 SMTP 服务器域名.用户名.密码.发送人邮箱.收件人邮箱.邮件主题.html 格式的内容.图片的路径,便可发送一份内置图片的邮件.在创建 MimeMultipart

Zabbix 3.4.6实现微信告警

一.注册企业微信准备发送消息python脚本 注册企业微信,获取CorpID 在企业微信中创建一个应用,获取AgentID和Secret 安装simplejson wget https://pypi.python.org/packages/f0/07/26b519e6ebb03c2a74989f7571e6ae6b82e9d7d81b8de6fcdbfc643c7b58/simplejson-3.8.2.tar.gz tar zxvf simplejson-3.8.2.tar.gz ; cd s

python之简单邮件发送(带图片)

#!/usr/bin/env python #coding: utf-8 by guozheng_li #该脚本是以图片作为内容发送的,没加入该说明前测试是正常可用的. import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage  mailto_list=['[email prote

使用Mail::Sender发送带图片的html邮件

需要指出的一定要保持编码的一致,否则会导致要么html乱码,或者主题乱码.如果有多个图片,可以采用多个Attach,html调用的图片名称为Attach中定义的. 效果图: #!/usr/bin/perl use strict; use warnings; use Config::Tiny; use FindBin; use Mail::Sender; my $configFile = "$FindBin::Bin/config.ini"; my $configNew = Config

java代码如何发送一封带图片的邮件

本章记录三个,1.java 发送普通的邮件  2.java发送带附件的邮件 3.java发送带图片的邮件 1.java发送普通邮件--首先要设置如下的几个具体的参数: public static String username = "***@163.com"; // 服务邮箱(from邮箱)public static String password = "*****"; // 邮箱密码public static String senderNick = "*

java带图片的邮件发送方法实现

package sendEmail; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Sessi