Python笔记:钉钉机器人使用方法

2021-03-28 15:37:46 浏览数 (1)

0. 简介

由于今年新冠疫情的肆虐,线上办公的模式被大量的导入,而钉钉也是趁此时机弯道超车,增加了大量用户的同时也一度成为了国内知名的“网红”。

而在钉钉中,有着不少有趣的功能,其中一个就是群消息机器人,通过群消息机器人,我们可以方便地对长时间运行的脚本的运行情况进行实时的监控,对错误信息进行实时报警,自动生成实验结果报告以及对特定用户实现@等功能。

下面,我们就对钉钉中的群消息机器人的使用方法进行一些简单的介绍。

1. 钉钉机器人的创建

钉钉群消息机器人的创建事实上也是比较简单的,我们只需要在钉钉的某个目标群中点击群设置 -> 智能群助手 -> 添加机器人即可。

而后,我们就会出现机器人添加界面,我们点击自定义机器人即可。

然后,我们定义机器人名称并同意机器人服务协议即可完成机器人的创建。

需要注意的是,早期的钉钉机器人对信息安全并没有特定的要求,但是现在的机器人对安全性提出了特定的要求,要求在以下条件三选一:

  1. 信息必须包含特定字段
  2. 使用密钥签名
  3. 限制消息发送的IP地址

最后,我们就完成了机器人的创建,创建后我们即可以得到机器人的调用webhook地址。

该webhook地址即为我们平时调用机器人时的调用地址。

2. 钉钉机器人的调用方法

下面,我们来考察钉钉机器人的调用方法。

本质上来说,钉钉机器人事实上就是一个中转站,我们将待发送信息传递给钉钉机器人,而后他会做一层转意,最后发送到机器人所在的群中。

因此,其调用方式也就本质上来说和普通的网络调用请求一样,只要通过requests.post将消息传送到目标url(即上文中的webhook地址)当中即可。

唯一需要注意的是,我们需要调整传递的信息的格式,使之成为钉钉机器人可以识别的信息内容。

下面,我们来对其进行具体的考察。

1. 基础text类型信息的发送

首先,我们来看一下最一般的text类型的信息发送方式。

代码语言:javascript复制
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类型的信息格式定义如下:

代码语言:javascript复制
{
    "msgtype": "markdown",
    "markdown": {
        "title":"杭州天气",
        "text": "#### 杭州天气 n> 9度,西北风1级,空气良89,相对温度73%n> ![screenshot](https://img.yuanmabao.com/zijie/pic/2021/03/28/e50223dt1o2.png)n> ###### 10点20分发布 [天气](https://www.dingtalk.com) n"
    },
 }

上述例子即为官方文档中给出的markdown形式的信息格式。

钉钉机器人会自动对其进行markdown文本格式的编译。

但是,尽管如此,由于需要人工的输入换行符等信息,整体来说,用钉钉robot来传递markdown格式的消息依然不觉得是一个很好的用法。

3. @功能的实现

此外,和普通的钉钉使用时一样,钉钉机器人同样支持@某人的功能。

钉钉所有的@功能事实上都是通过账号绑定的手机号进行实现的,其实现方式也就是在输入信息中通过手机号信息选定要@的对象。

但是,就目前的测试来看,貌似当前钉钉机器人的@功能只支持text以及markdown格式的信息发送。

其实现方式是通过在发送的信息中通过@的方式进行实现。当我们要@某人时,只需要在@之后加入目标对象的钉钉绑定手机号即可。

下面,我们分别给出text类型信息与markdown信息的@样例如下:

1. text类型数据

代码语言:javascript复制
{
    "msgtype": "markdown",
    "text": {
        "content": "hello @130xxxxxxxx, nice to meet you!",
    },
    "at": {
        "atMobiles": [
            "130xxxxxxxx" // 要@对象的手机号
        ],
        "isAtAll": false // 是否要@所有人
    }
}

2. markdown类型数据

代码语言:javascript复制
{
    "msgtype": "text",
    "markdown": {
        "title": "greeting"
        "text": "hello @130xxxxxxxx, nice to meet you!",
    },
    "at": {
        "atMobiles": [
            "130xxxxxxxx" // 要@对象的手机号
        ],
        "isAtAll": false // 是否要@所有人
    }
}

但是,需要注意的是,text类型的信息可以不在信息中指定@某人,机器人会自动在信息末尾处@所有出现在mobiles列表中的用户。

而markdown类型的信息不会做这样的操作,用户必须要手动在信息中加入@内容。

此外,当isAtAllTrue时,其优先级会更高,此时信息中的@130xxxxxxxx内容将不会发挥其预期的功能,会直接作为普通string类型进行内容打印。

4. 网页链接的发送

钉钉机器人除了发送信息之外,也可以支持网页链接的发送。

其调用方式与上述text类型与markdown类型如出一辙,唯一的区别就在于输入信息的schema上。

下面,我们给出网页链接形式的消息schema如下:

代码语言:javascript复制
{
    "msgtype": "link", 
    "link": {
        "text": "在编程中,我们往往会遇到需要通过外部参数来控制脚本运行模式的情况,在通用的框架类代码中,这种情况尤为明显,因此,这里,我们来考察一下如何将参数传入到脚本文件中,而不是作为固定参数写死在脚本当中。", 
        "title": "Python笔记:外部参数传入考察(一)argparse库", 
        "picUrl": "", 
        "messageUrl": "https://blog.csdn.net/codename_cys/article/details/107505718"
    }
}

5. ActionCard类型消息发送

更进一步的,钉钉机器人同样支持类似微信公众号类型的内容消息发送。

其特点在于信息显示上图文并茂,且可以支持点击链接进入到另一个关联网页中。

甚至说,可以在消息后附加不同的选项允许用户点击进入到不同的链接中。

这一消息类型称之为ActionCard,本质来说它就是一个markdown消息与link消息类型的综合体。

下面,我们来给出其消息数据格式:

代码语言:javascript复制
{
    "msgtype": "actionCard",
    "actionCard": {
        "title": "python笔记",
        "text": "![python logo](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBba_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为按钮关联的网页链接。

同样的,当需要关联多个链接时,只需要将传入的数据修改为如下格式即可:

代码语言:javascript复制
{
    "msgtype": "actionCard",
    "actionCard": {
        "title": "python笔记",
        "text": "![python logo](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBba_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类型的消息。

我们给出其消息数据格式如下:

代码语言:javascript复制
{
    "feedCard": {
        "links": [
            {
                "title": "argparse库", 
                "messageURL": "https://blog.csdn.net/codename_cys/article/details/107505718", 
                "picURL": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBba_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:ANd9GcRBba_xRVN7Di9Io6_1Oc54lFzcyA7FzDXEtQ&usqp=CAU"
            }
        ]
    }, 
    "msgtype": "feedCard"
}

可以看到:

  • 多个链接以list的方式进行传入;
  • 每一个链接将会以一张图片以及一段文本的方式进行描述;
  • titlemessageURL以及picURL三个字段并不需要全部给全,可以根据实际使用情况灵活调整。

3. 参考链接

  1. https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

0 人点赞