最近需要做一个钉钉群聊机器人,需求是:艾特该机器人并发送相应关键字,机器人会进行相应的自动回复。

通过钉钉开放平台·钉钉机器人企业自建机器人官方文档以及网络上其他语言(Java,Python等)的钉钉机器人的实现,自己瞎编写出来了一个基础版本的小机器人。

奇怪的是用Golang来写的人很少,可能是官方的示例中没有Golang吧,虽然会一些Python,但是现在转学Golang了,故借此机会来巩固一下最近所学的一些东西😄 。

DingTalk_robot群聊机器人处理流程图:

DingTalk_robot

预先准备

首先需要自己创建一个测试公司(如若你是钉钉企业管理员的话,可忽略该步骤),创建流程很简单,这里我就不再赘述,详情参考:钉钉创建企业/组织/团队.

接下来进入钉钉开放平台,登录并选择自己上面创建的测试公司之后,点击右上角的开发者控制台,进入如下页面:

image-20211209095700036

依次点击,创建一个属于自己的机器人🤖,里面的应用名称应用描述应用图标随便填。

image-20211209100434862

创建完成之后,记录下AppSecret(后面计算sign校验会用到),然后⚠️重点来到开放管理页面,如下图所示:

image-20211209100749557

相关解释:

  • 服务器出口IP相当于白名单,也就是允许那些网段或者IP的人使用该机器人,可以限定为公司运营商的公网IP范围(不知道为什么设置了出口IP和没设置出口IP还有随便乱设置出口IP都可以使用); 输入调用钉钉服务端API时使用的IP即企业服务器的公网IP,多个IP请以英文逗号",“隔开,支持带一个*号通配符的IP格式;
  • 消息接收地址:钉钉机器人服务器outgoing回调给开发者服务器的一个地址,需要特别注意的是,改地址需要公网IP地址,当然此处填写域名URL也是可以的。

权限管理,这个自己看看需要什么权限就加那些吧,本着最小权限的规则进行选择。

完成上面所有操作之后,在上面的版本管理与发布页面对自己创建的机器人进行调试或者发布,选择调试的话会给你个二维码,你可以直接用移动端钉钉扫码加如钉钉机器人测试群,选择发布的话,就可以在自己的测试公司添加机器人,详情参考:钉钉添加机器人到钉钉群

本地测试

在服务器上开发调试可不是一个好的选择,本地写好推送到服务器,如果频繁调试的话,也是非常的麻烦。

所以我推荐使用内网穿透,本地就可以直接进行开发和调试,内网穿透的教程参考我之前写的一篇博客,内网穿透工具

直接贴一下我的fprsfrpc的配置文件好了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# frps.ini 文件内容
[common]
bind_port = 5000
token = jSUSpHdC
dashboard_port = 5500
dashboard_user = admin
dashboard_pwd = admin
# frpc.ini 文件内容
[common]
server_addr = 121.36.1.255
server_port = 5000
token = jSUSpHdC

[dingtalk_robot]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 9999

使用ngrok的话,一条命令ngrok http 9999直接启动,然后将生成的URL填入上面的消息接收地址

代码编写

代码就没必要在这里大篇幅讲了,了解大概流程就可,虽然代码都是乱写的,但是我是一个讲究代码规范的人😂 ,代码里面都有很详细的注释,看不懂的可以提个issue。

所有代码以及Releases包已放到GitHub上,👉点击此处进行访问

效果示例

程序前台启动界面:

image-20211209135948692

日志文件写到了/var/log/dingtalk_robot.log,注意用户权限。

日志文件初步内容如下所示(分屏左边👈):

image-20211209142418519

钉钉群聊机器人自动回复界面:

  • ip关键字(消息类型Markdown):

image-20211209140912581

  • help关键字((消息类型Markdown):

image-20211209140952071

  • about关键字(消息类型ActionCard):

image-20211209141021944

  • 无关键字(消息类型Markdown):

image-20211209141048037

总结

目前虽只有获取公司公网IPv4这个功能,但天子驾二已成,未来不是想拉什么货就拉?xd. 😂 ,后续如果有其他需要的话,可以直接在此基础上进行添加。

Done.

参考文档