SpringBoot整合钉钉实现消息推送
前言
钉钉作为一款企业级通讯工具,具有广泛的应用场景,包括但不限于团队协作、任务提醒、工作汇报等。
通过Spring Boot应用程序整合钉钉实现消息推送,我们可以实现以下功能:
- 实时向指定用户或群组发送消息通知。
- 自定义消息内容和格式,满足不同业务需求。
- 监控和提醒功能的实现,提高工作效率和沟通效果。
在接下来的部分,我们将逐步介绍如何在Spring Boot中配置和调用钉钉消息推送API,以实现消息推送功能。
钉钉群安装机器人
电脑端登录钉钉,选择一个群聊进行如下的操作:
注:复制生成的签名串,后续将会用到!
复制出来的结果如下:
SEC1cc02e7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
勾选协议,点击完成即可!
接下来节将会出现如下配置:
注:复制Webhook地址,后续将使用该地址向钉钉群推送消息!
地址如下:
https://oapi.dingtalk.com/robot/send?access_token=89742c23bdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
到此位置,经过以上步骤,钉钉群安装机器人完成了。
集成钉钉消息推送功能
引入依赖
在项目pom.xml文件中引入依赖,当前版本1.0.3.RELEASE
<dependency><groupId>cn.snowheart</groupId><artifactId>spring-boot-dingtalk-robot-starter</artifactId><version>1.0.3.RELEASE</version></dependency>
配置WebHook地址
在application.yml配置文件中配置钉钉机器人的WebHook地址:
dingtalk:robot:prefix: https://oapi.dingtalk.com/robot/sendaccess-token: 89742c23bdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsecret:secret-enabled: truesecret-token: SEC1cc02e7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
功能测试
@RestController
@RequestMapping
@Slf4j
public class DingTalkController {@Autowiredprivate DingTalkRobotClient dingTalkRobotClient;/*** 测试发送文本消息*/@GetMapping("/sendMsg")public void sendMessage() {DingTalkResponse response = dingTalkRobotClient.sendMessage(new TextMessage("公众号:小小开发者!"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());}}
启动项目,访问:http://127.0.0.1:8080/sendMsg
即可发送!
其他相关测试
普通文本通知
/*** 普通文本通知*/@GetMapping("/sendTextMessage")public void sendTextMessage() {DingTalkResponse response = dingTalkRobotClient.sendTextMessage(new TextMessage("业务处理异常:构建TextMessage对象发布!"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendTextMessage("业务处理异常:构建普通字符串发布!");Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendTextMessage("业务处理异常:通知指定人!", new String[]{"17767145153"});Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendTextMessage("业务处理异常:通知群内所有人!", true);Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);}
访问:http://127.0.0.1:8080/sendTextMessage
超链接文本
/*** 超链接文本*/@GetMapping("/sendLinkMessage")public void sendLinkMessage() {DingTalkResponse response = dingTalkRobotClient.sendLinkMessage(new LinkMessage("业务处理异常:AAAAAA","BBBBBB","CCCCCC","DDDDDD"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);
}
访问:http://127.0.0.1:8080/sendLinkMessage
Markdown文本推送
private static final String markDownDemoText = "业务报警:标题" +"# 一级标题\n" +"## 二级标题\n" +"### 三级标题\n" +"#### 四级标题\n" +"##### 五级标题\n" +"###### 六级标题\n";/*** markdown文本推送*/@GetMapping("/sendMarkdownMessage")public void sendMarkdownMessage() {// 构建 markdown 对象用法DingTalkResponse response = dingTalkRobotClient.sendMarkdownMessage(new MarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",markDownDemoText));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);// 不构建对象response = dingTalkRobotClient.sendMarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",markDownDemoText);Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);// 发送给指定人response = dingTalkRobotClient.sendMarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",markDownDemoText, new String[]{"19087690186"});Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);//发送给全体人response = dingTalkRobotClient.sendMarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",markDownDemoText, true);Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);}
访问:http://127.0.0.1:8080/sendMarkdownMessage
ActionCard 业务推送
/*** ActionCard业务推送*/@GetMapping("/sendActionCardMessage")public void sendActionCardMessage() {DingTalkResponse response = dingTalkRobotClient.sendActionCardMessage(new ActionCardMessage("业务报警:This is title", "\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划");Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",HideAvatarType.HIDE);Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",ActionCardButton.defaultReadButton("https://www.dingtalk.com"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",HideAvatarType.HIDE,ActionCardButton.defaultReadButton("https://www.dingtalk.com"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);}
访问:http://127.0.0.1:8080/sendActionCardMessage
FeedCard 消息推送
/*** FeedCard 消息推送* @throws InterruptedException*/@GetMapping("/sendFeedCardMessage")public void sendFeedCardMessage() {ArrayList<FeedCardMessageItem> items = new ArrayList<>();items.add(new FeedCardMessageItem("业务处理异常:成为架构师的路上,看这一篇文章就足够了,因为……","http://mp.weixin.qq.com/s/CPUaB60pue0Zf3fUL9xqvw","https://mmbiz.qpic.cn/mmbiz_jpg/YriaiaJPb26VMtfgPvTsM9amH5hf3pmTbf40ia6OLE845icrDb0vt4AsMnTyva5mMMpwwxnkVR5UjCEI8ADvSic1qWQ/640"));items.add(new FeedCardMessageItem("业务处理异常:想成为一名Web开发者?你应该学习Node.js而不是PHP","http://mp.weixin.qq.com/s/x8dm9e7gwLXSEzxE6sQYow","https://mmbiz.qpic.cn/mmbiz_jpg/YriaiaJPb26VND0Q0hSBOoyVkr9cXQrFjWI7hOzax1IxIibqanXYD4W8nyeYX5iaicjgiaqia7ly94iawOsGwehbKGwGsA/640"));DingTalkResponse response = dingTalkRobotClient.sendFeedCardMessage(new FeedCardMessage(items));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendFeedCardMessage(items);Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);}
访问:http://127.0.0.1:8080/sendFeedCardMessage
总结
通过本文的介绍,我们深入了解了如何使用Spring Boot应用集成钉钉实现消息的推送,实现了实时消息通知和提醒功能;在实际应用中,钉钉消息推送功能可以帮助企业提高内部沟通效率,及时传达重要信息和通知,提升团队协作和工作效率。
希望本文对您了解和应用钉钉消息推送功能有所帮助,如果你觉得本文对你有帮助,请点赞分享,让更多人受益!
源码获取
本文代码获取方式:
后台回复【消息推送】即可获取!
相关文章:

SpringBoot整合钉钉实现消息推送
前言 钉钉作为一款企业级通讯工具,具有广泛的应用场景,包括但不限于团队协作、任务提醒、工作汇报等。 通过Spring Boot应用程序整合钉钉实现消息推送,我们可以实现以下功能: 实时向指定用户或群组发送消息通知。自定义消息内容…...

【机器学习】集成学习方法:Bagging与Boosting的应用与优势
🔥 个人主页:空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林(Random Forest)2. 其他Bagging方法 二、Boosting方法1. 梯度提升树(Gradient Boosting Machine, GBM)解释GBM的基本原理和…...

工业 web4.0 的 UI 卓越非凡
工业 web4.0 的 UI 卓越非凡...

C语言 | Leetcode C语言题解之第145题二叉树的后序遍历
题目: 题解: void addPath(int *vec, int *vecSize, struct TreeNode *node) {int count 0;while (node ! NULL) {count;vec[(*vecSize)] node->val;node node->right;}for (int i (*vecSize) - count, j (*vecSize) - 1; i < j; i, --j)…...

如何在 Vue 3 中使用 vue3-print-nb 实现灵活的前端打印
你好,我是小白Coding日志,一个热爱技术的程序员。在这里,我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客,一起在技术的世界里探索前行吧! 前言 在前端开…...

Go Module详解
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

基于51单片机的智能水表
一.硬件方案 本设计主要以51单片机作为主控处理器的智能水表,该水表能够记录总的用水量和单次用水量,当用水量超出设定值时系统发出声光报警提醒,水量报警值能够通过按键进行自行设置,并且存储于AT24C02中,并且可以测…...

SQLServer 借助Navcate做定时备份的脚本
首先创建SQLServer链接,然后在Query标签种创建一个查询 查询内容如下 use ChengYuMES declare ls_time varchar(1000) declare ls_dbname varchar(1000) set ls_time convert(varchar, getdate(), 112) _ replace(convert(varchar, getdate(), 108), :, )-- 需…...

MBD_入门篇_21_SimulinkSignalAttributes
21.SignalAttributes 21.1 概述 Signal Attributes,信号属性,信号特性。 21.2 回顾常用模块 21.2.1 DataTypeConversion 数据类型转换模块,可以对信号的数据类型进行强制转换。无符号数据与有符号数据相加,我们可以将无符号数据转…...
Web前端高级课程:深入探索与技能飞跃
Web前端高级课程:深入探索与技能飞跃 在数字化时代的浪潮中,Web前端技术日新月异,对前端开发者的技能要求也日益提高。为了满足这一需求,我们精心打造了一款Web前端高级课程,旨在帮助学员掌握最前沿的前端技术&#x…...

螺丝工厂vtk ThreadFactory(1)
螺丝工厂vtkThreadFactory (1) 缘起 几年前的探索在Python里应用Openscad实现3D建模之3D螺纹建模初探3 新的参考: generating nice threads in openscadvtkRotationalExtrusionFilter 辅助AI: coze 笔记📒: openscad 代码分析 // 半径缩放函数,用…...
Android13 蓝牙协议属性配置详解
Android13 蓝牙协议属性配置详解 文章目录 Android13 蓝牙协议属性配置详解一、前言二、Android13 蓝牙协议属性配置1、Profile 属性和暴露接口的定义2、蓝牙协议属性定义3、系统代码中判断蓝牙协议是否使能的代码 三、其他1、adb 窗口中查看蓝牙协议属性2、动态设置蓝牙prop协…...

南通国际高中有哪些?南通惠立学校高中部校长见面日重磅来袭
惠灵顿(中国)自2011年成立以来,一直坚持深耕国际与双语教育,拥有丰厚的办学经验。依托于集团化的深厚经验南通惠立学校于2024-2025学年开设9-11年级,这所南通国际高中为高中学生搭建一个集卓越升学成果、强大师资、纯正…...
Al智能图像处理APP,安卓手机专用一键优化工具资源合集下载
### 标题:Al智能图像处理APP,安卓手机专用一键优化工具资源合集下载 随着科技的进步,图像处理技术也在不断提升。为了满足用户对图像处理日益增长的需求,我们隆重推出了一款功能强大的图像处理工具——Al智能图像处理APP。这款安…...

Kettle根据分类实现Excel文件拆分——kettle开发31
将整理好的一份供应商付款明细Excel文件,按供应商拆分成多个Excel文件。 实现思路 本文我们首先将供应商付款明细表,按照“名称”拆分成多份Excel文件。拆分Excel文件打算用两个转换实现,一个用来将Excel数据读取到参数中,另外一…...
merkle tree中文
Merkle tree merkle tree中文文档英文文档 #include <cstdlib> #include <string> #include <bitcoin/bitcoin.hpp>BC_USE_LIBBITCOIN_MAINusing namespace bc;bc::hash_digest calculate_merkle_root(bc::hash_list &merkle);int bc::main(int argc, …...

制作自己的 @OnClick、@OnLongClick(告别 setOnClickListener,使用注解、反射和动态代理)
前言 前面我们说过 ButterKnife 这个库,这个库实现不仅实现了 View 的绑定,而且还提供了大量的注解如 BindView、OnClick、OnLongClick 等来简化开发过程中事件绑定。而这些功能的实现是通过 APT 也就是注解处理器,在编译期间生成 Java 代码…...
Android基础-RecyclerView的优点
一、引言 在Android开发中,RecyclerView是一个强大而灵活的控件,用于展示大量数据集合的视图。相比于传统的ListView和GridView,RecyclerView提供了更高的性能、更多的布局选择和更丰富的交互体验。本文将详细阐述RecyclerView的功能作用以及…...

C# Winform 用户控件,扩展控件,自定义控件综合实例
Control类是Windows窗体控件的基类,它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构,可以通过继承来扩展熟悉的用户控件和现有控件的功能。本列介绍三种不同自定义控件以及怎么创建他们。 自定义控件分类 用户控件:基本控件的…...
经济学和金融学有什么区别?
中文版 金融学和经济学是两个密切相关但有所不同的学科,它们各自侧重于不同的研究领域和方法。 经济学 (Economics) 经济学是研究如何配置有限资源以满足人类无限需求的学科。它可以分为两个主要分支: 宏观经济学 (Macroeconomics): 研究经济整体的行…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...