欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

钉钉机器人Java实现

程序员文章站 2022-07-14 22:10:30
...

钉钉机器人Java实现

获取自定义机器人webhook

  1. 钉钉机器人文档网址

  2. 钉钉里面新建群,在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。

    钉钉机器人Java实现

  3. 最近钉钉更新了文档,在安全方面做了更好的处理,选择其中一种方式进行发送,代码会在下面的工具类中列举。
    钉钉机器人Java实现

消息类型及数据格式

本着要写成工具类的方法,所以把需要用到类型都写成实体类
  1. 文本类型

    TextRebootModel类
    @Data
    public class TextRebootModel {
        /**
         * 此消息类型为固定text
         */
        public String msgtype = "text";
    
        public ContentModel text;
    
        public AtMobiles at;
    }
    
    
    ContentModel类
    @Data
    public class ContentModel {
        /**
         * 消息内容
         */
        private String content;
    }
    
    
    AtMobiles类
    @Data
    public class AtMobiles {
    
        /**
         * 被@人的手机号
         * @return
         */
        private List<String> atMobiles;
    
        /**
         * @所有人时:true,否则为:false
         */
        private Boolean isAtAll;
    }
    
  2. MarkDown类型

    MarkDownRebootModel类型
    @Data
    public class MarkDownRebootModel {
        /**
         * 此消息类型为固定markdown
         */
        public String msgtype = "markdown";
    
        public MarkDownModel markdown;
    
        public AtMobiles at;
    }
    
    MarkDownModel类
    @Data
    public class MarkDownModel {
        /**
         * 首屏会话透出的展示内容
         */
        private String title;
    
        /**
         * markdown格式的消息
         */
        private String text;
    }
    

钉钉机器人封装工具类方法

public class RebootUtil {
/**
     * 组装 发送的信息
     * Text版本
     * @param isAt       是否需要 @所有人
     * @param msgContent 要发送信息的主体
     * @param telList    要 @人的电话号码,如果@单独的几个人,就传一个空list,而不是 null
     * @return
     */
    public static String setMessage(boolean isAt, String msgContent, List<String> telList) {

        TextRebootModel model = new TextRebootModel();
        AtMobiles atMobiles = new AtMobiles();
        atMobiles.setIsAtAll(isAt);
        atMobiles.setAtMobiles(telList);

        ContentModel contentModel = new ContentModel();
        contentModel.setContent(msgContent);

        model.setAt(atMobiles);
        model.setText(contentModel);

        String toMsg = JSON.toJSONString(model);

        return toMsg;
    }

    /**
     * 组装 发送的信息
     * Markdown格式
     * @param isAt       是否需要 @所有人
     * @param title      标题
     * @param msgContent 要发送信息的主体
     * @param telList    要 @人的电话号码,如果@单独的几个人,就传一个空list,而不是 null
     * @return
     */
    public static String setMarkDown(boolean isAt, String title, String msgContent, List<String> telList) {

        MarkDownRebootModel model = new MarkDownRebootModel();
        AtMobiles atMobiles = new AtMobiles();
        atMobiles.setIsAtAll(isAt);
        atMobiles.setAtMobiles(telList);

        MarkDownModel markDownModel = new MarkDownModel();
        markDownModel.setTitle(title);
        markDownModel.setText(msgContent);

        model.setAt(atMobiles);
        model.setMarkdown(markDownModel);

        String Message = JSON.toJSONString(model);

        return Message;
    }

    /**
     * post 请求,发送给哪一个机器人
     *
     * @param reboot  机器人的token
     * @param message 发送的消息
     * @return
     */
    public static String sendPost(String reboot, String message) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpPost httppost = new HttpPost(reboot);
        httppost.addHeader("Content-Type", "application/json; charset=utf-8");

        String textMsg = message;
        StringEntity se = new StringEntity(textMsg, "utf-8");
        httppost.setEntity(se);
        String result = null;
        HttpResponse response = null;
        try {
            response = httpclient.execute(httppost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                result = EntityUtils.toString(response.getEntity(), "utf-8");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
  
    /**
     * 选择加签方式下的加签方法
     * @param secret **,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串
     * @return
     */
    public static Map<String, String> dingDingSec(String secret) throws Exception {
        Long timestamp = System.currentTimeMillis();
        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");
        Map<String, String> map = new HashMap();
        map.put("sign", sign);
        map.put("timestamp", timestamp.toString());
        return map;
    }
  
    /**
     * 加签机器人实现,这里需要注意的是:timestamp和sign需要保持一致
     *
     * @param message 要发送的信息
     * @return
     * @throws Exception
     */
    public static String sendReboot(String message) throws Exception {
        Map<String,String> map=dingDingSec("钉钉机器人的SEC");
        String sign = map.get("sign");
        String timestamp = map.get("timestamp");
        StringBuffer stringBuffer = new StringBuffer();
        String robotUrl =stringBuffer.append(“钉钉机器人的webhook”).append("&timestamp=").append(timestamp).append("&sign=").append(sign).toString();
        return sendPost(robotUrl, message);
    }
    
    /**
     * 关键字机器人:发送消息中需要有对应的关键字才能发送成功
     * @param message 封装的消息
     * @return
     * @throws Exception
     */
    public static String sendKeyReboot(String message) throws Exception {
        return sendPost("钉钉机器人的webhook", message);
    }
}



public static void main(String[] args) {
//text类型的消息:
String text=RebootUtil.setMessage(true,"我就是我,  @1825718XXXX 是不一样的烟火",Arrays.asList(""));

//markDown类型的消息:使用于字体加粗,超链接隐藏
String markDown=RebootUtil.setMarkDown(true,"杭州天气","#### 杭州天气  \n > 9度,@1825718XXXX 西北风1级,空气良89,相对温度73%\n\n > ![screenshot](http://i01.lw.aliimg.com/media/lALPBbCc1ZhJGIvNAkzNBLA_1200_588.png)\n  > ###### 10点20分发布 [天气](http://www.thinkpage.cn/)",Arrays.asList(""));

  //钉钉机器人推送
  try {
            String message = RebootUtil.setMessage(false, "测试", Arrays.asList(""));
            RebootUtil.sendReboot(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

总结

​ 钉钉调用机器人还是比较简单的,在一些统计数据方面可以有效的集成开发。

​ 本文中的2个IDEA插件GsonFormat和Lombok还是挺方便的,详细安装方法可以查看文章

相关标签: java