- 创建告警机器人
在钉钉群里建一个自定义机器人, 安全认证方式推荐选择签名 - java代码
package com.hahacloud.server.saas.service.misc.poll.biz.service.utils;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import com.hahacloud.server.framework.core.logs.LogManager;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.time.Instant;
import java.util.Map;
/**
* @author Lynn
* @date 2023/5/6 15:43
*/
public class DingTalkUtil {
/**
* 给钉钉群发送消息方法
*
* @param content 消息内容
*/
private static String sendMsg(String content) {
try {
// 安全方式选择验签
String secret = "91f27cfb46200878732d206297e869a1d3eaf1ed4eb84931feee1d09d5";
// 获取系统时间戳
long timestamp = Instant.now().toEpochMilli();
// 拼接
String stringToSign = timestamp + "\n" + secret;
// 使用HmacSHA256算法计算签名
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
// 进行Base64 encode 得到最后的sign,可以拼接进url里
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
// 钉钉机器人地址(配置机器人的webHook)
String dingUrl =
"https://oapi.dingtalk.com/robot/send?access_token=bf97de262c54e15dab407231668d0940c331196fd5038f74882×tamp="
+ timestamp + "&sign=" + sign;
return HttpUtil.post(dingUrl, content);
} catch (Exception e) {
LogManager.getSystemLog().warn(e, "text|{}", e.getMessage());
return null;
}
}
/**
* @param content 内容
*/
public static String buildReqStr(String content) {
// 消息内容
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("content", content);
Map<String, Object> reqMap = Maps.newHashMap();
reqMap.put("msgtype", "text");
reqMap.put("text", contentMap);
return DingTalkUtil.sendMsg(JSON.toJSONString(reqMap));
}
public static void main(String[] args) {
try {
Integer i = null;
if (i < 1) {
}
} catch (Exception e) {
DingTalkUtil.buildReqStr("异常====>");
}
}
}
- 钉钉支持多种文本类型,比如text, markdown
处理不通的文本:
private String handleTextMessage(AppCrashBo bo) {
return "系统版本: " + (StringUtils.isNotBlank(bo.getSysVersion()) ? bo.getSysVersion() : "") + ";\n" +
"应用版本: " + (StringUtils.isNotBlank(bo.getAppVersion()) ? bo.getAppVersion() : "")+ ";\n" +
"设备序列号: " + (StringUtils.isNotBlank(bo.getDeviceId()) ? bo.getDeviceId() : "") + ";\n" +
"设备型号: " + (StringUtils.isNotBlank(bo.getDeviceModel()) ? bo.getDeviceModel() : "") + ";\n" +
"生产厂家: " + (StringUtils.isNotBlank(bo.getDeviceManufacturer()) ? bo.getDeviceManufacturer() : "") + ";\n" +
"应用名称: " + (StringUtils.isNotBlank(bo.getAppName()) ? bo.getAppName() : "") + ";\n" +
"应用包名: " + (StringUtils.isNotBlank(bo.getAppPackage()) ? bo.getAppPackage() : "") + ";\n" +
"构建风格: " + (StringUtils.isNotBlank(bo.getBuildFlavor()) ? bo.getBuildFlavor() : "") + ";\n" +
"异常信息: " + (StringUtils.isNotBlank(bo.getExceptionInfo()) ? bo.getExceptionInfo() : "") + ";";
}
private String handleMarkDownMessage(AppCrashBo bo) {
return "**系统版本:** " + (StringUtils.isNotBlank(bo.getSysVersion()) ? bo.getSysVersion() : "") + "\n\n" +
"**应用版本:** " + (StringUtils.isNotBlank(bo.getAppVersion()) ? bo.getAppVersion() : "")+ "\n\n" +
"**<font color=\"#666600\">设备序列号:</font>** " + (StringUtils.isNotBlank(bo.getDeviceId()) ? bo.getDeviceId() : "") + "\n\n" +
"**设备型号:** " + (StringUtils.isNotBlank(bo.getDeviceModel()) ? bo.getDeviceModel() : "") + "\n\n" +
"**生产厂家:** " + (StringUtils.isNotBlank(bo.getDeviceManufacturer()) ? bo.getDeviceManufacturer() : "") + "\n\n" +
"**<font color=\"#000066\">应用名称:</font>** " + (StringUtils.isNotBlank(bo.getAppName()) ? bo.getAppName() : "") + "\n\n" +
"**应用包名:** " + (StringUtils.isNotBlank(bo.getAppPackage()) ? bo.getAppPackage() : "") + "\n\n" +
"**构建风格:** " + (StringUtils.isNotBlank(bo.getBuildFlavor()) ? bo.getBuildFlavor() : "") + "\n\n" +
"**<font color=\"#dd0000\">异常信息:</font>** " + (StringUtils.isNotBlank(bo.getExceptionInfo()) ? bo.getExceptionInfo() : "");
}
发送请求时的区别:
/**
* 发送text
* @param content 内容
*/
public static String buildTextMessage(String content, String secret, String webHookUrl) {
// 消息内容
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("content", content);
Map<String, Object> reqMap = Maps.newHashMap();
reqMap.put("msgtype", "text");
reqMap.put("text", contentMap);
return DingTalkUtil.sendMsg(JSON.toJSONString(reqMap), secret, webHookUrl);
}
/**
* 发送MarkDown
* @param content 内容
*/
public static String buildMarkDownMessage(String title, String content, String secret, String webHookUrl) {
// 消息内容
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("title", title);
contentMap.put("text", content);
Map<String, Object> reqMap = Maps.newHashMap();
reqMap.put("msgtype", "markdown");
reqMap.put("markdown", contentMap);
return DingTalkUtil.sendMsg(JSON.toJSONString(reqMap), secret, webHookUrl);
}