DEVOPS 三月 06, 2022

钉钉自定义机器人

文章字数 4.7k 阅读约需 4 mins. 阅读次数

聊天机器人

hubot 起接触到聊天机器人,其使用场景还是非常丰富的:

  1. 群管理:新人入群欢迎、关键字自动回复、同类消息汇总 ……
  2. 结合 SaaS 服务:翻译、生成二维码、编解码、智能客服 ……
  3. 定时通知:天气预报、股市行情、监控信息 ……

简单归纳一下,需要机器人具备的能力主要包括:主动发送消息(单聊、群聊)和 被动响应消息(单聊、群聊)。

相关的开源实现也有很多,如上面提到的 hubot 和其与各种聊天工具的 适配、基于微信的 chatbot —— Wechaty 等。

不过因为众所周知的原因,国外的聊天工具各种水土不服;微信作为目前的国民即时通讯工具,能力越大责任越大,对机器发送消息的限制一直都很严格。

微信机器人的曲线实现 提供了一种借助微信公众号实现被动响应消息的方式,但不能主动发送消息;直到被迫使用钉钉后,发现钉钉也支持机器人,并且可以像给手机号发送短信一样方便的主动发送消息,可以结合公众号被动回复消息的功能,获得一个免费可用且较为稳定的,能够主动发消息和被动响应消息的,聊天机器人方案。

钉钉机器人

从钉钉机器人的 官方文档 中,可以了解到,钉钉机器人分为很多种类型,不同类型的机器人拥有不同的能力,接入方式也各不相同。其中最简单的,要数自定义类型的机器人了。

钉钉自定义类型机器人

按照 自定义机器人接入 文档,在钉钉客户端中,即可完成自定义类型机器人的添加,之后会获得机器人的 Webhook 地址,如:

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

其中的 access_token,就相当于这个机器人的手机号,只要使用这个 token 用 POST 方式调用上面接口,就可以在钉钉中收到发送的消息了。例如使用下面的 curl 命令:

$ curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
 -H 'Content-Type: application/json' \
 -d '{"msgtype": "text","text": {"content":"我就是我, 是不一样的烟火"}}'

注意,目前自定义机器人必须从 安全方式 中选择一种,不满足安全设置的消息发送动作不允许被执行。

钉钉支持的 消息类型和数据格式 比微信要丰富,可以获得更好的展示效果和用户体验。

使用 RunKit 从浏览器给钉钉机器人发送消息

RunKit 是一个可在线运行 nodejs 代码的环境,可在 https://npm.runkit.com/ 直接运行下面代码片段,直接通过浏览器给钉钉机器人发送消息:

const axios = require('axios').default;
const https = require('https');

const DINGTALK_TOKEN = 'XXXXXX';

let dingtalk = (msg, callback) => {
    axios({
        url: 'https://oapi.dingtalk.com/robot/send?access_token=' + DINGTALK_TOKEN,
        headers: {
            'Content-Type': 'application/json;charset=utf-8'
        },
        method: 'POST',
        httpsAgent: new https.Agent({
            rejectUnauthorized: false
        }),
        data: msg
    }).then(callback);
};

dingtalk({"markdown": {"title":"Hello World","text": 'hinex send msg from runkit:\n\n' + '[钉钉自定义机器人](https://alphahinex.github.io/2022/03/06/dingtalk-custom-robot/)\n\n[微信机器人的曲线实现](https://alphahinex.github.io/2021/02/21/wechat-mp-services/)'}, "msgtype": "markdown"});

上面 dingtalk 方法可以直接使用 消息类型和数据格式 中的各类型消息 json 对象。

ding-bot

注意:要想成功发送消息,需替换上面代码中的 XXXXXX,安全设置使用 自定义关键词 方式,并且在发送的消息内容中,包含定义的关键词。

代理 Webhook 地址

某些情况下,可能无法直接访问上面钉钉的 Webhook 地址,通过一个可以访问的地址进行请求转发也是可以的,例如在一个可以访问的地址上,为 Nginx 添加如下配置:

location /dingtalk/ {
    proxy_pass https://oapi.dingtalk.com/;
}

之后就可以向这个 Nginx 发送 POST 请求以发送消息了,例如:

$ curl -H "Content-Type:application/json;charset=utf-8" -X POST -d '{"at":{"isAtAll":false},"text":{"content":"我就是我, 是不一样的烟火"},"msgtype":"text"}' http://54.92.69.158/dingtalk/robot/send?access_token=XXXXXX
0%