Background
网上此类相关教程有很多哈,但是,都不能直接拿来用,还需要自己拿过来封装调试下,这里是参考别人的实现自己的过程,做下记录,方便以后查阅:
详细信息请参考: 【钉钉官方开发文档】
1、建立一个钉钉群
人数要大于等于三人(不然还群聊个锤子…),一般需要在电脑端操作,下面添加机器人也是。
2、添加机器人
在【群设置】【智能群助手】【添加机器人】添加一个【自定义机器人】。
3、拿到url、token 和 secret
注意:这里secret有很长,全选是可以复制的。
4、DingTalkUtil 工具类
package com.cloudansys.core.util;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
@Slf4j
public class DingTalkUtil {
private static OkHttpClient mClient;
private static String url;
//初始化客户端
static {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(10L, TimeUnit.SECONDS);
builder.readTimeout(10L, TimeUnit.SECONDS);
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequestsPerHost(200);
dispatcher.setMaxRequests(200);
builder.dispatcher(dispatcher);
mClient = builder.build();
try {
url = getSign();
} catch (Exception e) {
log.error("获取签名失败!");
e.printStackTrace();
}
}
/**
* 通用 POST 请求方法 依赖 OKhttp3
* @param message 所要发送的消息
* @return 发送状态回执
*/
public static String postWithJson(String message) {
JSONObject jsonObject = new JSONObject();
//固定参数
jsonObject.put("msgtype", "text");
JSONObject content = new JSONObject();
//此处message是你想要发送到钉钉的信息
content.put("content", message);
jsonObject.put("text", content);
RequestBody body = RequestBody.create(
MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
Request request = new Request.Builder().url(url).post(body).build();
try {
Response response = mClient.newCall(request).execute();
if (response.body() != null) {
return response.body().string();
}
} catch (IOException e) {
log.error("消息发送失败!");
e.printStackTrace();
}
return null;
}
/**
* 获取签名
* @return 返回签名
*/
private static String getSign() throws Exception {
String baseUrl = "https://oapi.dingtalk.com/robot/send?access_token=";
String token = "53a21b3dc6e838f5d625048ab4e87345682981a7d81565197435e552cc1d2a22";
String secret = "SEC6abd029b3700c7d3c80042c5c93456657c9bbb5f09be2179436f934764d2a55d";
long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
return baseUrl + token + "×tamp=" + timestamp + "&sign=" +
URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
}
}
5、使用示例
package com.cloudansys.test;
import com.cloudansys.core.util.DingTalkUtil;
public class T2 {
public static void main(String[] args) {
String message = "this is a test from wlf!";
String res = DingTalkUtil.postWithJson(message);
System.out.println(res);
}
}
- 打印信息如下图:
- 钉钉群接收到的消息如下图:
6、常见问题
6.1 发送频率问题
默认配置发送频率最高为一分钟20条消息。超高该频率会报如下错误,第20条以后的消息发送失败,需等待一段时间。
16
{"errcode":0,"errmsg":"ok"}
17
{"errcode":0,"errmsg":"ok"}
18
{"errcode":0,"errmsg":"ok"}
19
{"errcode":130101,"errmsg":"send too fast, exceed 20 times per minute"}
20
{"status":1111,"wait":5,"source":"x5","punish":"deny","uuid":"87d008272a01212f4574ed564b91d0"}
21
{"status":1111,"wait":5,"source":"x5","punish":"deny","uuid":"70bccb41dde4223dfe2407c240fd87"}
22