测试报告/预警信息之群消息自动发送 | 飞书,钉钉

在测试日常工作中经常需要同步目前测试状态和数据给到项目组,邮件通知是一种方式,但容易被忽视,查看不及时,特别是对于线上监控的通知,因此建立实现群消息通知,可以及时的通知到项目组所有人员,且可以@相关人,提高通知效率。

在此简单介绍实现飞书,钉钉两种应用的群消息发送实现,以供参考。

一、飞书群消息发送

飞书群中的消息发送是群内的自定义机器人是通过webhook的形式将你要发送的消息即时发送到群聊中。

具体步骤:

  1. 进入群聊,打开群设置,找到群机器人,并点击添加机器人。选择自定义机器人

测试报告/预警信息之群消息自动发送|飞书,钉钉

  1. 点击添加该机器人进群,设置机器人头像、名称和描述,然后点击添加
  2. 会自动生成webhook,可根据需要在下方选择安全设置的方式,也可不选,本次选择的是签名校验,保证群消息发送安全性。webhook和key复制保存,点击完成。

测试报告/预警信息之群消息自动发送|飞书,钉钉

webhook和key要保管好,不可发布到网上,泄露后可能会被恶意发送消息

4. 调用webhook发送消息

用任意方式向该 webhook 发起 HTTP POST 请求,即可向这个自定义机器人所在的群聊发送消息。在消息体中,消息类型与参数msg_type的对应关系如下:

参数(msg_type)

消息类型

text

文本

post

富文本

image

图片

share_chat

分享群名片

interactive

消息卡片

文本消息发送:

#!/usr/bin env python
# -*- coding:utf-8 -*-
import os
import base64
import requests


  
class Alarm:
    def __init__(self, webhook, user_id):
        self.webhook = webhook
        self.user_id = user_id
        
    def gen_sign(self, timestamp, secret):
        # 拼接timestamp和secret
        string_to_sign = '{}\n{}'.format(timestamp, secret)
        hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
        # 对结果进行base64处理
        sign = base64.b64encode(hmac_code).decode('utf-8')
        return sign
        
    def send_text_msg(self):
        data = self.get_data()
        res = requests.post(self.webhook, json=data)


    def get_data(self):
        data = {"msg_type": "text", "content": {"text": "文本消息告警通知!"}}
        return data
        
        
if __name__ == '__main__':
    web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxx"
    key = "keystrxxxxxxxx"
    at_user = "all"
    alarm = Alarm(web_hook, key, at_user)
    alarm.send_text_msg()

运行结果:

测试报告/预警信息之群消息自动发送|飞书,钉钉

富文本消息发送:

    def get_data(self):
        data = {
            "msg_type": "post",
            "content": {
                "post": {
                    "zh_cn": {
                        "title": "测试结果通知",
                        "content": [
                            [
                                {"tag": "text", "text": "测试结果:"},
                                {"tag": "a", "text": "点击查看\n", "href": "https://www.baidu.com"},
                                {"tag": "at", "user_id": self.user_id}
                            ]
                        ]
                    }
                }
            }
        }
        return data

发送结果:

测试报告/预警信息之群消息自动发送|飞书,钉钉

图片发送:

需要开发机器人应用,在此不详细介绍,可以参考飞书官方地址:

https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/image/create

https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-enable-bot-ability

公司内部开发已开发完成,这里主要介绍下测试结果数据和图片汇总,以及调用发送

# 获取所有的图片列表
    def get_screen(self):
        screen_list = []
        return screen_list


    # 获取测试失败的模块列表
    def get_module_list(self):
        error_module_list = []
        return error_module_list


    # 图片消息发送
    def send_img_msg(self, screen_path):
        screen_list = self.get_screen()
        error_module_list = self.get_module_list()
        image_list = []
        data = {
            'title': "UI检测结果",
            'mutiple_text': [
                "如下页面展示异常:",
            ],
            'image_list': []
        }
        image_list = data['image_list']
        mutiple_text = data['mutiple_text']


        # 失败模块加入发送data中
        for module_name in error_module_list:
            mutiple_text.append(module_name)
            
        # 图片文件的base64编解码,webhook调用发送
        for screen in screen_list:
            file_path = os.path.join(screen_path, screen)
            try:
                with open(file_path, 'rb') as fp:
                    image_base64 = base64.b64encode(fp.read())
                    image_binary_str = image_base64.decode()
                    image_list.append(image_binary_str)
            except Exception as e:
                print("there is an error when open screen file: ", e)
        res = requests.post(url=self.webhook, json=data)
if __name__ == '__main__':
    web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxx"
    screen_file_path = "/home/jenkins/workspace/UITest/screens"
    alarm.send_img_msg(screen_file_path)

在实际应用中该脚本文件要集成的jenkins中,在持续集成步骤,每次触发构建后自动发送通知,在脚本中可加一个条件,如果有失败结果再发送群通知。

二、钉钉群消息发送

同飞书类似,需要添加自定义机器人,获取webhook及加签key

步骤:

  1. 进入群聊,打开群设置,智能群助手,并点击添加机器人。选择自定义

测试报告/预警信息之群消息自动发送|飞书,钉钉

2. 点击添加,设置机器人头像、名字,勾选“加签”,复制保存密钥,然后点击完成。

3. 会自动生成webhook,webhook复制保存,点击完成,机器人添加群完毕。

4. 调用webhook发送消息

本例同样采用了加签方式进行消息发送,把 timestamp+"\n"+ 密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

text消息发送:

class Alarm:
    def __init__(self, webhook, key):
        self.url = webhook
        self.secret = key
        self.headers = {"Content-Type": "application/json"}


    def get_sign(self, timestamp, 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))
        return timestamp, sign


    def send_text_msg(self, msg, at_mobiles=None, is_atall=False):
        data = {
            "msgtype": "text",
            "text": {
                "content": msg
            },
            "at": {
                "atMobiles": at_mobiles,
                "isAtAll": is_atall
            }
        }
        timestamp, sign = self.get_sign(str(round(time.time() * 1000)), self.secret)


        url = f'{self.url}×tamp={timestamp}&sign={sign}'
        r = requests.post(url, json=data, headers=self.headers)
        ret = r.json()
        if ret.get("errcode") != 0:
            logger.info("钉钉消息发送失败!返回报文是:{}", ret)
            return False
        logger.info("钉钉消息发送成功")
        return True


if __name__ == '__main__':
    web_hook = "https://oapi.dingtalk.com/robot/send?access_token=test"
    key = "SEC29d9b638568e66aa236f8d7ea628f4c16bba9db010a87cd37902672test"
    alarm = Alarm(web_hook, key)
    at_mobiles = ["13800138000"]
    alarm.send_text_msg("自动化测试结果有异常,请及时关注", at_mobiles, False)

测试结果:

测试报告/预警信息之群消息自动发送|飞书,钉钉

link消息发送

data = {
            "msgtype": "link",
            "link": {
                "text": "发版前回归测试通知,请各相关负责人认真确认相关测试bug,及时处理,保证产品如期上线",
                "title": "回归测试缺陷通知",
                "picUrl": "https://img95.699pic.com/xsj/04/mn/g9.jpg!/fw/700/watermark/url/L3hzai93YXRlcl9kZXRhaWwyLnBuZw/align/southeast",
                "messageUrl": "https://www.dingtalk.com/"
            }
}

通知效果:

测试报告/预警信息之群消息自动发送|飞书,钉钉

其它消息类型,支持markdown,actionCard等类型,可参考钉钉官方介绍文档。

钉钉也支持gitlab, github, jira等机器人进行简单webhook配置,即可实现群通知,十分方便。

以上为最基本的使用方法,实际应用中要结合具体业务和场景实现使用,目前测试工作中主要应用方面,一个是每日通过脚本读取数据库中bug相关数据统计并发送群通知(项目名称,bug总计,今日新增,今日修复,今日关闭等数据),第二个是自动化测试和线上定时检测的异常和告警通知,及时反馈给相关人员,及时处理。

感谢阅读,欢迎关注微信公众号(ATester),所有文章会在公众号首发。