java接入钉钉告警机器人

钉钉官方文档
钉钉官方文档: 使用教程

  • 创建告警机器人
    在钉钉群里建一个自定义机器人, 安全认证方式推荐选择签名
  • 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&timestamp="
                    + 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);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值