前言:在爬虫运维的时候,我们需要及时了解取数情况,以做相关处理,那么此时,我们就很迫切需要一个能发送实时监控消息的功能,如,取数任务什么时候开始跑的,失败了多少,成功了多少,登入需要验证码等等。
在之前,我们学习了使用邮件进行监控提醒,但我们在使用的过程中,会发现,很时候会有延时,监控消息不能及时通知处理。而我们在运维的过程中,可能需要人工及时介入操作,那么此时邮件提醒便不能满足我们的需求了。
因此,我们又要学习新知识了——python基于钉钉监控发送消息提醒,其实官方文档已经说得很明确了,这篇文章,也只是做了一个整理罢了,将涉及到的方法打包成了一个类,需要发送什么类型信息,调用相关模块,传入相应参数就ok了。
完整代码下载放在最后
引用官方原话,企业内部有较多系统支撑着公司的核心业务流程,譬如CRM系统、交易系统、监控报警系统等等。通过钉钉的自定义机器人,可以将这些系统事件同步到钉钉的聊天群。
【钉钉开放平台-自定义机器人接入文档 传送门】
既然我们是使用钉钉消息提醒,那么第一步,我们需要有钉钉,相信经过这个疫情,应该没有人不认识钉钉
了,第二步,自定义机器人是群机器人,所以我们需要有一个群
此时,我们前面两步ok了之后,我们就来添加自定义机器人吧,点击头像
>机器人管理
>自定义机器人
给机器人取个名字
>选择添加到哪个群组
>选择适合自己的安全设置
>完成
这里简单说下安全设置吧
有三种安全设置方式,自定义关键词
、加签
、IP地址
。
自定义关键词
:简单来说就是你发送的内容必须包含这个关键词,才能发送成功;
加签
:就是生成你特定的签名,在程序中,进行加密生成参数,请求时,携带此参数,才能发送成功;
IP地址
:就是在设置的指定IP地址范围内进行请求,才能发送成功,
选择适合自己的安全设置方式,我这里选择的是加签,即,配置好之后,代码在使用、复用、迁移等方面会稍加灵活一点,如果在公司,按实际需求选择就行。把这个签名
记录下来,待会我们需要它来加密生成参数。
点击完成之后,我们就可以看到我们的Webhook
,记下来,待会我们需要用到。
OK,到这里,设置机器人的前奏就完了,接下来就是代码部分了。
首先,我们在__init__
方法中,配置好机器人的信息
def __init__(self):
# 安全设置使用加签方式
timestamp = str(round(time.time() * 1000))
secret = 'SEC7******fe0a' # 刚才记录下来的签名
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
# 以上就是加签的安全配置,其它安全设置,无需配置以上信息
# webhook地址
webhook = 'https://oapi.dingtalk.com/robot/send?******' # 刚才记录的webhook
self.webhook = "{}×tamp={}&sign={}".format(webhook, timestamp, sign) # 如果你的不是加签的安全方式,即可省去 ×tamp={}&sign={} 部分参数
# 配置请求headers
self.headers = {
"Content-Type": "application/json",
"Charset": "UTF-8" # 发起POST请求时,必须将字符集编码设置成UTF-8。
}
第二步,我们先学习发送请求
def send_req(self, message):
"""
发送请求
:param message: 你的消息体
:return:
"""
# 将请求数据进行json数据封装
form_data = json.dumps(message)
# 发起请求
res_info = requests.post(url=self.webhook, headers=self.headers, data=form_data)
# 打印返回的结果
print('邮件发送结果:', res_info.json())
print('通知成功!' if (res_info.json())['errmsg'] == 'ok' else '通知失败!')
第三步,我们差构造一个消息体了对吧,钉钉给出了6种消息类型体
我们一个一个看
第一种、text型文本数据
def send_text_msg(self, content, at_mobiles=None, is_at_all=False):
"""
发送text型文本数据
:param content: 消息内容
:param at_mobiles: 传入列表类型数据,@出现在列表中的电话联系人,如果群里没有该联系人,则不会@(可选参数)
:param is_at_all: 是否@所有人,默认不艾特(可选参数)
:return:
"""
message = {
"msgtype": "text", # 消息类型
"text": {
"content": content
},
"at": {
"atMobiles": at_mobiles,
"isAtAll": is_at_all
}
}
self.send_req(message) # 发送消息
调用:
DingTalkWarn().send_text_msg('测试消息发送!')
def send_link_msg(self, text, title, message_url, pic_url=None):
"""
发送link型文本数据
:param text: 消息内容
:param title: 消息标题
:param message_url: 点击消息跳转的URL
:param pic_url: 图片URL(可选参数)
:return:
"""
message = {
"msgtype": "link",
"link": {
"text": text, # 消息内容,如果太长只会部分展示
"title": title, # 消息标题
"picUrl": pic_url, # 图片URL
"messageUrl": message_url # 点击消息跳转的URL
}
}
self.send_req(message) # 发送消息
调用:
DingTalkWarn().send_link_msg(
text='爱分享,爱折腾,爱生活,乐于分享自己在学习过程中的一些心得、体会。',
title='a'ゞ开心果的博客',
message_url='https://blog.csdn.net/qq_45352972',
pic_url='https://cdn.jsdelivr.net/gh/King-ing/CDN/assets/background.png'
)
def send_markdown_msg(self, text, title, at_mobiles=None, is_at_all=False):
"""
发送markdown型文本数据
:param text: markdown格式内容
:param title: 标题
:param at_mobiles: 传入列表类型数据,@出现在列表中的电话联系人,如果群里没有该联系人,则不会@(可选参数)
:param is_at_all: 是否@所有人,默认不艾特(可选参数)
:return:
"""
message = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": text
},
"at": {
"atMobiles": at_mobiles,
"isAtAll": is_at_all
}
}
self.send_req(message) # 发送消息
调用:
DingTalkWarn().send_markdown_msg(
text="## 这是一个二级标题\n ![news](https://cdn.jsdelivr.net/gh/King-ing/CDN/assets/background.png)\n###### {}发布".format(time.strftime("%Y-%m-%d %H:%M:%S")),
title='markdown格式数据',
)
def send_all_action_card_msg(self, text, title, single_url, single_title='阅读全文'):
"""
发送整体跳转ActionCard类型的数据
:param text: markdown格式内容
:param title: 标题
:param single_url: 详情url地址
:param single_title: 点击进入详情按钮
:return:
"""
message = {
"actionCard": {
"title": title,
"text": text,
"singleTitle": single_title,
"singleURL": single_url
},
"msgtype": "actionCard"
}
self.send_req(message) # 发送消息
调用:
DingTalkWarn().send_all_action_card_msg(
text='## 抓包工具-mitmproxy前奏\n ![](https://img-blog.csdnimg.cn/20201211103655824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70)\n介绍:mitmproxy类似于Fiddler、Charles的功能,可以支持HTTP跟HTTPS请求,只不过它是通过控制台的形式进行操作。mitmproxy有两个关联的组件,mitmdump跟mitmweb。mitmdump是mitmproxy的命令行接口;mitmweb是一个web程序,可以通...',
title='抓包工具-mitmproxy前奏',
single_url='https://blog.csdn.net/qq_45352972/article/details/111028741?spm=1001.2014.3001.5501'
)
def send_alone_action_card_msg(self, text, title, btn_orientation=1, btns=None):
"""
发送独立跳转ActionCard类型的数据
:param text: markdown格式文本数据
:param title: 标题
:param btn_orientation: 0-按钮竖直排列;1-按钮横向排列
:param btns: 列表数据,里面存字符串,用来放按钮信息跟链接,如下
[
{
"title": "内容不错",
"actionURL": "https://www.dingtalk.com/"
},
{
"title": "不感兴趣",
"actionURL": "https://www.dingtalk.com/"
}
]
:return:
"""
message = {
"msgtype": "actionCard",
"actionCard": {
"title": title,
"text": text,
"hideAvatar": "0",
"btnOrientation": btn_orientation,
"btns": btns
}
}
self.send_req(message) # 发送消息
调用:
DingTalkWarn().send_alone_action_card_msg(
text='### 查看好友博客\n![](https://profile.csdnimg.cn/C/B/7/1_qq_45352972)',
title='查看好友博客',
btns=[
{
"title": "不感兴趣",
"actionURL": "https://www.dingtalk.com/"
},
{
"title": "我看看",
"actionURL": "https://blog.csdn.net/qq_45352972/"
}
]
)
def send_feed_card_msg(self, links):
"""
发送FeedCard类型数据
:param links: 列表类型,格式如下
[
{
"title": "时代的火车向前开1",
"messageURL": "https://www.dingtalk.com/",
"picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"
},
{
"title": "时代的火车向前开2",
"messageURL": "https://www.dingtalk.com/",
"picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"
}
]
:return:
"""
message = {
"msgtype": "feedCard",
"feedCard": {
"links": links
}
}
self.send_req(message) # 发送消息
调用:
DingTalkWarn().send_feed_card_msg(
links=[
{
"title": "爬虫之解决需要登录的网站",
"messageURL": "https://blog.csdn.net/qq_45352972/article/details/113831698?spm=1001.2014.3001.5501",
"picURL": "https://img-blog.csdnimg.cn/20210217102838577.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70#pic_center"
},
{
"title": "控制台简单实现打印显示进度条",
"messageURL": "https://blog.csdn.net/qq_45352972/article/details/112191329?spm=1001.2014.3001.5501",
"picURL": "https://img-blog.csdnimg.cn/20210104184651355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70"
},
{
"title": "Email邮件提醒",
"messageURL": "https://blog.csdn.net/qq_45352972/article/details/109280576?spm=1001.2014.3001.5501",
"picURL": "https://img-blog.csdnimg.cn/2020102522530334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70#pic_center"
}
]
)
【完整代码下载 传送门】
新手小白,代码写得不好,如果有理解错误的,还望大牛在评论区指出来,非常感谢!
以上就是 Python基于钉钉监控发送消息提醒 的所有内容了,点赞收藏加评论是最大的支持哦!
编写不易,转载请注明出处,如有侵权,请联系我,邮箱([email protected])!!!