一、使用背景
当我们写了一套接口自动化脚本之后,希望每天测试不通过的用例可以及时的通知到测试人员。除了发送测试报告到邮件之外,还可以使用钉钉-群机器人这个工具,每天以推送的形式告知到测试人员。那接下来我们需要了解钉钉群机器人的推送机制。
二、钉钉消息推送
具体可参考官方文档:
https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots
复制
类似于这种格式、这是我目前在公司的自动化测试钉钉群报告的模板
第一步创建钉钉群
这里假设我们都已经创建了钉钉群了这不略过。。。
第二步创建群机器人
群设置里面找到 ->智能群助手
点击添加机器人
添加机器人
选择自定义机器人
点击添加
输入群机器人的名称
安全设置
是进行使用钉钉接口进行的权重凭证、我们一般使用签名的认证方式、将下面的密钥进行复制下来
SEC1f50a51870370c0f5d6eaa41c7c0fff8619e42dac516ace2543d9bc0c36baa19复制
每个机器人的密钥都不一样的
最后点击完成
将webhook复制下来 、点完成后基本完成操作了
钉钉群里就会收到一则通知
进入钉钉的API开发平台
我们主要看加签这一块、看看这样进行生成签名加密
找到python示例代码
我们进行复制下来放到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×tamp=XXX&sign=XXX
复制
参数 | 说明 |
timestamp | 第一步使用到的时间戳。 |
sign | 第一步得到的签名值。 |
最后的完整url应该是这样的
url = "https://oapi.dingtalk.com/robot/send?access_token=xxxx×tamp=1626336282534&sign=ShUVr%2Fnv0463z5sNe9kFxYGhzA3mUX5S1djpp6rm61Q%3D"
复制
我们使用requests发送下请求看看是否正常、我们不知道是什么请求方式、开放文档也没什么我们就使用get/post方法尝试即可:
import requests
url = "https://oapi.dingtalk.com/robot/send?access_token=xxxx×tamp=1626336282534&sign=ShUVr%2Fnv0463z5sNe9kFxYGhzA3mUX5S1djpp6rm61Q%3D"
re = requests.get(url=url)
print(re.status_code)复制
出现了200 正常、我们试试POST方法、结果发现也能正常发送、那我们就要post方法吧。
消息类型及数据格式
{
"at": {
"atMobiles":[
"180xxxxxx"
],
"atUserIds":[
"user123"
],
"isAtAll": false
},
"text": {
"content":"我就是我, @XXX 是不一样的烟火"
},
"msgtype":"text"
}复制
text类型
{
"at": {
"atMobiles":[
"180xxxxxx"
],
"atUserIds":[
"user123"
],
"isAtAll": false
},
"text": {
"content":"我就是我, @XXX 是不一样的烟火"
},
"msgtype":"text"
}复制
参数 | 参数类型 | 是否必填 | 必须 |
msgtype | String | 是 | 消息类型,此时固定为:text。 |
content | String | 是 | 消息内容。 |
atMobiles | Array | 否 | 被@人的手机号。 |
atUserIds | Array | 否 | 被@人的用户userid。 |
isAtAll | Boolean | 否 | 是否@所有人。 |
link类型
{
"msgtype": "link",
"link": {
"text": "这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林",
"title": "时代的火车向前开",
"picUrl": "",
"messageUrl": "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"
}
}复制
参数 | 参数类型 | 是否必填 | 说明 |
msgtype | String | 是 | 消息类型,此时固定为:link。 |
title | String | 是 | 消息标题。 |
text | String | 是 | 消息内容。如果太长只会部分展示。 |
messageUrl | String | 是 | 点击消息跳转的URL。 |
picUrl | String | 否 | 图片URL。 |
markdown类型
{
"msgtype": "markdown",
"markdown": {
"title":"杭州天气",
"text": "#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > \n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
},
"at": {
"atMobiles": [
"150XXXXXXXX"
],
"atUserIds": [
"user123"
],
"isAtAll": false
}
}复制
钉钉也支持很多其他的类型的数据格式、这里我们就用以上三个做介绍具体学习即可、后面在设计框架时还需要进行高级封装等操作、后面我们再来进一步学习。
下面举个栗子:
import time
import hmac
import hashlib
import base64
import urllib.parse
timestamp = str(round(time.time() * 1000))
secret = 'SEC1f50a51870370c0f5d6eaa41c7c0fff8619e42dac516ace2543d9bc0c36baa19'
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)
import requests
webhook = "https://oapi.dingtalk.com/robot/send?access_token=35c1d7762039dccf84a9ea52073fbcf731aa4cd086982dff31c1f93b46a70f15"
url = '%s×tamp=%s&sign=%s'%(webhook,timestamp,sign)
data = {
"at": {
"isAtAll": False
},
"text": {
"content":"我就是我,是不一样的烟火"
},
"msgtype":"text"
}
re = requests.post(url=url,json=data)
print(re.content)复制
好了钉钉群发送报告及通知基本样例已完成、自己可以下去好好跟着钉钉文档操作即可、后面的数据格式都与这个一样的操作、只是传递的参数不同罢了。
后面再进行对些操作进行封装。