自定义钉钉机器人推送使用
使用场景
可用于替换短信发送节约成本,也可以将报警等消息推送到指定的钉钉群中
调用频率限制
由于消息发送太频繁会严重影响群成员的使用体验,因此钉钉开放平台对自定义机器人发送消息的频率作出以下限制:
每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。
1. 创建钉钉机器人(电脑版)
群设置>添加机器人>设置>自定义>添加 进入添加钉钉机器人页面
选择需要钉钉机器人推送消息的群组以及安全配置,这里简介一下三种安全配置:
- 自定义关键字:最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。
- 加签:把timestamp+“\n”+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。得到签名后还需要将该签名拼接到URL中
- IP地址(段):设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单。
以上三种安全配置至少选择一种才可以创建,可根据自己需求创建。
选择自定义关键字,输入对应关键字,勾选已阅读>完成,得到URL。
2. 创建发送请求钉钉机器人工具类
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("短信链接");
}