来源于个人博客:https://agou-ops.cn
最近需要做一个钉钉群聊机器人,需求是:艾特该机器人并发送相应关键字,机器人会进行相应的自动回复。
通过钉钉开放平台·钉钉机器人
的企业自建机器人官方文档以及网络上其他语言(Java,Python等)的钉钉机器人的实现,自己瞎编写出来了一个基础版本的小机器人。
奇怪的是用Golang来写的人很少,可能是官方的示例中没有Golang吧,虽然会一些Python,但是现在转学Golang了,故借此机会来巩固一下最近所学的一些东西😄 。
DingTalk_robot
群聊机器人处理流程图:
使用单独一个机器人也可以实现。
预先准备
首先需要自己创建一个测试公司(如若你是钉钉企业管理员的话,可忽略该步骤),创建流程很简单,这里我就不再赘述,详情参考:钉钉创建企业/组织/团队.
接下来进入钉钉开放平台,登录并选择自己上面创建的测试公司之后,点击右上角的开发者控制台
,进入如下页面:
依次点击,创建一个属于自己的机器人🤖,里面的应用名称
、应用描述
和应用图标
随便填。
创建完成之后,记录下AppSecret
(后面计算sign校验会用到),然后⚠️重点来到开放管理
页面,如下图所示:
相关解释:
服务器出口IP
:相当于白名单,也就是允许那些网段或者IP的人使用该机器人,可以限定为公司运营商的公网IP范围(不知道为什么设置了出口IP和没设置出口IP还有随便乱设置出口IP都可以使用);输入调用钉钉服务端API时使用的IP即企业服务器的公网IP,多个IP请以英文逗号","隔开,支持带一个*号通配符的IP格式;消息接收地址
:钉钉机器人服务器outgoing回调
给开发者服务器的一个地址,需要特别注意的是,改地址需要公网IP地址
,当然此处填写域名URL也是可以的。
权限管理
,这个自己看看需要什么权限就加那些吧,本着最小权限的规则进行选择。
完成上面所有操作之后,在上面的版本管理与发布
页面对自己创建的机器人进行调试
或者发布
,选择调试的话会给你个二维码,你可以直接用移动端钉钉扫码加如钉钉机器人测试群,选择发布的话,就可以在自己的测试公司添加机器人,详情参考:钉钉添加机器人到钉钉群
本地测试
在服务器上开发调试可不是一个好的选择,本地写好推送到服务器,如果频繁调试的话,也是非常的麻烦。
所以我推荐使用内网穿透,本地就可以直接进行开发和调试,内网穿透的教程参考我之前写的一篇博客,内网穿透工具…
直接贴一下我的fprs
和frpc
的配置文件好了:
# 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上,👉点击此处进行访问。
效果示例
程序前台启动界面:
日志文件写到了/var/log/dingtalk_robot.log
,注意用户权限。
日志文件初步内容如下所示(分屏左边👈):
钉钉群聊机器人自动回复界面:
ip
关键字(消息类型Markdown):
help
关键字((消息类型Markdown):
about
关键字(消息类型ActionCard):
- 无关键字(消息类型Markdown):
总结
目前虽只有获取公司公网IPv4这个功能,但天子驾二已成,未来不是想拉什么货就拉?xd. 😂 ,后续如果有其他需要的话,可以直接在此基础上进行添加。
Done.
参考文档
- 钉钉企业自建机器人:https://open.dingtalk.com/document/robots/enterprise-created-chatbot?spm=ding_open_doc.document.0.0.3d6d24cb7j00JN#topic-2097982
- 消息类型和数据格式:https://open.dingtalk.com/document/robots/message-types-and-data-format?spm=ding_open_doc.document.0.0.eaef2ccbpoeEEg#topic-2098229