## 推荐背景
作为新生代农民工,日常搬砖时间分配基本分为写Bug、Debug、Battle、~~摸鱼、喝水、上厕所~~...。除了这些,作为业务一线的民工们还会偶尔会收到产品、运营姐姐妹妹的数据统计需求,她的确要这个数有用,并且只有你有,有每天都要的,有每周要的,有不定期要的。可能也就几个SQL的事,做后台不值得,不做后台呢也不值得。一块砖搬一次两次可以,再多可就不行了,不然配不上==新生代==这三个字。
那有没有一个实现简单又使用方便的工具呢,没有?那想办法搞一个。
### 需求特点
- 无技术门槛
- 简单命令
- 一定自主性
- 权限控制(针对写类型的操作)
- 历史记录(查看查找和操作记录)
- 及时响应
- 主动反馈
### 钉钉
看起来要实现一个方便的工具可真是没有那么容易。发现钉钉有群机器人这个功能后,真是过江遇渡船——赶巧了,稍加包装就能实现以上的所有需求。[blinkbean/dingtalk](https://github.com/blinkbean/dingtalk)
- 对话式消息交互
- 约定命令格式
- 参数通过命令的方式传递
- 可通过消息体内字段判断消息发送者身份
- 聊天记录
- 通过Http方式向机器人发多种类型的消息([blinkbean/dingtalk](https://github.com/blinkbean/dingtalk) 查看详细介绍)
- Text
- Link
- Markdown
- ActionCard
- FeedCard
- 可通过@机器人的方式主动调用Http接口,==需开启Outgoing机制==
### 使用
#### 获取
- ```go
go get github.com/blinkbean/dingtalk
```
#### 初始化
- ```go
// key 创建钉钉机器人需要设置的关键词,默认为`.`
func InitDingTalk(tokens []string, key string) *dingTalk
// 加签方式创建钉钉机器人
// 加签机器人 access_token和secret一一对应,在创建机器人是获取
func InitDingTalkWithSecret(tokens string, secret string) *DingTalk
```
- ```go
import "github.com/blinkbean/dingtalk"
func main() {
// 单个机器人有单位时间内消息条数的限制,有需要可以初始化多个token,随机发给其中一个机器人。
var dingToken = []string{"7bd675b664****dd6684fb1e0415"}
cli := dingtalk.InitDingTalk(dingToken, ".")
// 发个text类型消息
cli.SendTextMessage("content")
}
```
#### 一般消息类型
- ```go
// 普通文本消息
SendTextMessage(content string, opt ...atOption) error
// 链接消息
SendLinkMessage(title, text, picUrl, msgUrl string) error
// markdown格式消息
SendMarkDownMessage(title, text string, opts ...atOption) error
// 有序列表markdown消息
SendMarkDownMessageBySlice(title string, textList []string, opt ...atOption) error
// Action类型消息
SendActionCardMessage(title, text string, opts ...actionCardOption) error
// 批量发送Action类型消息
SendActionCardMessageBySlice(title string, textList []string, opts ...actionCardOption) error
// Feed类型消息
SendFeedCardMessage(feedCard []FeedCardLinkModel) error
// DTMD消息(点击链接发送交互内容)
SendDTMDMessage(title string, dtmdMap *dingMap, opt ...atOption) error
```
##### 消息预览
- ![text](https://i.loli.net/2020/07/05/LXErbH1KiRGstQ7.jpg)
- ![markdown)](https://i.loli.net/2020/07/26/PADJ5uqmfQht2cr.jpg)
- ![action](https://i.loli.net/2020/07/26/pEg7hotXZnsaJPV.jpg)
- ![dtmt](https://i.loli.net/2020/11/02/1OqEr4HKZWapRgd.jpg)
#### OutGoing消息
- 随着各种类型工具都可以集成到钉钉机器人,管理和查找开始复杂,于是做成了注册的形式,
- ```go
// 自定义方法
outgoingFunc := func(args []string) []byte {
// do what you want to
return NewTextMsg("hello").Marshaler()
}
// 自定义方法注册到handler
// hello 关键词、outgoingFunc 主方法、2 参数个数、true 需要身份
RegisterCommand("hello", outgoingFunc, 2, true)
// 启动http服务
http.Handle("/outgoing", &OutGoingHandler{})
_ = http.ListenAndServe(":8000", nil)
```
##### 消息预览(通过命令快速获取用户信息)
- ![OutGoing](https://i.loli.net/2021/09/05/cP4IdKhlxbs1mSn.jpg)
#### [了解更多](https://github.com/blinkbean/dingtalk)
## 总结
将钉钉机器人接口进行封装,可根据使用场景选择不同类型的消息类型。达到低开发成本的同时满足队友们的不同读写需求。
添加钉钉消息测试群:**35451012**,执行dingtalk_test.go测试方法可直接查看当前支持消息内容。
## 参考资料
1. https://github.com/blinkbean
2. https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
有疑问加站长微信联系(非本文作者))