• Task 05 Python操作钉钉自动化



    前言

    本文主要是对群聊消息的发送提供参考案例,实现对文字消息、图片消息、卡片消息等常规消息的发送,本文通过钉钉接口实现上述群聊消息的几大功能。


    一、创建钉钉群机器人

    使用钉钉机器人发送群消息的第一步是需要创建一个群聊。步骤如下:

    首先我们打开钉钉,随便拉2个人,创建一个群聊,点击群设置中的智能群助手。

    在这里插入图片描述
    进入到机器人管理页面,点击添加机器人,进入机器人选择页面,这里选择自定义机器人。
    在这里插入图片描述
    需要给机器人修改头像和名称,在安全设置里面,建议最好把自定义关键字也勾选上,比如我这里设置的是:定时推送,然后其他的可以默认,点击完成后在新的页面有一个webhook.
    在这里插入图片描述
    在这里插入图片描述
    这个webhook比较重要,后面要用到,一定要备份好,不要公布在外部网站上,泄露后有安全风险。到此,群聊机器人就创建完成了。

    需要注意的有两个:一个机器人的webhook,一个是自定义关键字。

    二、使用自定义机器人实战

    获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。

    钉钉群聊机器人最新规定:

    • 发起POST请求时,必须将字符集编码设置成UTF-8。
    • 每个机器人每分钟最多发送20条。消息发送太频繁会严重影响群成员的使用体验,大量发消息的场景 (譬如系统监控报警) 可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里。

    目前支持发送的消息有5种,分别是:文本 (text)、链接 (link)、markdown、ActionCard、FeedCard。个人使用中比较常用的有两种:分别是文本和链接,企业使用的时候,对于ActionCard类型的也比较常用。

    具体需要根据自己的场景进行选择,以便能达到最好的展示样式。

    自定义机器人发送消息时,可以通过手机号码指定“被@人列表”。在“被@人列表”里面的人员收到该消息时,会有@消息提醒。免打扰会话仍然通知提醒,首屏出现“有人@你”。

    ①文本TEXT

    文本型的消息类型,具体代码如下:

    {
        "at": {
            "atMobiles":[
                "180xxxxxx"
            ],
            "atUserIds":[
                "user123"
            ],
            "isAtAll": false
        },
        "text": {
            "content":"我就是我, @XXX 是不一样的烟火"
        },
        "msgtype":"text"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    上述中涉及的参数类型分别如下:

    参数参数类型是否必填说明
    msgtypeString消息类型,此时固定为:text。
    contentString消息内容。
    atMobilesArray被@人的手机号。注意 在content里添加@人的手机号,且只有在群内的成员才可被@,非群内成员手机号会被脱敏。
    atUserIdsArray被@人的用户userid。注意 在content里添加@人的userid。
    isAtAllBoolean是否@所有人。
    import requests
    import json
    import datetime
    
    def send_msg(token_dd, date_str, msg, at_all=False):
        """
        通过钉钉机器人发送内容
        @param date_str:
        @param msg:
        @param at_all:
        @return:
        """
        url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        content_str = "{0}定时推送:\n\n{1}\n".format(date_str, msg)
        
        data = {
            "at": {
            "atMobiles":[
                " "
            ],
            "atUserIds":[
                " "
            ],
            "isAtAll": False
        },
        "text": {
            "content":content_str
        },
        "msgtype":"text"
        }
        res = requests.post(url, data=json.dumps(data), headers=headers)
        print(res.text)
        
        return res.text
    
    if __name__ == '__main__':
        token_dd = '你自己的webhook后面的access_token复制在此'
        note_str = "@XXX,DataWhale自动化组队学习中..."
        date_str = datetime.datetime.now().strftime('%H:%M')
        send_msg(token_dd, date_str, note_str, True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

    ②链接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"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上述中涉及的参数类型分别如下:

    参数参数类型是否必填说明
    msgtypeString消息类型,此时固定为:link。
    titleString消息标题。
    textString消息内容。如果太长只会部分展示。
    messageUrlString点击消息跳转的URL,打开方式如下:移动端,在钉钉客户端内打开PC端默认侧边栏打开希望在外部浏览器打开,请参考消息链接说明
    picUrlString图片URL。
                                             |
    
    • 1
    import requests
    import json
    import datetime
    
    def send_msg(token_dd, date_str):
        """
        通过钉钉机器人发送内容
        @param date_str:
        @return:
        """
        url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        content_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
        
        data = {
            "msgtype": "link",
            "link": {
                "title": content_str,
                "text": "Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习。Datawhale发展于2018年12月6日。团队成员规模也在不断扩大,有来自双非院校的优秀同学,也有来自上交、武大、清华等名校的小伙伴,同时也有来自微软、字节、百度等企业的工程师。我们将一群有能力有想法的理想青年们集结在一起,共同改善学习的模式。在这里,我们没有标签。如果你是小白,我们将为你提供学习和改变的机会,如果你是优秀的学习者,我们将向你提供提升和发展的平台。",
                "picUrl": "https://camo.githubusercontent.com/442350f57282653c563b8c6181f561452b6258632dc79d8a5298b724a37a42f7/68747470733a2f2f747661312e73696e61696d672e636e2f6c617267652f65366339643234656c793168316f69646f617469716a3231313030753061626e2e6a7067",
                "messageUrl": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
            }
        }
        res = requests.post(url, data=json.dumps(data), headers=headers)
        print(res.text)
        
        return res.text
    
    if __name__ == '__main__':
        token_dd = '你自己的webhook后面的access_token复制在此'
        note_str = "DataWhale自动化组队学习中..."
        date_str = datetime.datetime.now().strftime('%H:%M')
        send_msg(token_dd, date_str)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

    ③markdown类型

    markdown的消息类型,具体代码如下:

    {
         "msgtype": "markdown",
         "markdown": {
             "title":"杭州天气",
             "text": "#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
         },
          "at": {
              "atMobiles": [
                  "150XXXXXXXX"
              ],
              "atUserIds": [
                  "user123"
              ],
              "isAtAll": false
          }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上述中涉及的参数类型分别如下:

    参数类型是否必填说明
    msgtypeString消息类型,此时固定为:markdown。
    titleString首屏会话透出的展示内容。
    textStringmarkdown格式的消息。
    atMobilesArray被@人的手机号。注意 在text内容里要有@人的手机号,只有在群内的成员才可被@,非群内成员手机号会被脱敏。
    atUserIdsArray被@人的用户userid。注意 在content里添加@人的userid。
    isAtAllBoolean是否@所有人。
    import requests
    import json
    import datetime
    
    def send_msg(token_dd, date_str, at_all):
        """
        通过钉钉机器人发送内容
        @param date_str:
        @param at_all:
        @return:
        """
        url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        title_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
        
        data = {
            "msgtype": "markdown",
            "markdown": {
                "title": title_str,
                "text": "### Datawhale \n > Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习。\n\n > Datawhale发展于**2018年12月6日**。团队成员规模也在不断扩大,有来自双非院校的优秀同学,也有来自上交、武大、清华等名校的小伙伴,同时也有来自微软、字节、百度等企业的工程师。\n\n > 我们将一群有能力有想法的理想青年们集结在一起,共同改善学习的模式。**在这里,我们没有标签**。如果你是小白,我们将为你提供学习和改变的机会,如果你是优秀的学习者,我们将向你提供提升和发展的平台。",
            },
            "at": {
                "isAtAll": at_all
            }
        }
        
        res = requests.post(url, data=json.dumps(data), headers=headers)
        print(res.text)
        
        return res.text
    
    
    if __name__ == '__main__':
        token_dd = '你自己的webhook后面的access_token复制在此'
        date_str = datetime.datetime.now().strftime('%H:%M')
        send_msg(token_dd, date_str, at_all=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    ④整体跳转ActionCard类型

    整体跳转ActionCard的消息类型,具体代码如下:

    {
        "actionCard": {
            "title": "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身", 
            "text": "![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png) 
     ### 乔布斯 20 年前想打造的苹果咖啡厅 
     Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划", 
            "btnOrientation": "0", 
            "singleTitle" : "阅读全文",
            "singleURL" : "https://www.dingtalk.com/"
        }, 
        "msgtype": "actionCard"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上述中涉及的参数类型分别如下:

    参数类型是否必填说明
    msgtypeString消息类型,此时固定为:actionCard。
    titleString首屏会话透出的展示内容。
    textStringmarkdown格式的消息。
    singleTitleString单个按钮的标题。注意 设置此项和singleURL后,btns无效。
    singleURLString点击消息跳转的URL,打开方式如下:移动端,在钉钉客户端内打开PC端默认侧边栏打开希望在外部浏览器打开,请参考消息链接说明
    btnOrientationString0:按钮竖直排列1:按钮横向排列
    import requests
    import json
    import datetime
    
    def send_msg(token_dd, date_str):
        """
        通过钉钉机器人发送内容
        @param date_str:
        @return:
        """
        url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        title_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
        
        data = {
            "msgtype": "actionCard",
            "actionCard": {
                "title": title_str,
                "text": "### Datawhale \n > Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习...",
                "btnOrientation": "0",
                "singleTitle": "阅读全文",
                "singleURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
            }
        }
        
        res = requests.post(url, data=json.dumps(data), headers=headers)
        print(res.text)
        
        return res.text
    
    if __name__ == '__main__':
        token_dd = '你自己的webhook后面的access_token复制在此'
        date_str = datetime.datetime.now().strftime('%H:%M')
        send_msg(token_dd, date_str)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    ⑤独立跳转ActionCard类型

    独立跳转ActionCard的消息类型,具体代码如下:

    {
        "msgtype": "actionCard",
        "actionCard": {
            "title": "我 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身", 
            "text": "![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png) \n\n #### 乔布斯 20 年前想打造的苹果咖啡厅 \n\n Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划", 
            "btnOrientation": "0", 
            "btns": [
                {
                    "title": "内容不错", 
                    "actionURL": "https://www.dingtalk.com/"
                }, 
                {
                    "title": "不感兴趣", 
                    "actionURL": "https://www.dingtalk.com/"
                }
            ]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    上述中涉及的参数类型分别如下:

    参数类型是否必填说明
    msgtypeString此消息类型为固定actionCard。
    titleString首屏会话透出的展示内容。
    textStringmarkdown格式的消息。
    btnsArray按钮。
    titleString按钮标题。
    actionURLString点击按钮触发的URL,打开方式如下:移动端,在钉钉客户端内打开PC端默认侧边栏打开希望在外部浏览器打开,请参考消息链接说明
    btnOrientationString0:按钮竖直排列1:按钮横向排列
    import requests
    import json
    import datetime
    
    def send_msg(token_dd, date_str):
        """
        通过钉钉机器人发送内容
        @param date_str:
        @return:
        """
        url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        title_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
        
        data = {
            "msgtype": "actionCard",
            "actionCard": {
                "text": "### Datawhale \n > Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习...",
                "title": title_str,
                "btnOrientation": "0",
                "btns": [
                    {
                        "title": "阅读全文1",
                        "actionURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
                    },
                    {
                        "title": "阅读全文2",
                        "actionURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
                    }
                ]
            }
        }
        
        res = requests.post(url, data=json.dumps(data), headers=headers)
        print(res.text)
        
        return res.text
    
    if __name__ == '__main__':
        token_dd = '你自己的webhook后面的access_token复制在此'
        date_str = datetime.datetime.now().strftime('%H:%M')
        send_msg(token_dd, date_str)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    ⑥FeedCard类型

    FeedCard的消息类型,具体代码如下:

    {
        "msgtype":"feedCard",
        "feedCard": {
            "links": [
                {
                    "title": "时代的火车向前开1", 
                    "messageURL": "https://www.dingtalk.com/", 
                    "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"
                },
                {
                    "title": "时代的火车向前开2", 
                    "messageURL": "https://www.dingtalk.com/", 
                    "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"
                }
            ]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    上述中涉及的参数类型分别如下:

    参数类型是否必填说明
    msgtypeString此消息类型为固定feedCard。
    titleString单条信息文本。
    messageURLString点击单条信息到跳转链接。说明 PC端跳转目标页面的方式,参考消息链接在PC端侧边栏或者外部浏览器打开
    picURLString单条信息后面图片的URL。
    import requests
    import json
    import datetime
    
    def send_msg(token_dd):
        """
        通过钉钉机器人发送内容
        """
        url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        title_str = "定时推送:\n\n{0}\n".format("Datawhale和学习者一起成长1")
    
        data = {
            "msgtype": "feedCard",
            "feedCard": {
                "links": [{
                        "title": title_str,
                        "messageURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1",
                        "picURL": "https://camo.githubusercontent.com/442350f57282653c563b8c6181f561452b6258632dc79d8a5298b724a37a42f7/68747470733a2f2f747661312e73696e61696d672e636e2f6c617267652f65366339643234656c793168316f69646f617469716a3231313030753061626e2e6a7067"
                    }, {
                        "title": "Datawhale和学习者一起成长2",
                        "messageURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1",
                        "picURL": "https://camo.githubusercontent.com/442350f57282653c563b8c6181f561452b6258632dc79d8a5298b724a37a42f7/68747470733a2f2f747661312e73696e61696d672e636e2f6c617267652f65366339643234656c793168316f69646f617469716a3231313030753061626e2e6a7067"
                    }
                ]
            }
        }
        
        res = requests.post(url, data=json.dumps(data), headers=headers)
        print(res.text)
        
        return res.text
    
    if __name__ == '__main__':
        token_dd = '你自己的webhook后面的access_token复制在此'
        send_msg(token_dd)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    总结

    本篇文章主要讲解了通过在钉钉群里创建机器人,再通过webhook自动发送消息,很实用,也很好玩。

  • 相关阅读:
    全网最牛自动化测试框架系列之pytest(5)-断言
    RCNN算法思想简单讲解概述————(究极简单的讲述和理解)
    AI绘画Stable Diffusion原理之扩散模型DDPM
    虚拟机基本环境准备(CentOS7)
    玩转Android10源码开发定制(二)之基于Pixel 3手机超级详细演示fastboot刷机
    观察者模式(大话设计模式)C/C++版本
    Yalmip使用教程(6)-将约束条件写成矩阵形式
    Java线程池
    mysql5.7安装教程
    使用Grunt shell方式交互处理数据
  • 原文地址:https://blog.csdn.net/weixin_44336912/article/details/125934266