钉钉自定义机器人发送群消息(加签方式、http发送)

news/2024/12/27 1:30:04/

钉钉群里创建自定义机器人(群设置-机器人-添加机器人),选择自定义机器人

安全设置有三种,本文章使用加签(secret)方式 ,其他方式可参考官方文档:获取自定义机器人 Webhook 地址 - 钉钉开放平台

 

 添加成功后有一个Webhook,也就是机器人的发送消息的url。

主要需要Webhook,和  secret密钥。

发送方法直接调用sendDingTalkMsg()方法,一个是发送给全体成员,一个是根据手机号发送给具体人。


import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.util.CollectionUtils;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 钉钉-工具类*/
@Slf4j
public class DingTalkUtil {/*** 钉钉机器人发消息地址(配置机器人的webhook)*/private  String webhook;/*** 密钥*/private  String secret;public DingTalkUtil(String webhook, String secret) {this.webhook = webhook;this.secret = secret;}/*** 签名计算*/private  String sign(Long timestamp , String secret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {String stringToSign = timestamp + "\n" + secret;Mac mac = Mac.getInstance("HmacSHA256");mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");System.out.println(sign);return  sign;}/*** 通知具体人** @param content    通知内容* @param mobileList 通知具体人的手机号码列表*/public  void sendDingTalkMsg(List<String> mobileList, String content) {sendDingTalkMsg(false, mobileList, content);}/*** 通知所有人** @param content 通知内容*/public  void sendDingTalkMsg(String content) {sendDingTalkMsg(true, null, content);}/*** 发送消息** @param content    通知内容* @param isAtAll    是否@所有人* @param mobileList 通知具体人的手机号码列表*/private  void sendDingTalkMsg(boolean isAtAll, List<String> mobileList, String content) {try {Long timestamp = System.currentTimeMillis();String sign = sign(timestamp,secret);String msg_url  =  webhook + "&timestamp=" + timestamp + "&sign=" + sign;if (!CollectionUtils.isEmpty(mobileList)) {isAtAll = false;}//消息内容Map<String, String> contentMap = new HashMap<>();contentMap.put("content", content);//通知人Map<String, Object> atMap = new HashMap<>();//1.是否通知所有人atMap.put("isAtAll", isAtAll);//2.通知具体人的手机号码列表atMap.put("atMobiles", mobileList);Map<String, Object> parameter = new HashMap<>();parameter.put("msgtype", "text");parameter.put("at", atMap);parameter.put("text", contentMap);//推送消息(http请求)String result = HttpUtils.post(msg_url, JSON.toJSONString(parameter));log.info("发送钉钉消息-result:{}", result);} catch (Exception e) {log.error("发送钉钉消息异常", e);}}}

http请求工具类

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;import java.io.Closeable;
import java.nio.charset.Charset;
import java.util.Map;/*** http请求-工具类*/
@Slf4j
public class HttpUtils {private static final String UTF_8 = "utf-8";private static RequestConfig requestConfig;static {requestConfig = RequestConfig.custom().setConnectTimeout(1000)//连接超时时间.setSocketTimeout(3000)//读超时时间.build();}/*** post请求(无参/参数在url上)*/public static String post(String url) throws Exception {return post(url, "");}/*** post请求*/public static String post(String url, String body) throws Exception {CloseableHttpClient httpClient = null;CloseableHttpResponse httpResponse = null;try {httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);if (StringUtils.isNotBlank(body)) {StringEntity se = new StringEntity(body, Charset.forName(UTF_8));se.setContentType("text/json");se.setContentEncoding(new BasicHeader("Content-Type", "application/json"));httpPost.setEntity(se);}httpPost.setConfig(requestConfig);httpPost.setHeader("Content-Type", "application/json;charset=utf-8");httpResponse = httpClient.execute(httpPost);if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {return EntityUtils.toString(httpResponse.getEntity(), UTF_8);} else {log.error("post请求其它服务失败,statusCode:{}", httpResponse.getStatusLine().getStatusCode());}} catch (Exception e) {log.error("post请求其它服务异常", e);throw e;} finally {close(httpClient);close(httpResponse);}return null;}/*** post请求*/public static String post(String url, Map<String, String> parameter) throws Exception {return post(url, JSON.toJSONString(parameter));}/*** 关闭流*/private static <T extends Closeable> void close(T io) {if (io == null) {return;}try {io.close();} catch (Exception e) {log.error(e.getMessage(), e);}}
}

 


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

相关文章

upload-labs关卡记录3

同理&#xff0c;我们先上传一个一句话木马进行尝试&#xff0c;发现页面会刷新&#xff0c;于是看是白名单还是黑名单 看到提示&#xff1a;不允许上传.asp,.aspx,.php,.jsp后缀文件&#xff01;说明这是黑名单的类型。这里我们发现在限制里面&#xff0c;并没有说不能上传.ht…

工厂常用软件系统大全中英文全称对照表及功能介绍应用场景ERP MES WMS SCADA IOT SAP等软件系统介绍

1. ERP&#xff08;Enterprise Resource Planning&#xff09;企业资源计划&#xff1a; ○ 功能&#xff1a;整合企业的各项资源和业务流程&#xff0c;涵盖从采购、生产到销售的各个环节。包括财务管理、生产计划、采购管理、库存管理、销售管理、人力资源管理等。 ○ 应用场…

创建仓颉编程语言的第一个项目

创建仓颉编程语言的第一个项目 安装仓颉编程语言编译器第一个仓颉项目 安装仓颉编程语言编译器 安装仓颉编程语言编译器&#xff0c;是一个需要非常强的动手能力的过程——有大量的命令行操作。这不是仓颉编程语言独有的特点。现在流行的编程语言&#xff0c;比如 kotlin、jav…

江苏计算机专转本 技能Mysql知识点总结(一)

一、概述 1.使用命令行窗口链接MySQL数据库 mysql -u用户名 -p 密码 2.数据表中的一行称为 一条记录 3.SQL Server、Oracle、Mysql、DB2、SyBase&#xff0c;PostgreSQL全是关系数据库。 MongoDB、Cassandra、Neo4j全是非关系数据库。 4.E-R图 矩形&#xff1a;表示实体。菱…

【区块链】深入理解椭圆曲线密码学(ECC)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…

docker 软连接修改存储位置

查看docker路径 默认情况下Docker的存放位置为&#xff1a;/var/lib/docker&#xff0c;也可以通过如下命令查看docker存储路径 docker info | grep "Docker Root Dir" 停掉docker服务 systemctl stop docker 移动docker目录 mv /var/lib/docker /var/sda1/docker_…

Nexa AI发布OmniAudio-2.6B:一款快速的音频语言模型,专为边缘部署设计

音频语言模型&#xff08;Audio Language Models&#xff0c;简称ALMs&#xff09;在众多领域扮演着核心角色&#xff0c;涵盖从即时转录与翻译到语音控制界面和辅助技术等应用。然而&#xff0c;现有的解决方案常遭遇如高延迟、计算资源消耗巨大以及对云基础设施的依赖等挑战。…

EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令 一、概述 Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作: EdgeX Foundry中的其他微服务(例如,本地边缘分析或规则引擎微服务)EdgeX Foundry与同一系统上可能存在的其他应用程序…