从零开始打造专属钉钉机器人

12次阅读

共计 2375 个字符,预计需要花费 6 分钟才能阅读完成。

本文同步发表于作者博客: 从零开始打造专属钉钉机器人

官方定义如下:

群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。目前,大部分机器人在添加后,还需要进行 Webhook 配置,才可正常使用(配置说明详见操作流程中的帮助链接)。

例如:

通过聚合 GitHub,GitLab 等源码管理服务,实现源码更新同步。

通过聚合 Trello,JIRA 等项目协调服务,实现项目信息同步。

另外,群机器人支持 Webhook 协议的自定义接入,支持更多可能性,例如:你可将运维 报警通过自定义机器人聚合到钉钉群实现提醒功能。

实际上,通过机器人我们可以对接各类服务,比如源码提交通知,服务器告警通知,甚至是可以主动查询天气、加班点餐等服务。

目前钉钉机器人支持 incoming 方式,outgoing仍属于内侧阶段。官方文档可以点此查看。

incoming 方式

incoming是指被动接受通知,钉钉群中添加的群机器人默认都是该模式。

添加机器人

我们添加的时候可以看到已经自带一些常见的机器人,比较推荐的是GitHubGitLabJIRATravisTrello,当然我们这次需要选择最后的 ” 自定义 ” 机器人。

在机器人信息栏填写 ” 机器人姓名 ” 即可,需要的话也可以设置一个头像。图中 ” 是否开启 Outgoing 机制 ” 在没有开通的情况下是不可见。

点击完成就会生成 hook 地址,如下图:

我们会用到 ”Hook 地址 ”,后面我们发送消息都需要请求到该地址。

如何发送消息

只要想 Webhook 地址发起 POST 请求,带上特定格式消息即可。

具体的接口文档可以看官方,这里不做扩展。

开源工具

在一些简单的通知场景,我们可以使用 npm 上面的轮子来快速实现。

  • dingtalk-robot
  • dingtalk-robot-sender

outgoing 方式

outgoing机器人的配置和前面基本一样,只需要额外配置 POST 地址 以及Token

需要注意的是 Token 保存后无法再次修改,POST 地址 就是钉钉机器人接受消息后调用的地址。

开通方式

  1. 钉钉上加入 ” 钉钉机器人交流群 ”,群号:11733391
  2. 在 https://open-dev.dingtalk.com 首页上找到 corpId
  3. 记得添加 ” 大柚 ”,并把 coprId 私发给他。

目前每周四提交开通,预计周五会生效。

如何收取消息

当群里有人 @机器人时,钉钉会通过 POST 方式回调我们前面设置的地址,该地址实质是接口,可以在 Body 中获取到消息内容。

截止撰写文章时,钉钉的 outgoing 机器人文档不可访问,所以会在下面介绍下。

钉钉请求格式

  • HTTP Header 格式如下:
 "Content-Type": "application/json; charset=utf-8" 
 "token": "6a71a455ffcfba92a66"
  • HTTP Body 文本消息内容:
{
     // 会话 id
    "conversationId": "8Yu7H8H8890kkl7h==",
    "atUsers": [
        {"dingtalkId": "$:DFDS51:$R7E8dffdufdfjsdf2/oUCO/"}
    ],
    "chatbotUserId": "$:df3234:$sdfsdfsdfsdfd234234/oUCO/",
    "msgId": "msg4sdf35jh8jc9b51ss6/noYdzw==",
    "senderNick": "Neo",
    "isAdmin": false,
    "sessionWebhookExpiredTime": 1561711409165,
    // 消息发送的时间
    "createAt": 1561710209132,
    // 群聊消息类型还是单聊
    "conversationType": "2",
    "senderId": "$:ASDD_v1:$df8sdfj&JS*J#FF==",
    // 当类型是群聊时,这个参数有效
    "conversationTitle": "avalon",
    "isInAtList": true,
     // sessionWebhook 是临时的发送消息接口
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=qwe",
    // 消息内容
    "text": {"content": "我就是我, 是不一样的烟火"}, 
     // 消息类型
    "msgtype": "text",
}
  • HTTP 响应格式

支持返回文本、图片和 markdownactionCardfeedCard 消息类型。

下面仅列出 markdown 格式的消息,详细的文件可以参考网友提供的 PDF,提取码: 4qht。

{
     "msgtype": "markdown", // 消息类型
     "markdown": {
         "title":"杭州天气", // 消息主题
         "text": "#### 杭州天气 @ptt6gbq @17681800905 \n" +
                 "> 9 度,西北风 1 级,空气良 89,相对温度 73%\n\n" +
                 "> ![screenshot](http://image.jpg)\n"  +
                 "> ###### 10 点 20 分发布 [天气](http://www.thinkpage.cn/) \n" // 消息体
     },
      "at": { // @的人员
          "atMobiles": ["17681800905"], 
          "atDingtalkIds": ["ptt6gbq"],
          "isAtAll": false
      }
 }

如果我们回复的消息需要 @某人,就会配置 at 字段,里面 atDingtalkIds 需要的 dingtaklId 可以是我们从请求中拿到的 senderId,即$:ASDD_v1:$k8DFJ837349On my way!== 的形式也可以传入正常 @。

另外如果出于某些原因,无法响应请求时返回消息,我们还可以通过 sessionWebhook 来主动发送消息。

正文完
 0