#yyds干货盘点#如何用Python发送告警通知到钉钉?

Posted 简说Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#如何用Python发送告警通知到钉钉?相关的知识,希望对你有一定的参考价值。

跟老表一起学云服务器开发相关文章(如果是第一次阅读该系列文章, 强烈建议先学习下面文章):

先导篇:拥有有一台服务器后,我竟然这么酷?​

替代项目:10行代码写一个简历页面!​

和不安全访问 say goodbye,手把手教大家如何给域名申请免费 SSL 证书​​​

​Linux里的“宝塔”,真正的宝塔!详细教程​

​终于有了一个人人可以访问的网站了​

原创不易,求大家浏览到文章最后,点个赞、留个言,随便说说都行,谢谢读者朋友支持,接下来开始正文。

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

一、前言

前不久,看到了明哥写的如何用Python发送警告通知到企业微信,想起来之前写过用Pytho发送指定格式数据到钉钉的服务,本文将之前的代码重构下,变成一个:利用Python监控服务器数据,然后有异常就通过钉钉发送给用户。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_定时任务 本项目大纲如下,项目已经开源到GitHub啦,大家可以直接点击阅读原文或者浏览器访问:​​https://github.com/XksA-me/DingdingBot​​ 下载项目。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_守护进程_02 项目环境说明:

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

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


pip3 install requests psutil apschedule

二、开始动手动脑

2.1 创建钉钉机器人

钉钉机器人个人版只针对群聊,所以我们需要先建一个群,打开钉钉,然后创建一个群聊,随便拉2个人,创建成功后,可以把这两个好友再移除群聊(有点损?!),点击群设置中的​​智能群助手​​。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_服务器_03 进入到机器人管理页面,点击添加机器人后的​​三点按钮​​,进入机器人选择页面。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_python_04 我们下滑页面,选择​​自定义​​机器人。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_守护进程_05 给机器人取个名字,然后需要进行安全设置,选择加签方式(数据传输是需要其当作参数,避免安全问题),复制好里面的内容。点击完成,即可​​完成​​创建。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_python_06 复制Webhook链接,后面我们就是通过Python向这个url发送post请求进行数据传输,你可以点击下​​设置说明​​查看机器人相关功能和配置方法。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_python_07 如果后面忘记了前面设置的​​加签​​密钥或者​​Webhook​​地址,可以​​群管理​​->​​智能群助手​​->点击对应机器人的​​三点按钮​​ 查看或修改。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_服务器_08 这样我们就创建好了钉钉机器人,接下来,我们只需编编写好Python代码即可。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_守护进程_09

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

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

前面我们设置了​​加签​​的安全防护方法,所以我们在进行数据传输之前,首先得先计算下钉钉机器人数字签名内容,钉钉文档上有非常详细的说明哈,并给了各种语言的计算方法,我们直接拿来调试即可。 官方文档地址:https://developers.dingtalk.com/document/robots/customize-robot-security-settings #yyds干货盘点#如何用Python发送告警通知到钉钉?_python_10 计算过程你可以不用理解(下面代码),修改​​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}

#yyds干货盘点#如何用Python发送告警通知到钉钉?_服务器_11

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

#yyds干货盘点#如何用Python发送告警通知到钉钉?_python_12 我们直接向我们自己的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渲染后的效果),好看,记得点赞(想不到,到这里,就有一千字了~点赞呐 转发呐 支持下作者~): #yyds干货盘点#如何用Python发送告警通知到钉钉?_服务器_13

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

在Linux里我们一般利用​​top​​指令来查看CPU的使用情况,主要看以下几个数据:进程CPU使用率、负载情况、虚拟/物理内存使用情况,所以本部分我们将利用Python获取相关数据。 #yyds干货盘点#如何用Python发送告警通知到钉钉?_服务器_14 这里我们利用​​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().percent
vm_available = round(psu.virtual_memory().available/(1024<strong>3), 2)
# 系统物理存储使用率
disk_in_use = psu.disk_usage(/).percent
disk_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 #yyds干货盘点# python 爬虫爱好者必须掌握的知识点“ 协程爬虫”,看一下如何用 gevent 采集女生用头像

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

#yyds干货盘点#华为交换机查看告警信息

#yyds干货盘点#Prometheus 之服务发现介绍

# yyds干货盘点 # 手把手教你使用Python网络爬虫实现邮件定时发送(附源码)

#yyds干货盘点# 手把手教你使用Python网络爬虫实现邮件定时发送(附源码)