当前位置: 首页 > news >正文

SpringBoot整合钉钉实现消息推送

前言

钉钉作为一款企业级通讯工具,具有广泛的应用场景,包括但不限于团队协作、任务提醒、工作汇报等。

通过Spring Boot应用程序整合钉钉实现消息推送,我们可以实现以下功能:

  • 实时向指定用户或群组发送消息通知。
  • 自定义消息内容和格式,满足不同业务需求。
  • 监控和提醒功能的实现,提高工作效率和沟通效果。

在接下来的部分,我们将逐步介绍如何在Spring Boot中配置和调用钉钉消息推送API,以实现消息推送功能。

钉钉群安装机器人

电脑端登录钉钉,选择一个群聊进行如下的操作:

点击群设置

群设置——>点击机器人

机器人管理——>添加机器人

添加机器人

选择自定义

点击添加

添加机器人设置

注:复制生成的签名串,后续将会用到!

复制出来的结果如下:
SEC1cc02e7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

勾选协议,点击完成即可!

接下来节将会出现如下配置:

image

注:复制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

markdown文本推送

ActionCard 业务推送

 /*** ActionCard业务推送*/@GetMapping("/sendActionCardMessage")public void sendActionCardMessage() {DingTalkResponse response = dingTalkRobotClient.sendActionCardMessage(new ActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划"));Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +"**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划");Assert.assertEquals(response.getErrcode().longValue(), 0L);log.info(response.toString());ThreadUtil.sleep(3000);response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\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", "![screenshot](@lADOpwk3K80C0M0FoA)\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", "![screenshot](@lADOpwk3K80C0M0FoA)\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

ActionCard 业务推送

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

FeedCard 消息推送

总结

通过本文的介绍,我们深入了解了如何使用Spring Boot应用集成钉钉实现消息的推送,实现了实时消息通知和提醒功能;在实际应用中,钉钉消息推送功能可以帮助企业提高内部沟通效率,及时传达重要信息和通知,提升团队协作和工作效率。

希望本文对您了解和应用钉钉消息推送功能有所帮助,如果你觉得本文对你有帮助,请点赞分享,让更多人受益!

源码获取

本文代码获取方式:
后台回复【消息推送】即可获取!

相关文章:

SpringBoot整合钉钉实现消息推送

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

【机器学习】集成学习方法:Bagging与Boosting的应用与优势

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林&#xff08;Random Forest&#xff09;2. 其他Bagging方法 二、Boosting方法1. 梯度提升树&#xff08;Gradient Boosting Machine, GBM&#xff09;解释GBM的基本原理和…...

工业 web4.0 的 UI 卓越非凡

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

C语言 | Leetcode C语言题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; 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 实现灵活的前端打印

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 前言 在前端开…...

Go Module详解

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

基于51单片机的智能水表

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

SQLServer 借助Navcate做定时备份的脚本

首先创建SQLServer链接&#xff0c;然后在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&#xff0c;信号属性&#xff0c;信号特性。 21.2 回顾常用模块 21.2.1 DataTypeConversion 数据类型转换模块&#xff0c;可以对信号的数据类型进行强制转换。无符号数据与有符号数据相加&#xff0c;我们可以将无符号数据转…...

Web前端高级课程:深入探索与技能飞跃

Web前端高级课程&#xff1a;深入探索与技能飞跃 在数字化时代的浪潮中&#xff0c;Web前端技术日新月异&#xff0c;对前端开发者的技能要求也日益提高。为了满足这一需求&#xff0c;我们精心打造了一款Web前端高级课程&#xff0c;旨在帮助学员掌握最前沿的前端技术&#x…...

螺丝工厂vtk ThreadFactory(1)

螺丝工厂vtkThreadFactory (1) 缘起 几年前的探索在Python里应用Openscad实现3D建模之3D螺纹建模初探3 新的参考: generating nice threads in openscadvtkRotationalExtrusionFilter 辅助AI: coze 笔记&#x1f4d2;: openscad 代码分析 // 半径缩放函数&#xff0c;用…...

Android13 蓝牙协议属性配置详解

Android13 蓝牙协议属性配置详解 文章目录 Android13 蓝牙协议属性配置详解一、前言二、Android13 蓝牙协议属性配置1、Profile 属性和暴露接口的定义2、蓝牙协议属性定义3、系统代码中判断蓝牙协议是否使能的代码 三、其他1、adb 窗口中查看蓝牙协议属性2、动态设置蓝牙prop协…...

南通国际高中有哪些?南通惠立学校高中部校长见面日重磅来袭

惠灵顿&#xff08;中国&#xff09;自2011年成立以来&#xff0c;一直坚持深耕国际与双语教育&#xff0c;拥有丰厚的办学经验。依托于集团化的深厚经验南通惠立学校于2024-2025学年开设9-11年级&#xff0c;这所南通国际高中为高中学生搭建一个集卓越升学成果、强大师资、纯正…...

Al智能图像处理APP,安卓手机专用一键优化工具资源合集下载

### 标题&#xff1a;Al智能图像处理APP&#xff0c;安卓手机专用一键优化工具资源合集下载 随着科技的进步&#xff0c;图像处理技术也在不断提升。为了满足用户对图像处理日益增长的需求&#xff0c;我们隆重推出了一款功能强大的图像处理工具——Al智能图像处理APP。这款安…...

Kettle根据分类实现Excel文件拆分——kettle开发31

将整理好的一份供应商付款明细Excel文件&#xff0c;按供应商拆分成多个Excel文件。 实现思路 本文我们首先将供应商付款明细表&#xff0c;按照“名称”拆分成多份Excel文件。拆分Excel文件打算用两个转换实现&#xff0c;一个用来将Excel数据读取到参数中&#xff0c;另外一…...

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 这个库&#xff0c;这个库实现不仅实现了 View 的绑定&#xff0c;而且还提供了大量的注解如 BindView、OnClick、OnLongClick 等来简化开发过程中事件绑定。而这些功能的实现是通过 APT 也就是注解处理器&#xff0c;在编译期间生成 Java 代码…...

Android基础-RecyclerView的优点

一、引言 在Android开发中&#xff0c;RecyclerView是一个强大而灵活的控件&#xff0c;用于展示大量数据集合的视图。相比于传统的ListView和GridView&#xff0c;RecyclerView提供了更高的性能、更多的布局选择和更丰富的交互体验。本文将详细阐述RecyclerView的功能作用以及…...

C# Winform 用户控件,扩展控件,自定义控件综合实例

Control类是Windows窗体控件的基类&#xff0c;它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构&#xff0c;可以通过继承来扩展熟悉的用户控件和现有控件的功能。本列介绍三种不同自定义控件以及怎么创建他们。 自定义控件分类 用户控件&#xff1a;基本控件的…...

经济学和金融学有什么区别?

中文版 金融学和经济学是两个密切相关但有所不同的学科&#xff0c;它们各自侧重于不同的研究领域和方法。 经济学 (Economics) 经济学是研究如何配置有限资源以满足人类无限需求的学科。它可以分为两个主要分支&#xff1a; 宏观经济学 (Macroeconomics): 研究经济整体的行…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...