使用自定义钉钉机器人进行消息推送
一、下载钉钉客户端(电脑版)
https://page.dingtalk.com/wow/dingtalk/act/download?spm=a213l2.13146415.4929779444.74.7f1521c9mAY6yf
设置自定义机器人需要电脑版的客户端进行设置权限问题手机无法设置;
二、设置电脑机器人
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。完成必要的安全设置(至少选择一种),勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”即可。
这里需要添加安全设置本人选择的是加签的方式。后续给出对应的api方案
步骤二:复制出机器人的Webhook地址(格式如下截图),可用于向这个群发送消息。并点击【完成】,自定义机器人就添加成功了。
三、加签方式的对接
如上图所示选择安全为加签的方式需要加签运算附上说明文档地址
获取机器人的加签的地址(webhook+加签验证组成)
/**
* **获取认证的sign地址(webhook+加签验证组成)**
* timestamp
* 当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时
*
* secret
* 密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串
* 把 timestamp和第一步得到的签名值拼接到URL中。
* https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX
*
* 参考https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
* @return
* @throws Exception
*/
public static String sign() throws Exception{
Long timestamp = System.currentTimeMillis();
String secret = "SEC0e2560d92a402e84bb6343b82bf4fe7283f2c1b7e72e5a516d83271******";
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");
String signUrl = URL+"×tamp="+timestamp+"&sign="+sign;
return signUrl;
}
/**
* 发送钉钉机器人消息
* @param body
* @return
* @throws Exception
*/
private static String post(Map body) throws Exception{
String returnString = null;
try {
returnString = Request.Post(sign()).connectTimeout(3000)
.bodyString(JSON.toJSONString(body), ContentType.APPLICATION_JSON).execute().returnContent().asString();
} catch (IOException e) {
e.printStackTrace();
}
return returnString;
}
//测试调用机器人发送消息
public static void main(String[] args) throws Exception{
Long begin = System.currentTimeMillis();
MapFactory mapFactory = new MapFactory();
mapFactory.put("msgtype", "markdown")
.put("markdown", new MapFactory().put("text", "").put("title", "马化腾给您发消息了").getMap())
.put("at", new MapFactory().put("atMobiles", new String[]{"1", "2"}).getMap())
.put("isAtAll", false);
Long end = System.currentTimeMillis();
post(mapFactory.getMap());
System.out.println((end - begin) + "ms");
}