钉钉机器人Java实现
程序员文章站
2022-07-14 22:10:30
...
钉钉机器人Java实现
获取自定义机器人webhook
-
钉钉里面新建群,在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。
-
最近钉钉更新了文档,在安全方面做了更好的处理,选择其中一种方式进行发送,代码会在下面的工具类中列举。
消息类型及数据格式
本着要写成工具类的方法,所以把需要用到类型都写成实体类
-
文本类型
TextRebootModel类 @Data public class TextRebootModel { /** * 此消息类型为固定text */ public String msgtype = "text"; public ContentModel text; public AtMobiles at; } ContentModel类 @Data public class ContentModel { /** * 消息内容 */ private String content; } AtMobiles类 @Data public class AtMobiles { /** * 被@人的手机号 * @return */ private List<String> atMobiles; /** * @所有人时:true,否则为:false */ private Boolean isAtAll; }
-
MarkDown类型
MarkDownRebootModel类型 @Data public class MarkDownRebootModel { /** * 此消息类型为固定markdown */ public String msgtype = "markdown"; public MarkDownModel markdown; public AtMobiles at; } MarkDownModel类 @Data public class MarkDownModel { /** * 首屏会话透出的展示内容 */ private String title; /** * markdown格式的消息 */ private String text; }
钉钉机器人封装工具类方法
public class RebootUtil {
/**
* 组装 发送的信息
* Text版本
* @param isAt 是否需要 @所有人
* @param msgContent 要发送信息的主体
* @param telList 要 @人的电话号码,如果@单独的几个人,就传一个空list,而不是 null
* @return
*/
public static String setMessage(boolean isAt, String msgContent, List<String> telList) {
TextRebootModel model = new TextRebootModel();
AtMobiles atMobiles = new AtMobiles();
atMobiles.setIsAtAll(isAt);
atMobiles.setAtMobiles(telList);
ContentModel contentModel = new ContentModel();
contentModel.setContent(msgContent);
model.setAt(atMobiles);
model.setText(contentModel);
String toMsg = JSON.toJSONString(model);
return toMsg;
}
/**
* 组装 发送的信息
* Markdown格式
* @param isAt 是否需要 @所有人
* @param title 标题
* @param msgContent 要发送信息的主体
* @param telList 要 @人的电话号码,如果@单独的几个人,就传一个空list,而不是 null
* @return
*/
public static String setMarkDown(boolean isAt, String title, String msgContent, List<String> telList) {
MarkDownRebootModel model = new MarkDownRebootModel();
AtMobiles atMobiles = new AtMobiles();
atMobiles.setIsAtAll(isAt);
atMobiles.setAtMobiles(telList);
MarkDownModel markDownModel = new MarkDownModel();
markDownModel.setTitle(title);
markDownModel.setText(msgContent);
model.setAt(atMobiles);
model.setMarkdown(markDownModel);
String Message = JSON.toJSONString(model);
return Message;
}
/**
* post 请求,发送给哪一个机器人
*
* @param reboot 机器人的token
* @param message 发送的消息
* @return
*/
public static String sendPost(String reboot, String message) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(reboot);
httppost.addHeader("Content-Type", "application/json; charset=utf-8");
String textMsg = message;
StringEntity se = new StringEntity(textMsg, "utf-8");
httppost.setEntity(se);
String result = null;
HttpResponse response = null;
try {
response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
result = EntityUtils.toString(response.getEntity(), "utf-8");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 选择加签方式下的加签方法
* @param secret **,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串
* @return
*/
public static Map<String, String> dingDingSec(String secret) throws Exception {
Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
Map<String, String> map = new HashMap();
map.put("sign", sign);
map.put("timestamp", timestamp.toString());
return map;
}
/**
* 加签机器人实现,这里需要注意的是:timestamp和sign需要保持一致
*
* @param message 要发送的信息
* @return
* @throws Exception
*/
public static String sendReboot(String message) throws Exception {
Map<String,String> map=dingDingSec("钉钉机器人的SEC");
String sign = map.get("sign");
String timestamp = map.get("timestamp");
StringBuffer stringBuffer = new StringBuffer();
String robotUrl =stringBuffer.append(“钉钉机器人的webhook”).append("×tamp=").append(timestamp).append("&sign=").append(sign).toString();
return sendPost(robotUrl, message);
}
/**
* 关键字机器人:发送消息中需要有对应的关键字才能发送成功
* @param message 封装的消息
* @return
* @throws Exception
*/
public static String sendKeyReboot(String message) throws Exception {
return sendPost("钉钉机器人的webhook", message);
}
}
public static void main(String[] args) {
//text类型的消息:
String text=RebootUtil.setMessage(true,"我就是我, @1825718XXXX 是不一样的烟火",Arrays.asList(""));
//markDown类型的消息:使用于字体加粗,超链接隐藏
String markDown=RebootUtil.setMarkDown(true,"杭州天气","#### 杭州天气 \n > 9度,@1825718XXXX 西北风1级,空气良89,相对温度73%\n\n > ![screenshot](http://i01.lw.aliimg.com/media/lALPBbCc1ZhJGIvNAkzNBLA_1200_588.png)\n > ###### 10点20分发布 [天气](http://www.thinkpage.cn/)",Arrays.asList(""));
//钉钉机器人推送
try {
String message = RebootUtil.setMessage(false, "测试", Arrays.asList(""));
RebootUtil.sendReboot(message);
} catch (Exception e) {
e.printStackTrace();
}
}
总结
钉钉调用机器人还是比较简单的,在一些统计数据方面可以有效的集成开发。
本文中的2个IDEA插件GsonFormat和Lombok还是挺方便的,详细安装方法可以查看文章
上一篇: jq input 实时监听chang事件
下一篇: jQuery实时监听input 输入的值