ZABBIX对接飞书实现带图片的报警通知

飞书提供了丰富的api来实现消息的通知,包括文本消息、图片消息、富文本消息,本次介绍使用飞书api发送富文本消息,以下是实现思路
飞书API地址:https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM

实现思路

1.根据正则获取监控项id,需要在动作中定义报警信息
2.根据获取的监控项id构造请求获取图片地址,并下载到本地
3.需要获取三个授权凭证

  • app_access_token :访问App资源相关接口。
  • tenant_access_token :访问企业资源相关接口。
  • user_access_token :访问用户资源相关接口。

4.根据zabbix报警的收信人手机号获取user_id,用于后面在群里@相关负责人,或者直接发给某个责任人
5.chat_id用于发送给指定的群,这里我提供两种方法获取chat_id,后面会介绍
6.上传本地图片到飞书,并获取img_key,image_key用于发送图片信息
7.传入zabbix报警消息,并艾特相关负责人发送到飞书群里或者个人

获取itemID

利用正则匹配报警信息中的itemID

def get_itemid():
    #获取报警的itemid
    itemid=re.search(r‘ITEM ID:(\d+)‘,sys.argv[3]).group(1)
    return itemid

获取报警图片地址

根据传入的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" : "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

获取授权凭证

1.获取 App ID 和 App Secret

登录开发者后台,在“我的应用”页面创建企业自建应用。进入企业自建应用详情页,获取App ID和App Secret。

2.获取 tenant_access_token

一种方法是通过企业自建应用方式获取,另一种是通过应用商店应用获取,这里我使用第一种方法,直接创建应用即可

3.创建完应用后可根据APP ID和 App Secret构造请求获取

def gettenant_access_token():
    tokenurl="https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"
    headers={"Content-Type":"application/json"}
    data={
        "app_id":"cli_9ec625abcdefg",
        "app_secret":"f716Gi27Yi25n5K0Wbafgwghhstv"

    }
    request=requests.post(url=tokenurl,headers=headers,json=data)
    response=json.loads(request.content)[‘tenant_access_token‘]
    return response

获取user_id

user_id可以根据注册的手机号或邮箱获取,可以在zabbix中定义用户的手机号,然后传入参数获取user_id

def getuserid(tenant_access_token):
    #mobiles="15101234584"
    userurl="https://open.feishu.cn/open-apis/user/v1/batch_get_id?mobiles=%s"%mobiles
    headers={"Authorization":"Bearer %s"%tenant_access_token}
    request=requests.get(url=userurl,headers=headers)
    response=json.loads(request.content)[‘data‘][‘mobile_users‘][mobiles][0][‘user_id‘]
    return response

获取chat_id

这里我提供两种方法获取chat_id,一种是将机器人加入到群里,获取群信息中的chat_id;另一种是通过机器人创建群聊获取群信息,当然还有其他的方法,这里我就不过多介绍了,我将使用第一种方法来获取chat_id

首先将机器人加入到群聊

构造请求获取chat_id

def getchatid(tenant_access_token):
    #获取chatid
    chaturl="https://open.feishu.cn/open-apis/chat/v4/list?page_size=20"
    headers={"Authorization":"Bearer %s"%tenant_access_token,"Content-Type":"application/json"}
    request=requests.get(url=chaturl,headers=headers)
    response=json.loads(request.content)[‘data‘][‘groups‘][0][‘chat_id‘]
    return response

通过api向飞书上传报警图片

通过上传报警图片,会获取到一个image_key,用于发送富文本消息的图片信息

def uploadimg(tenant_access_token,graph_name):
    with open(graph_name,‘rb‘) as f:
        image = f.read()
    imgurl=‘https://open.feishu.cn/open-apis/image/v4/put/‘
    headers={‘Authorization‘: "Bearer %s"%tenant_access_token}
    files={
            "image": image
        }
    data={
            "image_type": "message"
        }

    resp = requests.post(
        url=imgurl,
        headers=headers,
        files=files,
        data=data)
    resp.raise_for_status()
    content = resp.json()
    return content[‘data‘][‘image_key‘]

向飞书群里或者飞书用户发送消息

这里需要四个参数,分别是user_id、chat_id、tenant_access_token和image_key,并传入报警信息即可发送

def sendmes(user_id,chat_id,tenant_access_token,image_key):
    sendurl="https://open.feishu.cn/open-apis/message/v4/send/"
    headers={"Authorization":"Bearer %s"%tenant_access_token,"Content-Type":"application/json"}
    #向群里发送富文本消息
    data={
        "chat_id":chat_id,
        "msg_type":"post",
        "content":{
            "post":{
                "zh_cn":{
                    "title":subject,
                    "content":[
                        [
                        {
                            "tag": "text",
                            "un_escape": True,
                            "text": messages
                        },
                        {
                            "tag": "at",
                            "user_id": user_id

                        }
                    ],
                    [
                        {
                            "tag": "img",
                            "image_key": image_key,
                            "width": 700,
                            "height": 400
                        }
                    ]
                ]
            }
        }
    }
    }

    request=requests.post(url=sendurl,headers=headers,json=data)
    print(request.content)

在ZABBIX上配置报警动作及接收人

配置报警媒介类型

注意参数顺序不能乱

配置用户的接收信息

也就是用户注册飞书的手机号

配置动作

报警测试

这里我禁掉了其中一台windows的agent进行测试


后续会添加带有图片信息的报警,完整代码请访问github组织遮阳笔记
https://github.com/sunsharing-note/zabbix/blob/master/feishu_img.py



欢迎关注个人公号“没有故事的陈师傅”

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

时间: 2024-11-10 08:35:10

ZABBIX对接飞书实现带图片的报警通知的相关文章

ZABBIX对接飞书实现报警通知

飞书提供了丰富的api来实现消息的通知,包括文本消息.图片消息.富文本消息,本次介绍使用飞书api发送文本消息,以下是实现思路飞书API地址:https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM 实现思路 1.需要获取三个授权凭证 app_access_token :访问App资源相关接口. tenant_access_token :访问企业资源相关接口. user_access_token :访问用户资源相关接口. 2.根据

Zabbix配置钉钉的带图片报警

实现思路: 首先报警信息里要有itemid,这是前提,根据信息里传入的参数使用正则匹配到itemid 构建一个session会话,或者使用cookie来进行登录,根据itemid去请求图片,并将获取到的图片保存到本地,由于markdown的图片链接需要被访问到,我的zabbix是在内网中,所以需要将图片传到图床或者传到一个具有公网IP的web服务器,我这里传到了我的个人服务器 将报警信息转换成markdown语法格式 构造请求利用钉钉的webhook发送消息 设置钉钉机器人 钉钉机器人需要进行安

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

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

elasticsearch搭建与zabbix对接

一. 搭建elasticsearch 上传jdk-8u181-linux-x64.tar.gz和elasticsearch-6.1.4.tar.gz文件到系统任意目录, 安装java解压jdk-8u181-linux-x64.tar.gz文件tar -zxvf jdk-8u181-linux-x64.tar.gz 编辑profile文件,添加jdk环境变量vim /etc/profile 在最后添加#JDK环境变量 JAVA_HOME=/usr/local/jdk1.8.0_181 CLASSP

非微信图文网页,微信浏览器点击图片弹出自带图片浏览 (原创请勿转载)

微信图文网页点击插入的图片,会在微信的图片浏览器上浏览图片可以放大缩小,但是自己做的网页没有这个功能,下面我就来介绍一下这个功能,做出一个完美一点的demo.如果不想看过程直接到最后看demo... 教程需要:脚本编辑器(记事本或者是notepad++.DW都可以).jquery.js.微信浏览器作为测试 如下图效果 我们用到的是微信内置JsAPI的一个,这个函数在微信的开发者平台文档里我没有找到,是在网上搜到的. WeixinJSBridge.invoke('imagePreview',{  

JavaScript函数实现鼠标指向后带图片的提示效果

转载:http://www.cnblogs.com/jack86514/archive/2009/04/01/1427584.html 当我们在写一个网页程序的时候,很多方法可以提供页面的动态显示,从而提高页面的视觉效果. 本例就是通过一个简单的Javascript代码动态显示图片的信息的,其实这样的例子很多,所以这里只做简单的说明了. 现在就创建一个页面,代码如下所示: <html> <head> <meta http-equiv="Content-Type&qu

Android开发系列(二十三):实现带图片提示的Toast提示信息框

Android中的Toast是很常见的一个消息提示框,但是默认的消息提示框就是一行纯文本,所以我们可以为它设置一些其他的诸如是带上图片的消息提示. 实现这个很简单: 就是定义一个Layout视图,然后设置Toast显示自定义的View. 在这里,就是设置了一个LinearLayout容器,然后给这个容器添加图片,添加文字信息.然后把这个容器设置给Toast对象,让其显示出来. 首先创建一个Android项目,然后我们编辑下main.xml文件: <span style="font-size

带图片的Toast

项目快结束了,终于有空可以总结下在开发中遇到的一些问题. 需要在文字的左侧显示图片 效果图如下: 用了两种方式实现: 一.自定义 1.新建一个xml布局 item_toast: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:l

android ListView SimpleAdapter 带图片

main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android: