简单易懂!java实现钉钉机器人消息推送

需求:
实现每个工作日的下午六点推送指定内容至钉钉群

①找到你需要推送的群 - 智能群助手
为群新增一个自定义机器人
简单易懂!java实现钉钉机器人消息推送_第1张图片
②对于你的机器人进行设置(名字啊头像啊
简单易懂!java实现钉钉机器人消息推送_第2张图片

  • 安全设置我一般勾【加签】也可以勾选自定义关键册或者ip限制 最后都是在转发到钉钉API接口的时候做校验用的 为了安全 dddd

给你的项目导入钉钉开放的SDK包
Pom文件如下:

    
        lippi-oapi-encrpt
        dingtalk
        1.0.0
    

    
        com.aliyun
        alibaba-dingtalk-service-sdk
        1.0.1
    

现在可以正式开始开发了
需求分解:

  • 每个工作日
  • 每天下午六点
  • 数据文本
  • 发送钉钉群

一、 每个工作日
由于内部用自己研发的考勤系统,有自己设定的排班考勤接口
如果是按照法定工作日 可以调用 http://timor.tech/api/holiday/info/2020-10-08 这个api去获取某天是否为国家法定假日
简单易懂!java实现钉钉机器人消息推送_第3张图片
他的含义如下:

参数名 含义
type 0:工作日 1:周末 2:假日
name 本日的名称如果部署法定假日则会显示周几
week 周一为1以此类推
holiday 假日专有 普通日期为null

现在就算是能知道今天是否是工作日了
如果是工作日就进行接下来的操作

二、每天下午六点
可以当作这个推送数据是定时生成的
使用SpringBoot基于注解来创建定时任务。 代码如下:

@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class DingTalkSchedule {
     
  
      /**
     * 工作日下午6点推送数据
     */
    @Scheduled(cron = "0 0 18 * * ? ")
    @Async
    public void pushData() {
     
   		 //今天是否是工作日
        if (!isWorkDay(DateUtils.getDate(new Date(), "yyyy-MM-dd"))) {
     
            return;
        }
        //推送相关 数据来源你的机器人设置(仅设置安全密钥
        String webhook = "";
        String sercetKey= "";
    	messagePush(webhook,sercetKey);
    }
}

三、销售数据文本组织

假设我们今天要推送的数据大致如下:

简单易懂!java实现钉钉机器人消息推送_第4张图片
张元英在参加produce48前刚刚小学毕业

以图片+文本的形式进行推送
查阅钉钉开发文档的话我们能知道机器人推送的格式有下面几个
简单易懂!java实现钉钉机器人消息推送_第5张图片
具体这些消息发出来的样式参考钉钉开发者文档:
钉钉机器人开发

需求所需推送的是图片+文本的形式
我们这里就采用【actioncard】的消息类型

  • 为什么不用markdown形式?
    答:当然可以用markdown形式,但是markdown和actioncard的展现方式不一样 为了好看我还是选择用actioncard类型
    简单易懂!java实现钉钉机器人消息推送_第6张图片
    简单易懂!java实现钉钉机器人消息推送_第7张图片

然后就是做推送了


	/**
     * @Description: 推送iz*one 冷知识消息
     * @Param: [webhook,sercetKey] 创建机器人的时候生成的机器人webhook和密钥如果是别的安全设置则参考别的方式
     * @return: void
     * @Author: Nipppppp
     * @Date: 2021/2/26 14:13
     */
public void messagePush(String webhook,String sercetKey){
     
		 //文本内容组织
		 StringBuilder text = new StringBuilder();
		 //图片
		 text.append("![screenshot](https://img-blog.csdnimg.cn/20210226132655473.png"));
		 //换行
		 text.append("\n");
		 //文本
		 text.append("#### 张元英在参加produce48前刚刚小学毕业");
      	 //钉钉actionCard推送对象
         OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
         //推送透出首页标题 (你收到这条推送的时候会显示的初内容
         actionCard.setTitle("IZ*ONE 冷知识");
         //放入你组织好的内容
         actionCard.setText(text.toString());
		//做推送
		OapiRobotSendResponse resp = robotPushActionCardMessage(webhook,sercetKey,actionCard);
		//TODO 有需要的话可以保存一下发送的历史记录啥的
}


	/**
     * @Description: 推送actionCard消息模版
     * @Param: [webhook,sercetKey,actionCard]
     * @return: void
     * @Author: Nipppppp
     * @Date: 2021/2/26 14:15
     */
    public OapiRobotSendResponse robotPushActionCardMessage(String webhook,String sercetKey, OapiRobotSendRequest.Actioncard actionCard) {
     
        try {
     
            DingTalkClient client = getDingTalkClient(webhook, sercetKey);
            OapiRobotSendRequest request = new OapiRobotSendRequest();
            request.setMsgtype("actionCard");
            request.setActionCard(actionCard);
            OapiRobotSendResponse response = client.execute(request);
            if (!ObjectUtils.isEmpty(response) && response.isSuccess()) {
     
                log.info("钉钉机器人推送actionCard成功:{}", actionCard.getText());
            } else {
     
                log.error("钉钉机器人推送actionCard失败:{},{}", actionCard.getText(), response.getErrmsg());
            }
            return response;
        } catch (NoSuchAlgorithmException e) {
     
            log.error("=======钉钉机器人推送actionCard异常:{}======", e.getMessage());
        } catch (UnsupportedEncodingException e) {
     
            log.error("=======钉钉机器人推送actionCard异常:{}========", e.getMessage());
        } catch (InvalidKeyException e) {
     
            log.error("=======钉钉机器人推送actionCard异常:{}=======", e.getMessage());
        } catch (ApiException e) {
     
            log.error("=======钉钉机器人推送actionCard异常:{}=====", e.getErrMsg());
        }
        return null;
    }
     /**
     * 获取钉钉对象 机器人仅设置密钥
     *
     * @param webHook   机器人webHook
     * @param secretKey 机器人密钥
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws UnsupportedEncodingException
     */
    private DingTalkClient getDingTalkClient(String webHook, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
     
        Map<String, String> sign = sign(secretKey);
       
        String aceRobotUrl = webHook + ("×tamp=" + sign.get("timestamp") + "&sign=" + sign.get("sign"));
        DingTalkClient client = new DefaultDingTalkClient(aceRobotUrl);
        return client;
    }
 /**
     * 计算签名
     *
     * @return
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException
     * @throws InvalidKeyException
     */
    public static Map<String, String> sign(String robotSecret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
     
        Long timestamp = System.currentTimeMillis();
        //机器人加签密钥
        String stringToSign = timestamp + "\n" + robotSecret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(robotSecret.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<>(2);
        map.put("timestamp", timestamp.toString());
        map.put("sign", sign);
        return map;
    }

actionCard里面填装你自己的内容即可

最后就是编写测试方法或者自启动springboot任务调用一下方法看看推出来的东西咯
简单易懂!java实现钉钉机器人消息推送_第8张图片
就酱
如果推送业务或者机器人变多的话 最好写一个管理界面去管理你的机器人关联你推送的业务

你可能感兴趣的:(java,spring,boot)