Python钉钉机器人
0.简介
由于新冠疫情的肆虐,线上办公的模式被大量的导入,而钉钉也是趁此时机弯道超车,增加了大量用户的同时也一度成为了国内知名的“网红”。
而在钉钉中,有着不少有趣的功能,其中一个就是群消息机器人,通过群消息机器人,我们可以方便地对长时间运行的脚本的运行情况进行实时的监控,对错误信息进行实时报警,自动生成实验结果报告以及对特定用户实现@等功能。
下面,我们就对钉钉中的群消息机器人的使用方法进行一些简单的介绍。
1.钉钉机器人的创建
钉钉群消息机器人的创建事实上也是比较简单的,我们只需要在钉钉的某个目标群中点击群设置 -> 智能群助手 -> 添加机器人
即可。
而后,我们就会出现机器人添加界面,我们点击自定义机器人
即可。
然后,我们定义机器人名称并同意机器人服务协议即可完成机器人的创建。
需要注意的是,早期的钉钉机器人对信息安全并没有特定的要求,但是现在的机器人对安全性提出了特定的要求,要求在以下条件三选一:
信息必须包含特定字段 使用密钥签名 限制消息发送的IP地址 最后,我们就完成了机器人的创建,创建后我们即可以得到机器人的调用webhook地址。
该webhook地址即为我们平时调用机器人时的调用地址。
2.钉钉机器人的调用方法
下面,我们来考察钉钉机器人的调用方法。
本质上来说,钉钉机器人事实上就是一个中转站,我们将待发送信息传递给钉钉机器人,而后他会做一层转意,最后发送到机器人所在的群中。
因此,其调用方式也就本质上来说和普通的网络调用请求一样,只要通过requests.post
将消息传送到目标url(即上文中的webhook
地址)当中即可。
唯一需要注意的是,我们需要调整传递的信息的格式,使之成为钉钉机器人可以识别的信息内容。
下面,我们来对其进行具体的考察。
1. 基础text类型信息的发送
首先,我们来看一下最一般的text类型的信息发送方式。
import requests
def test_dingding_info(message, webhook):
data = {
"msgtype": "text",
"text": {
"content": message
}
}
requests.post(webhook, json=data)
return
test_dingding_info("hello world", webhook) # webhook即上述机器人的webhook
上述代码即为最一般的钉钉机器人调用方法。
当然,同所有的requests请求一样,我们可以加入timeout参数来进行超时时间控制,也可以增加retry模块增加服务调用的稳定性。
此外,还需要注意的是,message内容并不一定需要一定是字符串形式,事实上,所有可以进行json序列化操作的数据格式都可以作为信息传入,钉钉机器人会自动将其转换为字符串类型。
2. markdown格式文本的发送
除了一般的message之外,钉钉机器人同样支持markdown格式文本的发送。
与上述text类型的消息发送方式相同,我们只需要定义好message信息,而后使用requests.post命令发送至机器人的url地址即可。
但是,与上述text型的消息不同,markdown类型的信息格式定义如下:
{
"msgtype": "markdown",
"markdown": {
"title":"杭州天气",
"text": "#### 杭州天气 \n> 9度,西北风1级,空气良89,相对温度73%\n> ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n> ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
},
}
上述例子即为官方文档中给出的markdown形式的信息格式。
钉钉机器人会自动对其进行markdown文本格式的编译。
但是,尽管如此,由于需要人工的输入换行符等信息,整体来说,用钉钉robot来传递markdown格式的消息依然不觉得是一个很好的用法。
3. @功能的实现
此外,和普通的钉钉使用时一样,钉钉机器人同样支持@某人的功能。
钉钉所有的@功能事实上都是通过账号绑定的手机号进行实现的,其实现方式也就是在输入信息中通过手机号信息选定要@的对象。
但是,就目前的测试来看,貌似当前钉钉机器人的@功能只支持text以及markdown格式的信息发送。
其实现方式是通过在发送的信息中通过@的方式进行实现。当我们要@某人时,只需要在@之后加入目标对象的钉钉绑定手机号即可。
下面,我们分别给出text类型信息与markdown信息的@样例如下:
- text类型数据
{ "msgtype": "markdown", "text": { "content": "hello @130xxxxxxxx, nice to meet you!", }, "at": { "atMobiles": [ "130xxxxxxxx" // 要@对象的手机号 ], "isAtAll": false // 是否要@所有人 } }
- markdown类型数据
{ "msgtype": "text", "markdown": { "title": "greeting" "text": "hello @130xxxxxxxx, nice to meet you!", }, "at": { "atMobiles": [ "130xxxxxxxx" // 要@对象的手机号 ], "isAtAll": false // 是否要@所有人 }
但是,需要注意的是,text类型的信息可以不在信息中指定@某人,机器人会自动在信息末尾处@所有出现在mobiles列表中的用户。
而markdown类型的信息不会做这样的操作,用户必须要手动在信息中加入@内容。
此外,当isAtAll
为True
时,其优先级会更高,此时信息中的@130xxxxxxxx
内容将不会发挥其预期的功能,会直接作为普通string类型进行内容打印。
4. 网页链接的发送
钉钉机器人除了发送信息之外,也可以支持网页链接的发送。
其调用方式与上述text类型与markdown类型如出一辙,唯一的区别就在于输入信息的schema上。
下面,我们给出网页链接形式的消息schema如下:
{
"msgtype": "link",
"link": {
"text": "在编程中,我们往往会遇到需要通过外部参数来控制脚本运行模式的情况,在通用的框架类代码中,这种情况尤为明显,因此,这里,我们来考察一下如何将参数传入到脚本文件中,而不是作为固定参数写死在脚本当中。",
"title": "Python笔记:外部参数传入考察(一)argparse库",
"picUrl": "",
"messageUrl": "https://github.com/Eternity-Sky/Eternity-Sky.github.io"
}
}
5. ActionCard类型消息发送
更进一步的,钉钉机器人同样支持类似微信公众号类型的内容消息发送。
其特点在于信息显示上图文并茂,且可以支持点击链接进入到另一个关联网页中。
甚至说,可以在消息后附加不同的选项允许用户点击进入到不同的链接中。
这一消息类型称之为ActionCard,本质来说它就是一个markdown消息与link消息类型的综合体。
下面,我们来给出其消息数据格式:
{
"msgtype": "actionCard",
"actionCard": {
"title": "python笔记",
"text": "![python logo](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRBba_xRVN7Di9Io6_1Oc54lFzcyA7FzDXEtQ&usqp=CAU) python笔记",
"btnOrientation": "0",
"singleTitle" : "点击进入",
"singleURL" : "https://blog.csdn.net/codename_cys/category_10092961.html"
}
}
其中,title字段为左侧消息栏中的消息内容;text中的内容支持markdown文本格式,为显示在右侧对话窗口中的信息内容;btnOrientation表示按钮排列方式,0表示纵向排列,1表示横向排列;singleTitle为点击按钮的内容显示;singleURL为按钮关联的网页链接。
同样的,当需要关联多个链接时,只需要将传入的数据修改为如下格式即可:
{
"msgtype": "actionCard",
"actionCard": {
"title": "python笔记",
"text": "![python logo](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRBba_xRVN7Di9Io6_1Oc54lFzcyA7FzDXEtQ&usqp=CAU) python笔记",
"btnOrientation": "0",
"btns": [
{
"title": "argparse库简介",
"actionURL": "https://blog.csdn.net/codename_cys/article/details/107505718"
},
{
"title": "pydantic库简介",
"actionURL": "https://blog.csdn.net/codename_cys/article/details/107675748"
}
]
}
}
6. FeedCard类型消息发送
此外,如果要想微信公众号一样一次发送多个网页链接及其内容描述,则我们可以使用FeedCard类型的消息。
我们给出其消息数据格式如下:
{
"feedCard": {
"links": [
{
"title": "argparse库",
"messageURL": "https://blog.csdn.net/codename_cys/article/details/107505718",
"picURL": "https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRBba_xRVN7Di9Io6_1Oc54lFzcyA7FzDXEtQ&usqp=CAU"
},
{
"title": "pydantic库简介",
"messageURL": "https://blog.csdn.net/codename_cys/article/details/107675748",
"picURL": "https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRBba_xRVN7Di9Io6_1Oc54lFzcyA7FzDXEtQ&usqp=CAU"
}
]
},
"msgtype": "feedCard"
}
可以看到:
- 多个链接以list的方式进行传入;
- 每一个链接将会以一张图片以及一段文本的方式进行描述;
- title、messageURL以及picURL三个字段并不需要全部给全,可以根据实际使用情况灵活调整。
3. 参考链接
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq