Python脚本实现向飞书发送卡片消息

1 先创建一个卡片消息

飞书卡片搭建工具
在这里插入图片描述

根据自己的需要创建一个消息卡片:
在这里插入图片描述

可以在 卡片源代码 中看到这个卡片的代码信息
在这里插入图片描述

2 Python脚本

2.1 告警测试

test.py 文件

"""
飞书群机器人发送通知
"""
import time
import urllib3
import datetime
import json
import logging
import requests
from flask import Flask,jsonify,request

# 获取当前时间
# current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# 配置日志记录器
logging.basicConfig(level=logging.INFO)
Logger = logging.getLogger(__name__)

urllib3.disable_warnings()
webhook_url="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx"

class FlybookRobotAlert():
    def __init__(self):
        self.webhook = webhook_url
        self.headers = {"Content-Type": "application/json; charset=UTF-8"}

    def post_to_robot(self, post_data):
        '''
        给飞书机器人发送请求
        :param data:
        :return:
        '''
        try:
            resp = requests.request(method="POST", url=self.webhook, data=post_data, headers=self.headers).json()
            if resp.get("StatusCode") == 0 and resp.get("msg") == "success":
                Logger.info(f"飞书通知发送成功,msg={resp}")
            else:
                Logger.warning(f"飞书通知发送失败,{resp}")
        except Exception as e:
            Logger.warning("飞书通知发送异常")
            Logger.warning(e)
            pass

    def send_message(self, msg, color):

        # 飞书通知标题
        robot_headers = "LibreNMS告警"
       # msg:告警信息
       # color:来定义卡片的颜色

        execute_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

  
        # 定义卡片
        card = json.dumps({
            "config": {
                "wide_screen_mode": True
            },
            "i18n_elements": {
                                "zh_cn": [
                                        {
                                                "tag": "hr"
                                        },
                                        {
                                                "tag": "column_set",
                                                "flex_mode": "none",
                                                "horizontal_spacing": "default",
                                                "background_style": "default",
                                                "columns": [
                                                        {
                                                                "tag": "column",
                                                                "elements": [
                                                                        {
                                                                                "tag": "div",
                                                                                "text": {
                                                                                        "tag": "plain_text",
                                                                                        "content": msg,
                                                                                        "text_size": "normal",
                                                                                        "text_align": "left",
                                                                                        "text_color": "default"
                                                                                }
                                                                        }
                                                                ],
                                                                "width": "weighted",
                                                                "weight": 1
                                                        }
                                                ]
                                        }
                                ]
                        },
                        "i18n_header": {
                                "zh_cn": {
                                        "title": {
                                                "tag": "plain_text",
                                                "content": robot_headers
                                        },
                                        "subtitle": {
                                                "tag": "plain_text",
                                                "content": "时间:%s"%execute_time
                                        },
                                        "template": color
                                }
                        }
        })

        msg_body = json.dumps({"msg_type": "interactive", "card": card})
        self.post_to_robot(msg_body)
        # {'StatusCode': 0, 'StatusMessage': 'success', 'code': 0, 'data': {}, 'msg': 'success'}
        return





def main():
    msg="失败!!!"
    color = "red"
    if "恢复" in msg:
        color="green"

    web = FlybookRobotAlert()
    web.send_message(msg,color)
    
# 程序入口
if __name__ == "__main__":
        main()

运行:

# 在执行第一次的时候可能会报错没有模块,根据提示安装即可 
# 安装命令: pip install 模块名
python3 test.py 
INFO:__main__:飞书通知发送成功,msg={'StatusCode': 0, 'StatusMessage': 'success', 'code': 0, 'data': {}, 'msg': 'success'}

在这里插入图片描述

2.2 告警恢复

test.py 文件

"""
飞书群机器人发送通知
"""
import time
import urllib3
import datetime
import json
import logging
import requests
from flask import Flask,jsonify,request

# 获取当前时间
# current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# 配置日志记录器
logging.basicConfig(level=logging.INFO)
Logger = logging.getLogger(__name__)

urllib3.disable_warnings()
webhook_url="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx"

class FlybookRobotAlert():
    def __init__(self):
        self.webhook = webhook_url
        self.headers = {"Content-Type": "application/json; charset=UTF-8"}

    def post_to_robot(self, post_data):
        '''
        给飞书机器人发送请求
        :param data:
        :return:
        '''
        try:
            resp = requests.request(method="POST", url=self.webhook, data=post_data, headers=self.headers).json()
            if resp.get("StatusCode") == 0 and resp.get("msg") == "success":
                Logger.info(f"飞书通知发送成功,msg={resp}")
            else:
                Logger.warning(f"飞书通知发送失败,{resp}")
        except Exception as e:
            Logger.warning("飞书通知发送异常")
            Logger.warning(e)
            pass

    def send_message(self, msg, color):

        # 飞书通知标题
        robot_headers = "LibreNMS告警"
       # msg:告警信息
       # color:来定义卡片的颜色

        execute_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

  

        card = json.dumps({
            "config": {
                "wide_screen_mode": True
            },
            "i18n_elements": {
                                "zh_cn": [
                                        {
                                                "tag": "hr"
                                        },
                                        {
                                                "tag": "column_set",
                                                "flex_mode": "none",
                                                "horizontal_spacing": "default",
                                                "background_style": "default",
                                                "columns": [
                                                        {
                                                                "tag": "column",
                                                                "elements": [
                                                                        {
                                                                                "tag": "div",
                                                                                "text": {
                                                                                        "tag": "plain_text",
                                                                                        "content": msg,
                                                                                        "text_size": "normal",
                                                                                        "text_align": "left",
                                                                                        "text_color": "default"
                                                                                }
                                                                        }
                                                                ],
                                                                "width": "weighted",
                                                                "weight": 1
                                                        }
                                                ]
                                        }
                                ]
                        },
                        "i18n_header": {
                                "zh_cn": {
                                        "title": {
                                                "tag": "plain_text",
                                                "content": robot_headers
                                        },
                                        "subtitle": {
                                                "tag": "plain_text",
                                                "content": "时间:%s"%execute_time
                                        },
                                        "template": color
                                }
                        }
        })

        msg_body = json.dumps({"msg_type": "interactive", "card": card})
        self.post_to_robot(msg_body)
        # {'StatusCode': 0, 'StatusMessage': 'success', 'code': 0, 'data': {}, 'msg': 'success'}
        return





def main():
    msg="失败!!! 恢复了 !!"
    color = "red"
    if "恢复" in msg:
        color="green"

    web = FlybookRobotAlert()
    web.send_message(msg,color)
    
# 程序入口
if __name__ == "__main__":
        main()

运行后的:

# 在执行第一次的时候可能会报错没有模块,根据提示安装即可 
# 安装命令: pip install 模块名
python3 test.py 
INFO:__main__:飞书通知发送成功,msg={'StatusCode': 0, 'StatusMessage': 'success', 'code': 0, 'data': {}, 'msg': 'success'}

在这里插入图片描述

总结

使用python脚本发送卡片信息主要有两步:

  • 在飞书上创建一个机器人,获取webhook
  • 创建一个消息卡片,可以查到该卡片的代码
  • 写python脚本
    • 在执行python脚本时注意,最好可以在虚拟环境中执行
    • 第一次执行上述脚本时会报错:部分模块没有安装,根据提示安装完成即可
    • 安装模块命令: pip install XXXX

可以改进:现在支持通过卡片id来调用模板,不需要在代码中定义,还需要再研究,有想法的欢迎一起讨论。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值