自定义钉钉机器人推送使用
钉钉官方文档
使用场景
可用于替换短信发送节约成本,也可以将报警等消息推送到指定的钉钉群中
调用频率限制
由于消息发送太频繁会严重影响群成员的使用体验,因此钉钉开放平台对自定义机器人发送消息的频率作出以下限制:
每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。
1. 创建钉钉机器人(电脑版)
群设置>添加机器人>设置>自定义>添加 进入添加钉钉机器人页面
选择需要钉钉机器人推送消息的群组以及安全配置,这里简介一下三种安全配置:
- 自定义关键字:最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。
- 加签:把timestamp+“\n”+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。得到签名后还需要将该签名拼接到URL中,详情链接
- IP地址(段):设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单。
以上三种安全配置至少选择一种才可以创建,可根据自己需求创建。
选择自定义关键字,输入对应关键字,勾选已阅读>完成,得到URL。
2. 创建发送请求钉钉机器人工具类
钉钉API接口
根据官方的API接口创建工具类
DingTalkPushUtil.java工具类,根据自己的URL修改工具类中的URL即可。
/*** 钉钉推送工具类*/
@Slf4j
@Async
@Component
public class DingTalkPushUtil {/*** 按照钉钉API处理内容格式* @param content*/public void pushText(String content) {MessageText message = new MessageText();MessageContent messageContent = new MessageContent();message.setMsgtype("text");messageContent.setContent(content);message.setText(messageContent);push(message);}/*** 推送消息* @param obj*/private void push(Object obj) {try {//自定义钉钉机器人生成链接 access_token钉钉自动生成URL url = new URL("自己钉钉机器人里的链接");//打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// Post 请求不能使用缓存conn.setUseCaches(false);conn.setRequestMethod("POST");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Type", "application/Json; charset=UTF-8");conn.connect();OutputStream out = conn.getOutputStream();String jsonMessage = JSONObject.toJSONString(obj);byte[] data = jsonMessage.getBytes();// 发送请求参数out.write(data);// flush输出流的缓冲out.flush();out.close();//开始获取数据InputStream in = conn.getInputStream();byte[] content = new byte[in.available()];in.read(content);log.info(">>>>>>>>>钉钉发送成功..........<<<<<<<<<");} catch (Exception e) {e.printStackTrace();}}}
/**创建钉钉格式类* @author admin*/
@Data
public class MessageText {/*** 消息文本类型 目前只支持文本*/private String msgtype;/*** 文本消息*/private MessageContent text;
}
/*** 文本内容类* @author admin*/
@Data
public class MessageContent {/*** 文本内容*/private String content;public MessageContent() {}public MessageContent(String content) {this.content = content;}}
3. 测试
因为一开始选择的是自定义关键字,所以发送的消息内容中需要有自定义关键词,不然消息无法发送。
public static void main(String[] args) {DingTalkPushUtil dingTalkPushUtil = new DingTalkPushUtil();dingTalkPushUtil.pushText("短信链接");
}
消息推送发送成功