自定义钉钉机器人推送使用

使用场景
可用于替换短信发送节约成本,也可以将报警等消息推送到指定的钉钉群中

调用频率限制
由于消息发送太频繁会严重影响群成员的使用体验,因此钉钉开放平台对自定义机器人发送消息的频率作出以下限制:
每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。

1. 创建钉钉机器人(电脑版)

群设置>添加机器人>设置>自定义>添加 进入添加钉钉机器人页面

python操作钉钉机器人 java钉钉机器人_IP


选择需要钉钉机器人推送消息的群组以及安全配置,这里简介一下三种安全配置:

  1. 自定义关键字:最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。
  2. 加签:把timestamp+“\n”+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。得到签名后还需要将该签名拼接到URL中
  3. 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("短信链接");
}

python操作钉钉机器人 java钉钉机器人_IP_02