# mod-ding
[![](https://img.shields.io/badge/simple--robot-module-green)](https://github.com/ForteScarlet/simple-robot-core) [![img](https://img.shields.io/maven-central/v/love.forte.simple-robot/module-ding)](https://search.maven.org/artifact/love.forte.simple-robot/module-ding)
钉钉机器人模组提供了对钉钉机器人的送信整合
## **说明**
由于钉钉机器人仅支持推送消息而不支持接收消息,因此决定将钉钉机器人作为**模组**发布而不是作为**组件**。
你可以在任何组件中使用钉钉机器人模组,并使其与您的机器人应用相结合。
钉钉机器人模组中所使用的交互方式来源于钉钉机器人[官方文档](https://ding-doc.dingtalk.com/doc#/serverapi3/iydd5h)。
## 配置文件:
```properties
# suppress inspection "UnusedProperty" for whole file
# 此处可支持多个钉钉bot,格式与simbot.core.bots格式类型一致
# 关于secret和access_token, 分比对应code和path
# access_token就是注册了bot之后,给你的webhook地址后的那个access_token参数。此参数是必须存在的
# secret是钉钉机器人三种安全策略的第二种,可以生成,也可以不存在。
# 具体请查看钉钉机器人官方文档:https://ding-doc.dingtalk.com/doc#/serverapi3/iydd5h/404d04c3
# 例如:
# simbot.ding.bots=secret:access_token
# 其中,secret可省略,则为:
# simbot.ding.bots=:access_token
simbot.ding.bots=${secret}:${access_token}
# 钉钉bot的webhook地址,不要携带任何参数, 如果不填默认值为 https://oapi.dingtalk.com/robot/send
simbot.ding.webhook=https://oapi.dingtalk.com/robot/send
```
## **使用**
### 导入依赖:
[![img](https://img.shields.io/maven-central/v/love.forte.simple-robot/module-ding)](https://repo1.maven.org/maven2/love/forte/simple-robot/module-ding/)
```xml
<dependency>
<groupId>love.forte.simple-robot</groupId>
<artifactId>module-ding</artifactId>
<version>${version}</version>
</dependency>
```
### 注入
注入`DingSenderManager`类来使用你的钉钉机器人。获取机器人的key为`access_token`
关于`DingSenderManager`发送消息的类型,我提供了三种方式:
- 使用字符串
- 使用`DingSpecialMessageChain`
- 使用`DingSpecialMessage`
其中,`DingSpecialMessageChain`代表多个`DingSpecialMessage`的集合体,一般用于将普通消息与at类型消息合并在一起的时候使用。
关于字符串,它会将非CQ码部分解析为Text类型的消息,而CQ码部分会解析成对应的类型。(关于可解析的CQ码,下面的代码中的注释里会有简单介绍。)
而关于`DingSpecialMessage`,他是所有的钉钉机器人可发送的消息类型的接口,我提供了如下的实现类:
```java
// 钉钉 text类型的消息
// [CQ:at,qq=123,all,456,789]
// 或者
// [CQ:at,code=123,all,456,789]
DingText dingText = new DingText("123");
// 钉钉 at类型的消息
// 参数1 at的人
// 参数2 是否at全体, 默认为false
DingAt dingAt = new DingAt(new String[]{"1111", "2222", "3333"});
// 只at全体的ding at
DingAt atAll = DingAt.getAtAll();
// 不at任何人的空at
DingAt emptyAt = DingAt.getEmpty();
// 钉钉 markdown类型的消息
// [CQ:ding-markdown,title=标题,text=正文]
DingMarkdown markdown = new DingMarkdown("标题", "正文");
// 可以通过DingMarkDownBuilder构造markdown
DingMarkdownBuilder builder = new DingMarkdownBuilder("标题");
DingMarkdown markdown2 = builder
.h1("标题1")
.h2("标题2")
.h3("标题3")
.h4("标题4")
.orderedList("有序1", "有序2", "有序3")
.build();
System.out.println(markdown2.getText());
// 钉钉 link类型
// 参数:
/*
title
text
messageUrl
picUrl 默认为null
*/
// [CQ:ding-link,title=标题,text=正文,messageUrl=链接]
DingLink link = new DingLink("标题", "正文", "文本链接");
// 钉钉 独立跳转链接
// [CQ:ding-actionCard,title=标题.text=正文,btnOrientation=0,btnTitle=t1,t2,btnUrl=url1,url2]
// 其中,,是逗号的转移。一般不用管,当成btnTitle=1,2就行
DingAutonomyActionCard dingAutonomyActionCard = new DingAutonomyActionCard("title", "text", "1", new DingAutonomyActionCardButtons[]{new DingAutonomyActionCardButtons("标题", "链接")});
// 钉钉 整体跳转链接
// [CQ:ding-actionCard,title=标题.text=正文,btnOrientation=0,btnTitle=t1,btnUrl=url1]
DingWholeActionCard dingWholeActionCard = new DingWholeActionCard("title", "text", "1", "button title", "button url");
// 钉钉 FeedCard 暂时不支持CQ码解析
DingFeedCard feedCard = new DingFeedCard(new DingFeedCardLink[]{new DingFeedCardLink("标题", "图片链接", "跳转链接")});
```
<br>
## **自定义**
钉钉机器人模组内置的一些东西可以通过自定义来实现定制化。
> 内部使用的自动注入配置类为: `love.forte.simbot.component.ding.DingComponentConfiguration`、`love.forte.simbot.component.ding.TemporaryHttpClientConfiguration`
注①:以下提及的接口在注入依赖的时候需要使其的优先级(`@Beans`的`priority`参数)大于`PriorityConstant.FIRST_LAST`
注②:以下提及的可定制化接口的具体说明请参考源代码的注释,此处不会过于详细的介绍。
### DingSecretCalculator
> love.forte.simbot.component.ding.sceret.DingSecretCalculator
签名计算器,用于计算钉钉机器人交互时候的密钥签名
### DingSenderBuilder
> love.forte.simbot.component.ding.sender.DingSenderBuilder
接收参数并构建`DingSender`实例的构建器。
### DingSenderManager
> love.forte.simbot.component.ding.sender.DingSenderManager
最终得到的`DingSenderManager`实例。不过一般通过定义`DingSenderBuilder`即可实现大部分的需求。
- 前言
- 简单介绍
- 我该如何阅读文档
- 视频教程
- 安装与使用
- 开源协议
- 免责&捐助
- 注意事项
- 版本命名规则简介
- 主要功能版本历史
- 功能指引
- 通用API与功能
- 国际化语言
- 异常
- 消息监听
- @Listen
- @OnListen模板
- @Filter
- 消息参数截取
- @Spare
- @Constr
- @Ignore
- @ListenBreak
- @ListenBreakPlugin
- @ListenBody
- 监听响应
- 成功判定与返回值
- 监听上下文
- 动态参数
- 监听消息API
- 异步监听 @Async
- 限流监听 @Limit
- 自定义Http送信器
- 枚举与类型
- 送信器
- SENDER
- SETTER
- GETTER
- 返回值
- 其他位置
- 日志与日志拦截
- 异常处理
- 依赖注入
- 自定义依赖获取
- 批量依赖载入
- 注意事项
- 常量
- 定时任务
- 自定义过滤
- 拦截器
- 拦截器总定义
- 上下文对象总定义
- 监听消息拦截
- 送信器拦截
- 监听函数拦截
- CAT码
- CQ码
- CQCode
- CQ码工具类
- CQ扩展工具类
- AppendList拼接链
- 高级内容
- 阻断机制
- 截断机制
- 自定义枚举类型
- 枚举工厂
- byName注解
- 自定义注解
- 配置
- 文件配置
- 注解配置
- 参数配置
- 多配置
- 多账号
- 自定义账号管理器
- 小心!
- 核心版本与组件如何升级核心
- 核心版本迭代指南
- 核心
- 更新日志
- jar包与依赖
- 监听消息类结构图
- 快速启动
- 模组与扩展
- 模组开发
- 现有模组
- 通用模组-延时任务
- 通用模组-CQ码工具
- 转义器
- CQ码操作工具类
- CQ码模板-CodeTemplate
- CQ码载体-KQCode
- CQ码构建器
- MQ码工具类
- 通用模组-redis-bot管理器
- 通用模组-Debugger
- Debugger-common模块
- Debugger-server模块
- Debugger-client模块
- 通用模组-钉钉机器人
- 组件-Mirai(JVM)
- 快速开始(1.13+)
- springboot-starter
- 注意事项
- 配置
- 额外的内容
- 快速回复
- 额外监听
- CQ码解析
- 组件-酷Q(QQ)-CQ HTTP API(基本失效)
- 快速开始(推荐)
- 快速开始(1.7.x以下,不推荐)
- 快速开始(Springboot启动器)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 额外的内容
- 自定义额外监听
- CQ送信器
- 元事件
- 监听消息类结构图
- 组件-酷Q(QQ)-JCQ(失效)
- 快速开始
- 更新日志
- 额外的内容
- JCQ日志
- 配置
- 注意事项
- 监听消息类结构图
- 组件-酷Q(QQ)-HTTP TO CQ(失效)
- 快速开始(核心1.7.x及以下)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 监听消息类结构图
- 组件-酷Q(QQ)-LEMOC (失效)
- 快速开始(核心1.7.x及以下)
- 配置
- 注意事项
- 更新日志
- 监听消息类结构图
- Springboot快速启动器
- 常见问题汇总
- BUG反馈
- 更新计划总览