作者:李俊杰
推荐理由:结合项目,有实用价值。

通过钉钉机器人对接系统推送消息 参考https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

获取自定义机器人webhook

步骤一,打开机器人管理页面。以PC端为例,打开PC端钉钉,点击头像,选择“机器人管理”。

钉钉 接收消息 python 钉钉如何接收消息_自定义

步骤二,在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像。

钉钉 接收消息 python 钉钉如何接收消息_推送消息 聊天工具_02

步骤三,完成必要的安全设置(至少选择一种),勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”。安全设置目前有3种方式,设置说明见下文介绍。

钉钉 接收消息 python 钉钉如何接收消息_钉钉 接收消息 python_03

步骤四,完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:

https://oapi.dingtalk.com/robot/send?access_token=XXXXXX

注意:请保管好此Webhook 地址,不要公布在外部网站上,泄露后有安全风险。

安全设置

安全设置目前有3种方式:

(1)方式一,自定义关键词

最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。

例如:添加了一个自定义关键词:监控报警

则这个机器人所发送的消息,必须包含 监控报警 这个词,才能发送成功。

(2)方式二,加签

第一步,把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

钉钉 接收消息 python 钉钉如何接收消息_钉钉_04


签名计算代码示例(Java)

import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 
import org.apache.commons.codec.binary.Base64;
 import java.net.URLEncoder; 
  public class Test {  public static void main(String[] args) throws Exception {  Long timestamp = System.currentTimeMillis();  String secret = "this is secret";   String stringToSign = timestamp + "\n" + secret;  Mac mac = Mac.getInstance("HmacSHA256");  mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));  byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));  String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");  System.out.println(sign);  }  }

第二步,把 timestamp和第一步得到的签名值拼接到URL中。

钉钉 接收消息 python 钉钉如何接收消息_IP_05

https://oapi.dingtalk.com/robot/send?access_token=XXXXXX&timestamp=XXX&sign=XXX 3)方式三,IP地址(段)设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP、IP段,暂不支持IPv6地址白名单,格式如下:

钉钉 接收消息 python 钉钉如何接收消息_钉钉 接收消息 python_06


注意:安全设置的上述三种方式,需要至少设置其中一种,以进行安全保护。校验不通过的消息将会发送失败,错误如下:

// 消息内容中不包含任何关键词 { “errcode”:310000, “errmsg”:“keywords not in content” } // timestamp 无效 { “errcode”:310000, “errmsg”:“invalid timestamp” } // 签名不匹配 { “errcode”:310000, “errmsg”:“sign not match” } // IP地址不在白名单 { “errcode”:310000, “errmsg”:“ip X.X.X.X not in whitelist” }

使用自定义机器人

(1)获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。注意,发起POST请求时,必须将字符集编码设置成UTF-8。

(2)当前自定义机器人支持文本 (text)、链接 (link)、markdown(markdown)、ActionCard、FeedCard消息类型,大家可以根据自己的使用场景选择合适的消息类型,达到最好的展示样式。

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

(4)当前机器人尚不支持应答机制 (该机制指的是群里成员在聊天@机器人的时候,钉钉回调指定的服务地址,即Outgoing机器人)。

SDK :

可以下载SDK,简化调用方式。

消息发送频率限制:
测试自定义机器人

通过下面方法,可以快速验证自定义机器人是否可以正常工作:

使用命令行工具curl。

为避免出错,将以下命令逐行复制到命令行,需要将xxxxxxxx替换为真实access_token;若测试出错,请检查复制的命令是否和测试命令一致,多特殊字符会报错。
curl ‘https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx’ \ -H ‘Content-Type: application/json’ \ -d ‘{“msgtype”: “text”,“text”: {“content”: “我就是我, 是不一样的烟火”}}’
消息类型及数据格式

text类型

{ “msgtype”: “text”, “text”: { “content”: “我就是我, 是不一样的烟火@156xxxx8827” }, “at”: { “atMobiles”: [ “156xxxx8827”, “189xxxx8325” ], “isAtAll”: false } }

钉钉 接收消息 python 钉钉如何接收消息_推送消息 聊天工具_07

钉钉 接收消息 python 钉钉如何接收消息_钉钉 接收消息 python_08

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&versinotallow=26031933&nettype=WIFI” } }

钉钉 接收消息 python 钉钉如何接收消息_钉钉 接收消息 python_09

钉钉 接收消息 python 钉钉如何接收消息_IP_10

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.dingalk.com) \n"  },  "at": {  "atMobiles": [  "150XXXXXXXX"  ],  "isAtAll": false  }  }

钉钉 接收消息 python 钉钉如何接收消息_自定义_11

说明:目前只支持md语法的子集,具体支持的元素如下:

标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 引用 > A man who stands for nothing will fall for anything. 文字加粗、斜体 bold italic 链接 this is a link 图片 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZGzrxFi-1593583161586)(http://name.com/pic.jpg)] 无序列表 - item1 - item2 有序列表 1. item1 2. item2

整体跳转ActionCard类型

{  "actionCard": {  "title": "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身",  "text": "![screenshot](@lADOpwk3K80C0M0FoA)   ### 乔布斯 20 年前想打造的苹果咖啡厅   Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",   "btnOrientation": "0",  "singleTitle" : "阅读全文",  "singleURL" : "https://www.dingtalk.com/"  },  "msgtype": "actionCard" }

钉钉 接收消息 python 钉钉如何接收消息_推送消息 聊天工具_12

钉钉 接收消息 python 钉钉如何接收消息_IP_13

独立跳转ActionCard类型

{  "actionCard": {  "title": "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身",  "text": "![screenshot](@lADOpwk3K80C0M0FoA)   ### 乔布斯 20 年前想打造的苹果咖啡厅   Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",   "btnOrientation": "0",  "btns": [  {  "title": "内容不错",  "actionURL": "https://www.dingtalk.com/"  },  {  "title": "不感兴趣",  "actionURL": "https://www.dingtalk.com/"  }  ]  },  "msgtype": "actionCard" }

钉钉 接收消息 python 钉钉如何接收消息_IP_14

FeedCard类型

{  "feedCard": {  "links": [  {  "title": "时代的火车向前开",  "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",  "picURL": "https://gw.alicdn.com/tfs/TB1ayl9mpYqK1RjSZLeXXbXppXa-170-62.png"  },  {  "title": "时代的火车向前开2",  "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",  "picURL": "https://gw.alicdn.com/tfs/TB1ayl9mpYqK1RjSZLeXXbXppXa-170-62.png"  }  ]  },  "msgtype": "feedCard" }

钉钉 接收消息 python 钉钉如何接收消息_IP_15

通过FeedCard类型消息发出的消息样式如下:

钉钉 接收消息 python 钉钉如何接收消息_钉钉_16