对接钉钉机器人发送钉钉通知

news2024/11/16 13:56:00
  • 实现效果
    在这里插入图片描述
  • 话不多说 直接上代码
static void sendMsg(String msg) {

  try {
	      String content = "{\"msgtype\": \"text\",\"text\": {\"content\": \"" + msg + "\"}}";
	      HttpUtil.simplePost(content, getDingUrl());
 	 } catch (Exception e) {
      log.error("钉钉消息发送失败",e);
  }

        



private static String getDingUrl() throws Exception {
        // 获取系统时间戳
        Long timestamp = System.currentTimeMillis();
        // 拼接  钉钉加签
        String stringToSign = timestamp + "\n" + "SEC0c2c93412cff6ac2e****ac939189971c0b";
        // 使用HmacSHA256算法计算签名
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec("SEC0c2c93412cff6ac2e****ac939189971c0b".getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
        // 进行Base64 encode 得到最后的sign,可以拼接进url里
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
        // 钉钉机器人地址(配置机器人的webhook),为了让每次请求不同,避免钉钉拦截,加上时间戳
        return "https://oapi.dingtalk.com/robot/send?access_token=" + "&timestamp=" + timestamp + "&sign=" + sign;
    }
  • http工具类

import org.apache.http.Consts;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.SSLContext;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;

/**
 * HttpUtil 请求
 * @author zhouyang
 */
public class HttpUtil {
	private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);
	private static CloseableHttpClient httpClient;;
	private static RequestConfig requestConfig;
	private static final String ENCODING = Consts.UTF_8.name();
	private static final Map<String, Object> jsonHeaderMap = new HashMap();

	static {
		try{
			jsonHeaderMap.put("Content-Type","application/json");
			PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

			ConnectionConfig connectionConfig = ConnectionConfig.custom().setCharset(Consts.UTF_8).build();
			connManager.setDefaultConnectionConfig(connectionConfig);

			connManager.setMaxTotal(50);//最大连接数
			connManager.setDefaultMaxPerRoute(5);//路由最大连接数

			SocketConfig socketConfig = SocketConfig.custom()
					.setTcpNoDelay(true)
					.build();
			connManager.setDefaultSocketConfig(socketConfig);


			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				//信任所有
				@Override
				public boolean isTrusted(X509Certificate[] chain, String authType)
						throws CertificateException {
					return true;
				}
			}).build();

			httpClient = HttpClients.custom()
					.setConnectionManager(connManager)
					.setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext))
					.build();

			requestConfig = RequestConfig.custom()
					// 获取manager中连接 超时时间 50s
					.setConnectionRequestTimeout(5000)
					// 连接服务器 超时时间  1500s
					.setConnectTimeout(150000)
					// 服务器处理 超时时间 3000s
					.setSocketTimeout(300000)
					.build();
		}catch(Exception e){
			throw new RuntimeException("创建httpClient失败", e);
		}
	}





	public static final String simplePost(final String body, final String url) {
		return doPost(url, body, jsonHeaderMap);
	}

	/**
	 * post请求发送
	 */
	public static String doPost(String url, String bodyString, Map<String, Object> headerMap) {
		HttpPost post = new HttpPost(url);
		StringEntity entity = new StringEntity(bodyString, ENCODING);
		post.setEntity(entity);
		if (headerMap != null && !headerMap.isEmpty()) {
			headerMap.forEach((k, v) -> post.setHeader(k, String.valueOf(v)));
		}
		post.setConfig(requestConfig);
		try (CloseableHttpResponse response = httpClient.execute(post)) {
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toString(response.getEntity(), ENCODING);
			}
		} catch (Exception e) {
			log.error("invoke post error", e);
		}
		return null;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第3章 接口和API设计

第15条&#xff1a;用前缀避免命名空间冲突 OC没有其他语言那种内置的命名空间机制。因此&#xff0c;我们在起名时要设法避免潜在的命名冲突&#xff0c;否则很容易就重名了。若是发生重名冲突&#xff0c;那么应用程序相应的链接过程就会出错。例如&#xff1a; 错误原因在…

【并发编程】Java内存模型

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 这一章进一步深入学习共享变量在多线程间的【可见性】问题&#xff0c;与多条指令执行时的【有序性】问题 Java内存模型 JMM即Java Memory Mod…

STM32实现软件IIC协议操作OLED显示屏(1)

时间记录&#xff1a;2024/1/25 一、IIC协议介绍 &#xff08;1&#xff09;协议介绍 IIC&#xff08;又称I2C&#xff0c;Inter-Integrated Circuit&#xff09;&#xff0c;即集成电路总线&#xff0c;是一种两线式串行总线&#xff0c;由PHILIPS公司开发&#xff0c;用…

MSG3D论文解读

论文在stgcn与sta-lstm基础上做的。下面讲一下里面的方法&#xff1a; 1.准备工作 符号。这里是对符号进行解释。 一个人体骨骼图被记为G(v,E) 图卷积&#xff1a; 图卷积定义 考虑一种常用于处理图像的标准卷积神经网络 (CNN)。输入是像素网格。每个像素都有一个数据值向…

喜报|「云原生数据库PolarDB」、「阿里云瑶池一站式数据管理平台」揽获“2023技术卓越奖”

日前&#xff0c;国内知名IT垂直媒体&技术社区IT168公布2023年“技术卓越奖”评选结果&#xff0c;经由行业CIO/CTO大咖、技术专家及IT媒体三方的联合严格评审&#xff0c;阿里云瑶池数据库揽获两项大奖&#xff1a;云原生数据库PolarDB荣获“2023年度技术卓越奖”&#xf…

GraphQL的力量:简化复杂数据查询

1. GraphQL GraphQL 是一种由 Facebook 开发并于 2015 年公开发布的数据查询和操作语言&#xff0c;也是运行在服务端的运行时&#xff08;runtime&#xff09;用于处理 API 查询的一种规范。不同于传统的 REST API&#xff0c;GraphQL 允许客户端明确指定它们需要哪些数据&am…

.net访问oracle数据库性能问题

问题&#xff1a; 生产环境相同的inser语句在别的非.NET程序相应明显快于.NET程序&#xff0c;执行时间相差比较大&#xff0c;影响正常业务运行&#xff0c;测试环境反而正常。 问题详细诊断过程 问题初步判断诊断过程&#xff1a; 查询插入慢的sql_id 检查对应的执行计划…

Storm

1.1. 概念 Storm 是一个免费并开源的分布式实时计算系统。利用 Storm 可以很容易做到可靠地处理无限的 数据流&#xff0c;像 Hadoop 批量处理大数据一样&#xff0c;Storm 可以实时处理数据。 1.2. 集群架构 1.2.1 Nimbus&#xff08;master-代码分发给 Supervisor&#xf…

VS Code使用Git管理开发项目流程

以VSCode远程连接虚拟机开发为例&#xff0c;已经配置好SSH 在Github上搜索心仪的项目&#xff0c;比如权限管理 点击fork到自己账户仓库 虚拟机下创建一个目录 1)mkdir java_test 2)切换到java_test 初始化并克隆项目 1&#xff09; git init:初始化仓库 2&#xff09; g…

数字孪生系统的难点

数字孪生系统的开发和实施涉及一些技术难点&#xff0c;这些难点需要综合应用多个领域的知识和技术来克服。以下是一些数字孪生系统开发中的技术难点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

Conda 使用environment.yml创建一个新的Python项目

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

电子行业含砷废水,深度除砷技术

砷是一种类金属元素&#xff0c;砷化物生物毒性极强&#xff0c;是国际公认的第一类致癌物。因此&#xff0c;这些含砷废水必须经过一定的处理才能排放到环境中。那么&#xff0c;哪些行业会产生含砷废水呢?在地球上&#xff0c;砷是一种常见的元素。在自然界中&#xff0c;砷…

程序执行原理揭秘:你的代码是如何“跑”起来的?

程序执行原理揭秘&#xff1a;你的代码是如何“跑”起来的&#xff1f; 一、执行前的准备工作 我们先来看一下程序执行前需要做哪些准备工作。 我们首先需要了解程序的格式。你可以把程序比作一本书&#xff0c;而程序的格式就是这本书的版式&#xff0c;它决定了书的结构和…

【Python-PyCharm】PyCharm 安装并创建项目(保姆级教程)

【Python-PyCharm】PyCharm 安装并创建项目&#xff08;保姆级教程&#xff09; 1&#xff09;PyCharm 下载2&#xff09;PyCharm 安装3&#xff09;创建项目&#xff08;使用PyCharm编写程序&#xff09; 使用 PyCharm 需要配置 Python 环境变量&#xff0c;详情如下&#xff…

使用DBSyncer同步Oracle11g数据到Mysql5.7中_实现全量数据同步和增量数据实时同步_操作过程---数据同步之DBSyncer工作笔记007

之前都是用mysql和Postgresql之间进行同步的,已经实现了数据的实时同步,现在要实现Oracle数据库到Mysql数据库的全量,以及增量同步. 因为之前配置的不对,这里架构名写成了orcl,所以导致,虽然能连接上,但是,在进行数据同步的时候,看不到表,所以这里说一下如何进行连接 这里,首先…

力扣80、删除有序数组中的重复项Ⅱ(中等)

1 题目描述 图1 题目描述 2 题目解读 对于有序数组nums&#xff0c;要求在不使用额外数组空间的条件下&#xff0c;删除数组nums中重复出现的元素&#xff0c;使得nums中出现次数超过两次的元素只出现两次。返回删除后数组的新长度。 3 解法一&#xff1a;双指针 双指针法可以…

分享7种SQL的进阶用法

分享7种SQL的进阶用法 前言 还只会使用SQL进行简单的insert、update、detele吗&#xff1f;本文给大家带来7种SQL的进阶用法&#xff0c;让大家在平常工作中使用SQL简化复杂的代码逻辑。 1.自定义排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以…

HNSW算法

From&#xff1a; HNSW算法(nsmlib/hnswlib)-CSDN博客HNSW算法的基本原理及使用 - 知乎 HNSW是一种广泛使用的ANN图索引结构&#xff0c;包括DiskANN、DF-GAS、SmartSSD等。本文档主要总结HNSW的结构与工作流程&#xff0c;便于后期研究其工作流程在迁移到CSD中存在的I/O问题…

【LeetCode: 148. 排序链表 + 链表 + 归并排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

防火墙源NAT配置

拓扑 需求 生产区在工作时间内可以访问服务器区&#xff0c;仅可以访问HTTP服务器。办公区全天可以访问服务区&#xff0c;其中&#xff0c;10.0.2.20可以访问FTP服务器和HTTP服务器 10.0.2.10仅可以ping通10.0.3.10办公区在访问服务区时采用匿名认证方式进行上网行为管理。办…