python实现钉钉机器人消息自动化通知

Posted 七月的小尾巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现钉钉机器人消息自动化通知相关的知识,希望对你有一定的参考价值。

前言

之前自动化执行成功之后,会发送邮件通知,但是有时候不一定能及时收到测试报告。昨天小余突然奇想,把自动化报告,发送到钉钉上面,并且@指定的相关人员,这样我就不行你还看不到,说干就干,安排~

自定义机器人安全设置

了解官方文档之后,总结出目前有3种安全设置方式:

  1. 自定义关键字
  2. 加签
  3. IP地址

自定义关键字

最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。

例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。

加签

把timestamp+"\\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

参数说明
timestamp当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时。
secret密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串。

在官方文档中,提供了python的加签代码

import time
import hmac
import hashlib
import base64
import urllib.parse

timestamp = str(round(time.time() * 1000))
secret = 'this is secret'
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))
print(timestamp)
print(sign)

在这里我们只需要把 timestamp和第一步得到的签名值拼接到URL中。

https://oapi.dingtalk.com/robot/send?access_token=XXXXXX&timestamp=XXX&sign=XXX

IP地址

设定IP地址后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单,格式如下。


了解了上面三种安全设置之后,我们来实现一下消息通知。

钉钉消息通知类型

安装使用

pip install DingtalkChatbot

发送text消息

首先我们先从最简单的做起,我在机器人的关键字中定义了「测试」关键字,我们来看如下代码来实现发送消息:

from dingtalkchatbot.chatbot import DingtalkChatbot
# WebHook地址
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=这里填写自己钉钉群自定义机器人的token'
# 初始化机器人小丁
xiaoding = DingtalkChatbot(webhook)
# Text消息@所有人
xiaoding.send_text(msg='测试', is_at_all=True)

在群里可以看到已经接收成功了~

注意:如果你发送的内容并不在关键字中,会发送失败。

text消息之@指定用户

# Text消息之@指定用户
at_mobiles = ['这里填写需要提醒的用户的手机号码,字符串或数字都可以']
xiaoding.send_text(msg='这是一条测试通知', at_mobiles=at_mobiles)

Link消息

xiaoding.send_link(
    title='bug通知',
    text='bug来的太快,就像龙卷风,你有一个新bug',
    message_url='http://www.kwongwah.com.my/?p=454748',
    pic_url='https://img0.baidu.com/it/u=1189694846,2594839829&fm=253&fmt=auto&app=120&f=JPEG?w=750&h=450',
                   )

Markdown消息@所有人

# Markdown消息@所有人
xiaoding.send_markdown(title='氧气文字', text='#### 广州天气\\n'
                           '> 9度,西北风1级,空气良89,相对温度73%\\n\\n'
                           '> ![美景](http://www.sinaimg.cn/dy/slidenews/5_img/2013_28/453_28488_469248.jpg)\\n'
                           '> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \\n',
                           is_at_all=True)

Markdown消息@指定用户

# Markdown消息@指定用户
xiaoding.send_markdown(title='氧气文字', text='#### 广州天气 @用户手机号\\n'
                       '> 9度,西北风1级,空气良89,相对温度73%\\n\\n'
                       '> ![美景](http://www.sinaimg.cn/dy/slidenews/5_img/2013_28/453_28488_469248.jpg)\\n'
                       '> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \\n',
                       at_mobiles=at_mobiles)

发送自动化报告

了解了上面的一些发送类型,最终我决定用 Markdown消息的格式发送消息。

# -*- coding: utf-8 -*-
# @Time    : 2021/9/2 11:46 PM
# @Author  : 余少琪
# @FileName: dingtalk_sendmsg.py
# @email   : 1603453211@qq.com
# @Software: 



import time
import hmac
import hashlib
import base64
import urllib.parse
from dingtalkchatbot.chatbot import DingtalkChatbot


class DingTalkSendMsg(object):

    def __init__(self):
        self.timestap = self.get_sign()[0]
        self.sign = self.get_sign()[1]

    # 根据时间戳 + sgin 生成密钥
    def get_sign(self):
        timestamp = str(round(time.time() * 1000))
        secret = 'SECdea6489dfcc3b9259da943c5ae38d3530696f2fa83ac72a9ee716e9511675b9b'
        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))
        return timestamp, sign

    # 钉钉设置 sgin 形式发送通知
    def send_dingtakl_msg(self, msg=None, style=1):

        # 判断当机器人类型设置的类型 加签,则 webhook 需要加上 时间戳 + sign
        webhook = "https://oapi.dingtalk.com/robot/send?access_token" \\
                          "=a59902a7e811f93ffe301d8326b07a2acc8aa2a864e7d61ee9fc076481ced2a6" + \\
                          "&timestamp=" + self.timestap + "&sign=" + self.sign

        # 判断 style 为 0 时,则发送文本内容
        if style == 0:
            # 初始化机器人小丁
            xiaoding = DingtalkChatbot(webhook)
            # Text消息@所有人
            xiaoding.send_text(msg='我就是小丁,小丁就是我!', is_at_all=True)

            # 判断 style 为 1 时,发送 Markdown消息@所有人
        elif style == 1:
            # Text消息@所有人
            # 初始化机器人小丁
            xiaoding = DingtalkChatbot(webhook)
            now_time = time.strftime("%m月%d日 %H点%M分发布  ", time.localtime())

            xiaoding.send_markdown(title='自动化执行通知', text='#### 自动化测试报告\\n'
                                                     '> ' + str(msg) + '\\n\\n'
                                                     '> ![美景](https://img2.baidu.com/it/u=1812388569,'
                                                     '4000905663&fm=253&fmt=auto&app=120&f'
                                                     '=JPEG?w=800&h=400)\\n'
                                                      '> ###### ' + now_time +
                                                      '[测试报告](http://www.thinkpage.cn/) \\n',
                                   is_at_all=True)

        # 判断 style 为 3 时,发送 link
        elif style == 3:
            # 初始化机器人小丁
            xiaoding = DingtalkChatbot(webhook)
            # Text消息@所有人
            xiaoding.send_link(title='万万没想到,某小璐竟然...', text='故事是这样子的...',
                               message_url='http://www.kwongwah.com.my/?p=454748',
                               pic_url="https://pbs.twimg.com/media/CEwj7EDWgAE5eIF.jpg")


DingTalkSendMsg().send_dingtakl_msg("我是七月")

封装好上方的发送消息通知代码之后,下面我们来执行一下自动化测试代码:


大功告成~今天又是有收获的一天,加油。

以上是关于python实现钉钉机器人消息自动化通知的主要内容,如果未能解决你的问题,请参考以下文章

php 使用钉钉机器人推送消息

持续集成之 Jenkins 钉钉通知

python 编写的钉钉机器人自动发消息

钉钉机器人自定义通知-python

使用python实现钉钉告警通知功能

Jenkins配置项目集成钉钉通知