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

2022-08-29 14:27:15

前言

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

自定义机器人安全设置

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

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

自定义关键字

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

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

加签

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

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

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

import timeimport hmacimport hashlibimport base64import 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.chatbotimport DingtalkChatbot# WebHook地址
webhook='https://oapi.dingtalk.com/robot/send?access_token=这里填写自己钉钉群自定义机器人的token'# 初始化机器人小丁
xiaoding= DingtalkChatbot(webhook)# Text消息@所有人
xiaoding.send_text(msg='测试', is_at_all=True)

在群里可以看到已经接收成功了~
在这里插入图片描述
注意:{"errcode":310000,"errmsg":"keywords not in content"},如果遇到这个异常,说明你发送的内容并不在关键字中,会发送失败。

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消息的格式发送消息。

import base64import hashlibimport hmacimport timeimport urllib.parsefrom dingtalkchatbot.chatbotimport DingtalkChatbot, FeedLinkfrom config.confManageimport dingding_manageclassDingTalkSendMsg(object):def__init__(self):
        self.timestap=str(round(time.time()*1000))
        self.sign= self.get_sign()
        self.webhook= dingding_manage("${webhook}$")+"&timestamp="+ self.timestap+"&sign="+ self.sign
        self.xiaoding= DingtalkChatbot(self.webhook)defget_sign(self):"""
        根据时间戳 + sgin 生成密钥
        :return:
        """
        secret= dingding_manage("${secret}$")
        string_to_sign='{}\n{}'.format(self.timestap, secret).encode('utf-8')
        hmac_code= hmac.new(secret.encode('utf-8'), string_to_sign, digestmod=hashlib.sha256).digest()
        sign= urllib.parse.quote_plus(base64.b64encode(hmac_code))return signdefsend_text(self, msg, mobiles=None):"""
        发送文本信息
        :param msg: 文本内容
        :param mobiles: 艾特用户电话
        :return:
        """ifnot mobiles:
            self.xiaoding.send_text(msg=msg, is_at_all=True)else:ifisinstance(mobiles,list):
                self.xiaoding.send_text(msg=msg, at_mobiles=mobiles)else:raise TypeError("mobiles类型错误 不是list类型.")defsend_link(self, title, text, message_url, pic_url):"""
        发送link通知
        :return:
        """try:
            self.xiaoding.send_link(title=title, text=text, message_url=message_url, pic_url=pic_url)except Exception:raisedefsend_markdown(self, title, msg, mobiles=None):"""

        :param mobiles:
        :param title:
        :param msg:
        markdown 格式
        '#### 自动化测试报告\n'
            '> ' + str(msg) + '\n\n'
                            '> ![图片](https://img1.baidu.com/it/u'
                            '=424332266,'
                            '2532715190&fm=26&fmt=auto&gp=0.jpg)\n '
                            '> ###### ' + get_now_time() +
            '[测试报告](https://blog.csdn.net/weixin_43865008/article'
            '/details/120079270?spm=1001.2014.3001.5501) \n'
        :return:
        """ifnot mobiles:
            self.xiaoding.send_markdown(title=title, text=msg, is_at_all=True)ifisinstance(mobiles,list):
            self.xiaoding.send_markdown(title=title, text=msg, at_mobiles=mobiles)else:raise TypeError("mobiles类型错误 不是list类型.")@staticmethoddeffeed_link(title, message_url, pic_url):return FeedLink(title=title, message_url=message_url, pic_url=pic_url)defsend_feed_link(self,*arg):try:
            self.xiaoding.send_feed_card(list(arg))except Exception:raiseif __name__=='__main__':#     title = '自动化测试', text = '自动化测试报告',#     message_url = 'https://blog.csdn.net/weixin_43865008/article/details/120079270?spm=1001'#     '.2014.3001.5501',# pic_url = "https://img2.baidu.com/it/u=841211112,1898579033&fm=26&fmt=auto&gp=0.jpg"

    d= DingTalkSendMsg()
    a= d.feed_link("1", message_url='https://blog.csdn.net/weixin_43865008/article/details/120079270?spm=1001',
                    pic_url="https://img2.baidu.com/it/u=841211112,1898579033&fm=26&fmt=auto&gp=0.jpg")
    b= d.feed_link("2", message_url='https://blog.csdn.net/weixin_43865008/article/details/120079270?spm=1001',
                    pic_url="https://img2.baidu.com/it/u=841211112,1898579033&fm=26&fmt=auto&gp=0.jpg")
    d.send_feed_link(a, b)

    d.send_text("3",[136****0244])

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

在这里插入图片描述
大功告成~今天又是有收获的一天,加油。

  • 作者:七月的小尾巴
  • 原文链接:https://blog.csdn.net/weixin_43865008/article/details/120079270
    更新时间:2022-08-29 14:27:15