1、實例化WebClient對象
其實你也可以使用RestTemplate,我這里主要是用到了webflux框架,所以需要實例化客戶端請求對象文章來源地址http://www.zghlxwxcb.cn/news/detail-694510.html
@Bean
public WebClient webClient(){
HttpClient httpClient = getHttpClient();
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient)).build();
}
private HttpClient getHttpClient() {
ConnectionProvider provider = ConnectionProvider.builder("你愛咋咋的,一般用你項目名即可")
.maxConnections(500)
.maxIdleTime(Duration.ofSeconds(10))
.maxLifeTime(Duration.ofSeconds(20))
.pendingAcquireTimeout(Duration.ofSeconds(30))
.pendingAcquireTimer((r, d) -> {
Timeout t = wheel.newTimeout(timeout -> r.run(), d.toMillis(), TimeUnit.MILLISECONDS);
return () -> t.cancel();
})
.fifo()
.build();
HttpClient httpClient = HttpClient.create(provider);
return httpClient;
}
2、發(fā)送及有效性測試工具類
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import static com.paratera.console.notice.utils.Constants.*;
/**
* 機器人發(fā)送工具類(微信,飛書,釘釘)
*
* @author huxiang
*/
@Component
@Slf4j
public class RobotUtil {
@Autowired
private WebClient webClient;
/**
* 機器人發(fā)送消息(markdown格式)
*
* @param robotUrl 機器人地址
* @param type 類型:1微信,2飛書,3釘釘
* @param context markdown文本內(nèi)容
* @param signSecret 簽名校驗(飛書,釘釘使用,可為空,具體要根據(jù)用戶是否啟用簽名)
*/
public void sendMsg(String robotUrl, Integer type, String context, String signSecret) {
JSONObject msgObj = JSONUtil.createObj();
JSONObject mdObj = JSONUtil.createObj();
switch (type) {
case ROBOT_TYPE_WX:
msgObj.set("msgtype", "markdown");
mdObj.set("content", context);
msgObj.set("markdown", mdObj);
break;
case ROBOT_TYPE_FS:
if (StringUtils.isNotEmpty(signSecret)) {
msgObj = getFsSignObj(signSecret);
}
msgObj.set("msg_type", "interactive");
mdObj.set("tag", "lark_md");
mdObj.set("content", context);
JSONArray elements = JSONUtil.createArray();
JSONObject wrapObj = JSONUtil.createObj();
wrapObj.set("tag", "div");
wrapObj.set("text", mdObj);
elements.put(wrapObj);
JSONObject cardObj = JSONUtil.createObj();
cardObj.set("elements", elements);
msgObj.set("card", cardObj);
break;
case ROBOT_TYPE_DD:
if (StringUtils.isNotEmpty(signSecret)) {
robotUrl = getDdRobotURL(robotUrl, signSecret);
}
msgObj.set("msgtype", "markdown");
mdObj.set("title", "通知");
mdObj.set("text", context);
msgObj.set("markdown", mdObj);
break;
}
webClient.post()
.uri(robotUrl)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(msgObj))
.retrieve().bodyToMono(String.class).subscribe(
result -> {
log.info("機器人通知發(fā)送結(jié)果:" + result);
}
);
}
/**
* 機器人有效性測試 0表示成功,其他表示失敗
*
* @param robotUrl 機器人地址
* @param type 類型:1微信,2飛書,3釘釘
* @param signSecret 簽名校驗(飛書,釘釘使用,可為空,具體要根據(jù)用戶是否啟用簽名)
* @return
*/
public Integer sendTestMsg(String robotUrl, Integer type, String signSecret) {
JSONObject msgObj = JSONUtil.createObj();
JSONObject mdObj = JSONUtil.createObj();
ObjectMapper mapper = new ObjectMapper();
switch (type) {
case ROBOT_TYPE_WX:
msgObj.set("msgtype", "markdown");
mdObj.set("content", "機器人有效性測試!");
msgObj.set("markdown", mdObj);
break;
case ROBOT_TYPE_FS:
if (StringUtils.isNotEmpty(signSecret)) {
msgObj = getFsSignObj(signSecret);
}
msgObj.set("msg_type", "interactive");
mdObj.set("tag", "lark_md");
mdObj.set("content", "機器人有效性測試!");
JSONArray elements = JSONUtil.createArray();
JSONObject wrapObj = JSONUtil.createObj();
wrapObj.set("tag", "div");
wrapObj.set("text", mdObj);
elements.put(wrapObj);
JSONObject cardObj = JSONUtil.createObj();
cardObj.set("elements", elements);
msgObj.set("card", cardObj);
break;
case ROBOT_TYPE_DD:
if (StringUtils.isNotEmpty(signSecret)) {
robotUrl = getDdRobotURL(robotUrl, signSecret);
}
msgObj.set("msgtype", "markdown");
mdObj.set("title", "通知");
mdObj.set("text", "機器人有效性測試!");
msgObj.set("markdown", mdObj);
break;
}
Mono<String> mono = webClient.post()
.uri(robotUrl)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(msgObj))
.retrieve().bodyToMono(String.class);
String result = mono.block();
try {
Map res = mapper.readValue(result, Map.class);
return (Integer) (res.containsKey("errcode") ? res.get("errcode") : res.get("code"));
} catch (JsonProcessingException e) {
log.error("類型轉(zhuǎn)換異常-RobotUtil.sendTestMsg:" + e);
}
return -1;
}
/**
* 飛書獲取帶簽名的消息體
*
* @return
*/
public JSONObject getFsSignObj(String signSecret) {
JSONObject signObj = JSONUtil.createObj();
Long timestamp = DateUtil.currentSeconds();
String sign = null;
try {
//把timestamp+"\n"+密鑰當(dāng)做簽名字符串
String stringToSign = timestamp + "\n" + signSecret;
//使用HmacSHA256算法計算簽名
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] signData = mac.doFinal(new byte[]{});
sign = Base64.encodeBase64String(signData);
} catch (Exception e) {
log.error("飛書獲取簽名失敗:" + e);
}
if (StringUtils.isEmpty(sign)) {
return null;
}
signObj.set("timestamp", timestamp);
signObj.set("sign", sign);
return signObj;
}
/**
* 釘釘獲取帶簽名的機器人推送URL
*
* @return
*/
public String getDdRobotURL(String robotUrl, String signSecret) {
Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + signSecret;
String sign = null;
try {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(signSecret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
sign = URLEncoder.encode(Base64.encodeBase64String(signData), "UTF-8");
} catch (Exception e) {
log.error("釘釘獲取簽名失敗:" + e);
}
if (StringUtils.isEmpty(sign)) {
return null;
}
return robotUrl + "×tamp=" + timestamp + "&sign=" + sign;
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-694510.html
到了這里,關(guān)于企業(yè)微信、飛書、釘釘機器人消息發(fā)送工具類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!