背景
小项目内部出现异常情况需要通知到人员,因为日常使用的就是钉钉,于是就是想如果项目内部一些消息通知到钉钉里面。
实现原理
创建钉钉群聊,群聊增加机器人。机器人可以用HTTP调用将需要的数据以消息的形式发送到群聊里面。
具体实践
创建群聊,并设置群聊机器人
创建钉钉群聊
增加机器人
获取 access_token 和 密钥
结合项目发送消息
文档资料:机器人发送群聊消息 - 钉钉开放平台
发送代码
@Slf4j
public class DingUtils {
/**
* 发送钉钉消息
*/
public static void sendDingMsg(SendDingMsgDto sendDingMsg) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
StringBuilder url = new StringBuilder(sendDingMsg.getUrl()).append("?access_token=")
.append(sendDingMsg.getAccessToken());
Long timestamp = System.currentTimeMillis() + 60 * 1000;
String stringToSign = timestamp + "\n" + sendDingMsg.getSecret();
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(sendDingMsg.getSecret().getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
url.append("×tamp=").append(timestamp).append("&sign=").append(sign);
String result = HttpUtil.post(url.toString(), JSONUtil.toJsonStr(sendDingMsg.getDingMessageDto()));
log.info("推送结果:{}", result);
}
}
@Data
@Builder
public class SendDingMsgDto {
/**
* url
*/
private String url;
/**
* accessToken
*/
private String accessToken;
/**
* secret
*/
private String secret;
/**
* 消息内容
*/
private DingMessageDto dingMessageDto;
}
@Data
@Builder
public class DingMessageDto {
/**
* 消息类型
*/
private String msgtype;
/**
* markdown类型消息
*/
private MarkDownDto markdown;
/**
* 文本消息
*/
private TextDto text;
public static String TEXT = "text";
public static String MARKDOWN = "markdown";
}