项目中需要设置服务报警提醒的功能,就选择了钉钉群的自定义机器人,来实现这个功能。钉钉支持多种语言,本篇demo主要是使用Java
选择自定义机器人
开启自定义机器人功能,获取webhook链接
可以点击设置说明,查看钉钉自定义机器人文档。
使用群自定义机器人支持两种方式,第一种是下载SDK,直接使用client来调用;第二种是直接调用钉钉提供的http接口,发起post请求,获取机器人提醒,本篇主要学习的是http调用接口方式,主要思路如下。
1.开启机器人之后,会获取一个webhook链接:
https://oapi.dingtalk.com/robot/send?access_token=XXXXXXX
2.查看钉钉自定义机器人的官方文档,调用相关接口即可。
自定义机器人官网文档:https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
3.使用自定义机器人
(1)发送http请求
获取到webhook地址之后,用户可以向这个地址发送 http请求,即可实现向群组发送消息。
注意,发起post请求后,必须将自符编码设置为UTF-8。
(2)消息类型
当前自定义机器人支持文本(text),链接(link),markdown(markdown),ActionCard,FeedCard消息类型,我们可以根据自己的业务场景来使用不同的方式。
(3)自定义接人发送消息时候,可以通过手机号,指定被@人的列表,即可设置@所有人,也可以指定@某个人。
1.baseDingEntity
public abstract class DingBaseVo {
public String msgtype;
}
2.text方法
@Data
@NoArgsConstructor
public class DingTextVo extends DingBaseVo {
private Map text;
private Map at;
@Builder
public DingTextVo(String content, Boolean atAll, String mobiles) {
msgtype = "text";
text = new HashMap();
HashMap contentMap = new HashMap();
contentMap.put("content", content);
text = contentMap;
at = new HashMap();
if (StringUtils.isNotEmpty(mobiles)) {
String[] mobileArray = mobiles.split(",");
HashMap atMap = new HashMap();
atMap.put("atMobiles", mobileArray);
atMap.put("isAtAll", atAll);
at = atMap;
}
}
}
3.link方式
@Data
@NoArgsConstructor
public class DingLinkVo extends DingBaseVo {
private HashMap link;
@Builder
public DingLinkVo(String messageUrl, String picUrl, String title, String text) {
this.msgtype = "link";
this.link = new HashMap();
link.put("messageUrl", messageUrl);
link.put("picUrl", picUrl);
link.put("title", title);
link.put("text", text);
}
}
4.测试调用
/**
* link方式
*
*/
public void linkNotice(DingLinkVo dingLinkVo) {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity responseResult = restTemplate.postForEntity(webHook_token, dingLinkVo, DingLinkVo.class);
if (responseResult.getStatusCode() != HttpStatus.OK) {
logger.info("钉钉发送失败,信息是:{}", responseResult);
}
}
/**
* text方式
*
*/
public void textNotice(DingBaseVo baseVo) {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity responseResult = restTemplate.postForEntity(webHook_token, baseVo, DingTextVo.class);
if (responseResult.getStatusCode() != HttpStatus.OK) {
logger.info("钉钉通知发送失败,信息是:{}", responseResult);
}
}
5. 测试用例
@Test
public void testTextDing() {
String content = "今天是个好日子,心想的事儿都能成~";
Boolean atAll = false;
String mobiles = "11111111111";
DingTextVo textVo = DingTextVo.builder().content(content).atAll(atAll).mobiles(mobiles).build();
logger.info("结果是:{}", JsonUtil.toJson(textVo));
dingTalkNotice.textNotice(textVo);
}
@Test
public void testLinkDing() {
String messageUrl = "https://www.dingtalk.com/";
String picUrl = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1802563968,897623865&fm=26&gp=0.jpg";
String title = "时代的火车向前开";
String text = "这个即将发布的新版本,创始人陈航(花名“无招”)称它为“红树林“";
DingLinkVo dingLinkVo = DingLinkVo.builder().messageUrl(messageUrl).picUrl(picUrl).title(title).text(text)
.build();
logger.info("testLinkDing 参数是:{}", JsonUtil.toJson(dingLinkVo));
dingTalkNotice.linkNotice(dingLinkVo);
}
@Test
public void linkNotice() {
HashMap message = new HashMap();
message.put("msgtype", "link");
HashMap map = new HashMap();
map.put("messageUrl", "https://www.dingtalk.com/");
map.put("picUrl", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1802563968,897623865&fm=26&gp=0.jpg");
map.put("title", "时代的火车向前开");
map.put("text", "这个即将发布的新版本,创始人陈航(花名“无招”)称它为“红树林“");
message.put("link", map);
String jsonMessage = JsonUtil.toJson(message);
logger.info("Ding请求参数是:{}", jsonMessage);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity
httpClient方法访
参考博客:https://blog.csdn.net/bc_aptx4869/article/details/80860358
/**
* httpClient方式调用
*/
@Test
public void testDingWarning() {
HashMap contentMap = new HashMap();
contentMap.put("content", "我是钉钉小可爱");
HashMap param = new HashMap();
param.put("msgtype", "text");
param.put("text", contentMap);
HttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(dingApiUrl);
httpPost.addHeader("Content-Type", "application/json; charset=utf-8");
String resultParam = JSONObject.toJSONString(param);
StringEntity se = new StringEntity(resultParam, "utf-8");
httpPost.setEntity(se);
try {
HttpResponse response = httpClient.execute(httpPost);
logger.info("返回值是:{}", response);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String result = EntityUtils.toString(response.getEntity(), "utf-8");
logger.info("错误信息是:{}", result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
钉钉自定义机器人,主要是为了服务器警报或者业务使用的,十分的方便。除了这个机器人了,最近看钉钉的官方文档,还有一些其他的功能机器人,比如天气预报,考勤提醒等挺好玩的,接下来继续研究下别的。