如何用Python发送告警通知到钉钉?

一、前言

前不久,看到了明哥写的如何用Python发送警告通知到企业微信,想起来之前写过用Pytho发送指定格式数据到钉钉的服务,本文将之前的代码重构下,变成一个:利用Python监控服务器数据,然后有异常就通过钉钉发送给用户。

本项目大纲如下,项目已经开源到GitHub啦,大家可以直接点击阅读原文或者浏览器访问:​ ​https://github.com/XksA-me/DingdingBot​ ​ 下载项目。

项目环境说明:

  • Python 3.6.8 (理论3.6及以上肯定可以)
  • 第三方依赖库:
  • - requests 发送post请求,发送数据
  • - psutil 获取操作系统运行相关数据
  • - apscheduler 设置定时任务

因为相关依赖较少,你可以直接在本地环境安装使用,也可以创建一个虚拟环境安装使用(Python虚拟环境推荐使用pipenv进行管理,​ ​点击我查看pipenv使用教程​ ​)。 进入环境后,输入下面pip指令进行安装:

pip3 install requests psutil apschedule

二、开始动手动脑

2.1 创建钉钉机器人

钉钉机器人个人版只针对群聊,所以我们需要先建一个群,打开钉钉,然后创建一个群聊,随便拉2个人,创建成功后,可以把这两个好友再移除群聊(有点损?!),点击群设置中的​ ​智能群助手​ ​。

进入到机器人管理页面,点击添加机器人后的​ ​三点按钮​ ​,进入机器人选择页面。

我们下滑页面,选择​ ​自定义​ ​机器人。

给机器人取个名字,然后需要进行安全设置,选择加签方式(数据传输是需要其当作参数,避免安全问题),复制好里面的内容。点击完成,即可​ ​完成​ ​创建。

复制Webhook链接,后面我们就是通过Python向这个url发送post请求进行数据传输,你可以点击下​ ​设置说明​ ​查看机器人相关功能和配置方法。

如果后面忘记了前面设置的​ ​加签​ ​密钥或者​ ​Webhook​ ​地址,可以​ ​群管理​ ​->​ ​智能群助手​ ​->点击对应机器人的​ ​三点按钮​ ​ 查看或修改。

这样我们就创建好了钉钉机器人,接下来,我们只需编编写好Python代码即可。

2.2 编写一个简单钉钉消息传输助手

2.2.1 计算数字加签内容,为自动发送消息做准备

前面我们设置了​ ​加签​ ​的安全防护方法,所以我们在进行数据传输之前,首先得先计算下钉钉机器人数字签名内容,钉钉文档上有非常详细的说明哈,并给了各种语言的计算方法,我们直接拿来调试即可。 官方文档地址:https://developers.dingtalk.com/document/robots/customize-robot-security-settings

计算过程你可以不用理解(下面代码),修改​ ​secret​ ​为你自己的即可。

import hmac
import hashlib
import base64
import urllib.parse
from time import time
'''
钉钉机器人数字签名计算
'''
def get_digest():# 取毫秒级别时间戳,round(x, n) 取x小数点后n位的结果,默认取整timestamp = str(round(time() * 1000))secret = '你自己的加签内容'secret_enc = secret.encode('utf-8')  # utf-8编码string_to_sign = '{}\n{}'.format(timestamp, secret)  # 字符串格式化拼接string_to_sign_enc = string_to_sign.encode('utf-8')  # utf-8编码hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()  # HmacSHA256算法计算签名sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))  # Base64编码后进行urlEncode#  返回时间戳和计算好的编码拼接字符串,后面直接拼接到Webhook即可return f"&timestamp={timestamp}&sign={sign}

2.2.2 Post请求发送数据,实现自动发送消息到钉钉

我们直接向我们自己的Webhook地址发送post请求传输数据即可,这里我使用的markdown数据类型,还有很多其他数据格式可以选择,如文本、跳转卡片、信息流卡片等,非常丰富。 大家有兴趣可以前往官网查看:https://developers.dingtalk.com/document/robots/custom-robot-access?spm=ding_open_doc.document.0.0.62846573TCzj7A#topic-2026027 需要注意的是,如果你需要机器人在发送消息的时候还@指定的人,那么你需要在内容中(下面代码中的​ ​@xxxxxx​ ​)也加上​ ​@指定人的钉钉手机号​ ​。

# 简单发送markdown消息
def warning_bot():data = {"msgtype": "markdown","markdown": {"title": "【简说Python】今日福利","text": """### 福利介绍
@xxxxxx 请关注公众号:<strong>简说Python</strong>,回复2021,即可获取编程学习资料。\n
>![](https://img-blog.csdnimg.cn/246a90c55c4e46dca089731c5fd00833.png)
<strong>[老表的个人博客,已上线](https://python-brief.com/)</strong>\n"""},"at": {"atMobiles": ["xxxxxx"  # 要@对象的手机号],}}# 机器人链接地址,发post请求 向钉钉机器人传递指令webhook_url = '你的Webhookurl'# 利用requests发送post请求req = requests.post(webhook_url+get_digest(), json=data)

显示效果如下(上面是聊天消息栏,显示了我们指定的标题;下面是群聊内,显示了markdown渲染后的效果),好看,记得点赞(想不到,到这里,就有一千字了~点赞呐 转发呐 支持下作者~):

2.3 编写统计系统基本数据的函数

在Linux里我们一般利用​ ​top​ ​指令来查看CPU的使用情况,主要看以下几个数据:进程CPU使用率、负载情况、虚拟/物理内存使用情况,所以本部分我们将利用Python获取相关数据。

这里我们利用​ ​psutil​ ​,Process and System utilities(进程和系统实用工具),用于检索系统运行的进程和系统使用率(CPU,内存,磁盘,网络,传感器)信息的跨平台库,通过几行代码就可以获取到本地系统相关数据啦~(本文点赞过50,就更新一期专门介绍​ ​psutil​ ​的文章)~

import psutil as psu
import os
'''
云服务器基础数据
服务器已运行时间、负载状态、CPU使用率、运行内存使用率、物理内存使用率
'''
def get_server_info():# 获取系统的基本数据# 服务器已运行时间=现在时间和服务器开启时间之差run_times = str(timedelta(seconds=int(time())-int(psu.boot_time())))# 系统负载状态(最近1、5、15分钟)loadavg = [round(i, 2) for i in os.getloadavg()]# CPU使用率 测试间隔0.3秒cpu_in_use = psu.cpu_percent(interval=0.3)# 系统运行内存使用率# 内存使用率大于80% 触发报警vm_in_use = psu.virtual_memory().percentvm_available = round(psu.virtual_memory().available/(1024<strong>3), 2)# 系统物理存储使用率disk_in_use = psu.disk_usage('/').percentdisk_free = round(psu.disk_usage('/').free/(1024</strong>3), 2)# 还可以添加进程、线程等信息,后面专门安排一篇文章写base_info = f"""> 您的云服务器已运行-{run_times},机器负载情况为(最近1、5、15分钟):{loadavg}
- 目前CPU使用率为:{cpu_in_use}%,
- 系统运行内存使用率为:{vm_in_use}%,
- 剩余可用运行内存为:{vm_available}GiB,
- 系统存储内存使用率为:{disk_in_use}%,
- 剩余可用存储内存为:{disk_free}GiB
<br><strong>{'机器CPU使用率正常' if cpu_in_use<=80 else '机器CPU使用率过高,可能触发预警'}</strong>
"""return base_info, loadavg, cpu_in_use, vm_in_use, disk_in_us

代码注释写的都还比较清楚啦,主要是调用了psutil内置的一些方法,我们获取到了操作系统的一些基本数据,另外系统负载情况我们是利用os模块的内置方法​ ​getloadavg​ ​获取的,最后对数据进行了拼接,拼接的时候我们使用到了 f-string , 点赞破50出一期文章给大家介绍 ,这里主要给大家额外说下GB和GiB的区别:

1GB = 1000MB = 1000*1000 KB = 1000*1000*1000 B
1GiB = 1024MiB = 1024*1024 KiB = 1024*1024*1024 B
# 有机会和大家细聊 有意

2.4 编写一个监控数据的函数

接下来我们还需要写一个监控函数,这里只做了两个简单监控(项目已开源,后面有时间我也会),一个是对负载的情况进行监控,另外一个是对CPU使用率进行监控,设置了两个阀值:CPU使用率70%和负载(1分钟和15分钟)70%*CPU数量,当超过阀值就返回对应报警内容,没有问题就返回​ ​ok​ ​。

'''
服务器预警设置
本篇先简单点,只设置负载和CPU使用率预警
'''
def get_warning():base_info, loadavg, cpu_in_use, vm_in_use, disk_in_use = get_server_info()# 首先判断服务器负载情况# 只看近一分钟和近十五分钟情况 应该<= 0.7*CPU数量loadavg_max = psu.cpu_count() * 0.7loadavg_max = 0.01   # 测试使用,正式环境请注释掉if loadavg[0] >= loadavg_max and loadavg[2] >= loadavg_max:warning1 = f':warning:<font color="#d30c0c">【警告】</font>您的云服务器当前负载率为(最近1、5、15分钟)-{loadavg},负载率已达<font color="#d30c0c">{round(loadavg[2]/loadavg_max, 2)*100}%</font>,请及时检查系统是否存在问题,也可以@我,发送:基础信息,查看云服务器基础信息。'return warning1if cpu_in_use >= 80:warning2 = f':warning:<font color="#d30c0c">【警告】</font>您的云服务器当前CPU使用率为<font color="#d30c0c">{cpu_in_use}%</font>,请及时检查系统是否存在问题,也可以@我,发送:基础信息,查看云服务器基础信息。'return warning2return 'ok'

本来还想写一个功能的,就是前面说的时时查看数据(@下机器人,给出对应指令就行),但是到这里发现这个功能需要新建一个企业机器人,下次再给大家分享吧~

2.5 写定时任务

在Linux上面,我们可以直接利用之前讲过的宝塔面板设置定时任务,可以看​ ​Linux里的宝塔,真正的宝塔!详细教程​ ​,这里我们自己写定时任务,我们用到了​ ​apscheduler​ ​这个第三方库,关于这个库又可以写一篇长文介绍了,这里就不展开说了,本文点赞如果破100,我下周安排(老表在线卑微求赞!)。

from apscheduler.schedulers.blocking import BlockingScheduler
'''
1、每天早上9:00 发送服务器情况到钉群
'''
def every_day_nine():message = get_server_info()[0]title = '服务器基础信息'warning_bot(message, title)
'''
2、时时预警(每30秒检测一次)
'''
def every_seconds_30():warning = get_warning()if warning != 'ok':title = '【:warning:警告】服务器故障'warning_bot(warning, title)
'''
3、@机器人,自动问答设置
下一篇安排,需要另外新建一个企业机器人
和群聊机器人流程不一样~
'''# 选择BlockingScheduler调度器
sched = BlockingScheduler(timezone='Asia/Shanghai')
# job_every_nine 每天早上9点运行一次  日常发送
sched.add_job(every_day_nine, 'cron', hour=21, minute=55)
# every_seconds_30 每30s执行一次  数据监控
sched.add_job(every_seconds_30, 'interval', seconds=3)
# 启动定时任务
sched.start(

add_job设置定时任务中的​ ​interval​ ​表示周期性触发触发,比如每分钟;​ ​cron​ ​是apscheduler中功能最强的触发器,可以具体到每个月的某个时间触发,比如每天早上9:00。

2.6 运行,来看看效果啦

目前都属于自动触发,然后发送消息,首先是每日定时早上9:00发送服务器基本情况。 其次是每30s进行一次服务器数据检测(CPU使用率和负载),当数据超过阀值时,触发报警,发送消息提醒。

2.7 给程序创建守护进程

经过上面我们完成了功能开发,但是会发现,一旦我们关闭程序,提醒监测服务也会停止,所以我们需要创建一个守护进程来保护我们的进程。 以我自己为例,我们登录宝塔面板后,进入​ ​/etc/systemd/system​ ​文件夹下,新建一个​ ​ding_bot.service​ ​文件,并写入下面内容:

[Unit]
Description=Dingding Bot service
[Service]
Type=forking
ExecStart=/usr/bin/python3 /root/Project/Little_project/DingdingBot/scheduler.py
KillMode=process
Restart=on-failure
RestartSec=3s
[Install]
WantedBy=multi-user.targe

简单解释下​ ​Service​ ​里设置的含义,​ ​Type=forking​ ​表示程序启动后,会放到后台运行;​ ​ExecStart​ ​服务的具体执行指令(执行scheduler.py文件即可);​ ​KillMode=process​ ​表示服务停止的同时也会杀死程序主进程;​ ​Restart=on-failure​ ​表示系统发生意外导致程序退出时,程序自动重启。 保存好文件后,我们直接终端内执行下面指令即可开启进程守护,运行后会进入守护进程状态,我们可以按ctrl+c退出,不会影响守护进程:

systemctl start ding_bo

代码修改后,需要重启守护进程,修改代码才会生效,重启指令如下:

systemctl restart ding_bo

如果不想设置这个守护进程了,执行stop指令可以停止该service(程序也会停止),指令如下:

systemctl stop ding_bo

#yyds盘点#如何用Python发送告警通知到钉钉?相关推荐

  1. 如何用Python发送通知到微信?

    来源丨网络 一.通知方式有哪些? 常见的通知方式有:邮件,电话,短信,微信.短信和电话:通常是收费的,较少使用:邮件:适合带文件类型的通知,较正式,存档使用:微信:适合告警类型通知,较方便.这里说的微 ...

  2. 如何用 Python 发送通知到微信?

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货,第一时间送达!!! 来源丨网络 一.通知方式有哪些? 常见的通知方式有:邮件,电话,短信,微信 ...

  3. 通过PostMan或Python发送Firebase通知

    通过PostMan或Python发送Firebase通知 一.背景: 项目测试通知直接打开项目Firebase控制台->Cloud Messaging一栏中新建通知,然后发送通知;每次都需要打开 ...

  4. 【Python】如何用Python发送SMTP邮件

    [背景] 自动发送邮件通知是流成自动化系统必备的功能,今天介绍如何用Python实现. [代码] 这里以163邮箱为例 def send_smtp_mail(host="smtp.163.c ...

  5. 可以检测网页被篡改并发送告警通知的工具——WGCLOUD

    WGCLOUD是一个高性能的分布式监控系统,server基于springboot架构开发,agent采用go开发,核心模块包括:主机监控,ES集群监控,CPU监控,CPU温度监控,大屏看板,docke ...

  6. 【转载】如何用Python发送Email邮件?

    文章目录 综述 连接SMTP服务器 登录SMTP服务器 如何获得邮箱授权码 通过SSL登录SMPT服务器 发送\抄送文本邮件 密送文本邮件 发送HTML邮件 参考 综述 用代码发送Email,在很多场 ...

  7. 如何用python发送SMTP邮件(基于QQ邮箱)亲测可用

    第一步 首先我们要在QQ邮箱开通SMTP邮件,并生成授权码 设置->账户->生成授权码 通过绑定手机发送短信生成授权码,并保存授权码,一系列英文字母(等会要用) 第二步 确保自己的计算机名 ...

  8. python 发送带附件邮件到钉钉邮箱+邮件内容带有表格

    import smtplib import pandas as pd # smtplib这个模块是管发邮件 from email.mime.text import MIMEText # 构造邮件内容 ...

  9. 如何用 Python 自动发送微博?

    一.软件准备 1.安装Python 环境 首先需要你的电脑安装好了Python环境,并且安装好了Python开发工具. 如果你还没有安装,可以参考以下文章: 如果仅用Python来处理数据.爬虫.数据 ...

最新文章

  1. 获得汉字拼音的首字母
  2. JBoss Seam 3.0.0.Beta2 发布
  3. nginx四层端口转发
  4. 7-69 字母图形 (15 分)
  5. RedHat虚拟机Vmware Tools的安装教程
  6. Android之提示androidx.recyclerview.widget.LinearLayoutManager@51ddcd is already attached to a RecyclerV
  7. Cinchoo ETL-对大型CSV文件进行排序
  8. new和delete创建和销毁二维数组
  9. vue 查看变量类型_Vue学习 开始走向VUE开发2---插值使用详解
  10. Dart入门—基础类型与正则
  11. 应用程序框架实战四:你需要应用程序框架吗
  12. matlab建模方法,MATLAB 数学建模方法与实践(第 3 版)
  13. DIGITS安装及服务部署
  14. 计算机CAD作文,CAD:电脑系统字体和CAD字体的区别
  15. kubeadm部署单Master节点kubernetes集群 1.21.0
  16. 字符串与Unicode编码相关转换
  17. CPAL脚本自动化测试 ———— Diagnostic 系列函数
  18. Mac外接4k显示器文字变小
  19. 【文末赠书】大逆转悄然而至,人口如何影响我们的未来?
  20. Chrome 开发者工具 —— Performance 快速入门

热门文章

  1. 【MATLAB-app】系列教程(含视频)第2课_实例:使用appdesigner 制作简单的计算器
  2. 高斯积分e^(-x^2)在无限域上的定积分
  3. 地下水环境监测技术规范中采样部分
  4. nginxssl证书配置
  5. 大数据——CentOS 7加装虚拟机存储空间、CPU和内存
  6. 图形图像基础 之 jpeg介绍
  7. Exoplayer学习笔记1——使用方法
  8. 嵌入式系统的体系结构 图解
  9. 全面详细的github中文教程
  10. 巴菲特的答卷:年净利润腰斩,百亿美元“错误”,但这些重仓股收益颇丰