JAVA 实现调用钉钉机器人发送信息
文章目录
前言
java调用钉钉的机器人进行发送信息,群信息的发送,也可以在群众@个别人员查看信息
提示:以下是本篇文章正文内容,下面案例可供参考
一、钉钉群设置
1、创建群
2、选择智能群助手
3、进行添加机器人
注意:在这里我们创建的机器人其中涉及到的(加签)、(Webhook)中的数据提前复制出来一份,代码会用到,不在创建机器人的时候保存,也可在点击机器人头像中的机器人你设置查看到。
4、下面开始创建机器人
5、创建完成
二、编写代码util
1.地址url的获取
代码如下:
//钉钉机器人地址(配置机器人的webhook)这里我么能得到了dingUrl
String baseUrl = "https://oapi.dingtalk.com/robot/send?access_token=";
String token = "b7b308debe235c9346c3f40ec028bde031916e9837b935244ff306823d5c0722";
String secret = "SECdaae5572ef80810a2c0131ba7aed56484e5b90d0c2f3bf9140c247682560e3a2";
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));
String dingUrl = baseUrl + token + "×tamp=" + timestamp + "&sign=" + URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
2.设置发送内容,发送人,是否@所有人
代码如下(示例):
//是否通知所有人
boolean isAtAll = false;
//通知具体人的手机号码列表/可以再群里面点击个人头像进行复制
List<String> mobileList = Lists.newArrayList();
//mobileList.add("+86-159*******");
//发送内容在这里也可以直接 String格式作为数据
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("测试1")//数据
.append("\n")//换行
.append("[对勾]");//表情
String content = stringBuffer.toString();
官网中给到的数据格式:
//消息类型及数据格式
//text类型
{
"msgtype": "text",
"text": {
"content": "测试1@159*******"
},
"at": {
"atMobiles": [
"159*******"
],
"isAtAll": false
}
}
3.基于上面的官网格式,我们在这里对数据进行一下组装
//组装数据
//消息内容
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("content", content);
//通知人员数据
Map<String, Object> atMap = Maps.newHashMap();
//1.是否通知所有人
atMap.put("isAtAll", isAtAll);
//2.通知具体人的手机号码列表
atMap.put("atMobiles", mobileList);
//组装数据
Map<String, Object> requestMap = Maps.newHashMap();
requestMap .put("msgtype", "text");
requestMap .put("text", contentMap);
requestMap .put("at", atMap);
String requestJson = JSON.toJSONString(reqMap);
4.发送请求
//dingUrl 机器人地址
//requestJson 组装数据json
String returnData= HttpUtil.doPosthttp(dingUrl, requestJson );
System.out.println("returnData== " + returnData);
//HttpUtil 工具类
//doPosthttp
/**
* 发送 POST 请求(HTTP),JSON形式
* @param apiUrl
* @param json json对象
* @return
*/
public static String doPosthttp(String apiUrl, Object json) {
CloseableHttpClient httpClient = HttpClients.createDefault();
String httpStr = null;
HttpPost httpPost = new HttpPost(apiUrl);
CloseableHttpResponse response = null;
try {
httpPost.setConfig(requestConfig);
StringEntity stringEntity = new StringEntity(json.toString(), "UTF-8");//解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine().getStatusCode());
httpStr = EntityUtils.toString(entity, "UTF-8");
} catch (IOException e) {
logger.error(e.toString());
} finally {
if (response != null) {
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
logger.error(e.toString());
}
}
}
return httpStr;
}
5.钉钉接受信息
三、整体代码
package com.pcitc.vms.util;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.net.Socket;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
class DingTalkUtil {
private static final String NEWLINE = "\n";
public static void main(String[] args) throws IOException {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("测试1")//数据
.append("\n")//换行
.append("[对勾]");//表情
sendDingDing(stringBuffer);
}
/**
* 发送钉钉
* @param stringBuffer 钉钉机器人消息内容
*/
private static void sendDingDing(StringBuffer stringBuffer) {
try {
//钉钉机器人地址(配置机器人的webhook)
String baseUrl = "https://oapi.dingtalk.com/robot/send?access_token=";
String token = "b7b308debe235c9346c3f40ec028bde031916e9837b935244ff306823d5c0722";
String secret = "SECdaae5572ef80810a2c0131ba7aed56484e5b90d0c2f3bf9140c247682560e3a2";
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));
String dingUrl = baseUrl + token + "×tamp=" + timestamp + "&sign=" + URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
//是否通知所有人
boolean isAtAll = false;
//通知具体人的手机号码列表
List<String> mobileList = Lists.newArrayList();
//mobileList.add("+86-159*******");
String content = stringBuffer.toString();
//组装请求内容
String reqStr = packageBuildReqData(content, isAtAll, mobileList);
//推送消息(http请求)
String result = HttpUtil.doPosthttp(dingUrl, reqStr);
System.out.println("result == " + result);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 组装请求报文
* @param content
* @return
*/
private static String packageBuildReqData(String content, boolean isAtAll, List<String> mobileList) {
//消息内容
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("content", content);
//通知人
Map<String, Object> atMap = Maps.newHashMap();
//1.是否通知所有人
atMap.put("isAtAll", isAtAll);
//2.通知具体人的手机号码列表
atMap.put("atMobiles", mobileList);
Map<String, Object> reqMap = Maps.newHashMap();
reqMap.put("msgtype", "text");
reqMap.put("text", contentMap);
reqMap.put("at", atMap);
return JSON.toJSONString(reqMap);
}
}
总结
总结:发现问题请及时纠错,感谢阅读。