钉钉消息推送()

news/2025/1/16 8:38:53/

记录一下java实现消息推送

1. 首先添加依赖

 <dependencies><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>2.0.0</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version></dependency>
</dependencies>

2. 配置钉钉推送application.yml文件

dingding:agentId: 25702appKey: dingwsjy7buappSecret: eFROKkCe5JQvYOuru0ZXKzSyaBL9RAI-o6KTilfmVn3STgmessageServerUrl: https://oapi.dingtalk.com/topapi/messagetokenServerUrl: https://oapi.dingtalk.com/getbymobileServerUrl: https://oapi.dingtalk.com/topapi/v2secret: SECc10440b6571aa687b056488d93eb418443ac8d89615489d9a0baccessToken: 11da3106cd3ebc2e117e0d2e4cd4e91801eb4a481ec6bb2e

创建一个读取这些配置的config类型,如下

java">/*** 读取钉钉相关配置** @author lkx*/
@Component
@ConfigurationProperties(prefix = "dingding")
@Data
public class DingConfig
{private String agentId;private String appKey;private String appSecret;private String messageServerUrl;private String tokenServerUrl;private String getbymobileServerUrl;private String secret;private String accessToken;
}

3. 创建一个单独的service和实现类

java">public interface DingMessageService {/*** 发送钉钉群* @param markdown*/void sendCrowdMessage(OapiRobotSendRequest.Markdown markdown);
}

实现类

java">@Slf4j
@Service
public class DingMessageServiceImpl implements DingMessageService {/*** DingDing配置*/@Autowiredprivate DingConfig dingConfig;@Async("threadPool")@Overridepublic void sendCrowdMessage(OapiRobotSendRequest.Markdown markdown) {try {Long timestamp = System.currentTimeMillis();String stringToSign = timestamp + "\n" + dingConfig.getSecret();Mac mac = Mac.getInstance("HmacSHA256");mac.init(new SecretKeySpec(dingConfig.getSecret().getBytes("UTF-8"), "HmacSHA256"));byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");String serverUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + dingConfig.getAccessToken() + "&timestamp=" + timestamp + "&sign=" + sign;DingTalkClient client = new DefaultDingTalkClient(serverUrl);OapiRobotSendRequest request = new OapiRobotSendRequest();request.setMsgtype("text");OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();text.setContent("告警");request.setText(text);OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();at.setIsAtAll(true);request.setAt(at);request.setMsgtype("link");OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();link.setMessageUrl("https://www.dingtalk.com/");link.setPicUrl("");request.setLink(link);request.setMsgtype("markdown");request.setMarkdown(markdown);OapiRobotSendResponse response = client.execute(request);} catch (Exception e) {log.error("钉钉发送群消息异常:" + e.getMessage());}}}

4. 需要直接注入调用即可

java">                //推送钉钉OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();markdown.setTitle("物料车电量告警");StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("### **警告** \n\n").append("物料车电量告警\n\n").append("当前有"+size+"辆物料车电池电量低于"+batteryLevel+"%"+",请及时充电\n\n").append("告警时间:").append(DateUtils.getTime());markdown.setText(stringBuilder.toString());dingMessageService.sendCrowdMessage(markdown);

附:yml文件中 secret 和 accessToken 获取方法

首先拉人组个群,点击群设置,添加小机器人

然后选择自定义

选择加签,里面的值就是 secret

然后点击完成,出现下图,access_token 后面的就是 accessToken 的值


http://www.ppmy.cn/news/1563553.html

相关文章

Python Chardet 库详解:字符编码检测的利器

Python Chardet 库详解&#xff1a;字符编码检测的利器 在处理文本数据时&#xff0c;字符编码问题是一个常见的挑战。如果编码不正确&#xff0c;可能会导致乱码问题。而 Chardet 是 Python 中非常实用的一个库&#xff0c;可以帮助我们快速检测文件或字符串的编码格式。 1.…

【微服务】面试 2、服务雪崩

服务雪崩概念 主要内容&#xff1a;在微服务项目中&#xff0c;微服务间存在远程调用。若某一服务&#xff08;如服务 d&#xff09;出现故障&#xff0c;调用它的服务&#xff08;如服务 a&#xff09;会失败。若调用方持续向故障服务发起请求&#xff0c;由于服务连接数有限且…

2025Paypal取消到期自动续费(循环付款)教程

今天订阅了PixivFanbox&#xff0c;怎么取消自动订阅&#xff0c;防止大家被坑&#xff0c;就开个帖子&#xff0c;即便在Fanbox取消订阅&#xff0c;发现Paypal的自动订阅还在&#xff0c;防止万一还是两边都取消掉。 打开paypal>>找到工具>>找到批准付款 显示的…

uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?

前言 在开发微信小程序时&#xff0c;使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时&#xff0c;就遇到了两个非常令人头疼的问题&#xff1a; 层级穿透&#xff1a;由于 textarea 是原生组件&#xff0c;任何元素都无法遮盖住它。当其…

2501C++,现代C++大大提高开发效率

提升开发效率的一些语法糖: 1.if/switch初化语句 //以前 auto*tmp parseExpression(); if(tmp!nullptr){work(); } //之后if (auto* tmp parseExpression(); tmp ! nullptr) {work(); }2.结构化绑定 std::tuple<int,string> nextToken(){return {4,"直降"…

【机器学习:十四、TensorFlow与PyTorch的对比分析】

1. 发展背景与社区支持 1.1 TensorFlow的背景与发展 TensorFlow是Google于2015年发布的开源深度学习框架&#xff0c;基于其前身DistBelief系统。作为Google大规模深度学习研究成果的延续&#xff0c;TensorFlow从一开始就定位为生产级框架&#xff0c;强调跨平台部署能力和性…

Leetcode2270:分割数组的方案数

题目描述&#xff1a; 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真&#xff0c;那么 nums 在下标 i 处有一个 合法的分割 &#xff1a; 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素&#xff0c;也就是…

【Leetcode 每日一题】3065. 超过阈值的最少操作数 I

问题背景 给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums 和一个整数 k k k。 一次操作中&#xff0c;你可以删除 n u m s nums nums 中的最小元素。 你需要使数组中的所有元素都大于或等于 k k k&#xff0c;请你返回需要的 最少 操作次数。 数据约束 1 ≤ n …