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

本文介绍使用Spring Boot实现每个工作日下午六点推送指定内容至钉钉群的方法。包括在钉钉群新增自定义机器人并设置,导入钉钉开放的SDK包。需求分解为判断工作日、设置定时任务、组织销售数据文本,采用actioncard消息类型推送,最后可编写管理界面管理机器人和业务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

①找到你需要推送的群 - 智能群助手
为群新增一个自定义机器人
在这里插入图片描述
②对于你的机器人进行设置(名字啊头像啊
在这里插入图片描述

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

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

    <dependency>
        <groupId>lippi-oapi-encrpt</groupId>
        <artifactId>dingtalk</artifactId>
        <version>1.0.0</version>
    </dependency>

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibaba-dingtalk-service-sdk</artifactId>
        <version>1.0.1</version>
    </dependency>

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

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

一、 每个工作日
由于内部用自己研发的考勤系统,有自己设定的排班考勤接口
如果是按照法定工作日 可以调用 http://timor.tech/api/holiday/info/2020-10-08 这个api去获取某天是否为国家法定假日
在这里插入图片描述
他的含义如下:

参数名含义
type0:工作日 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);
    }
}

三、销售数据文本组织

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


张元英在参加produce48前刚刚小学毕业

以图片+文本的形式进行推送
查阅钉钉开发文档的话我们能知道机器人推送的格式有下面几个
图片来自于钉钉的SDK包
具体这些消息发出来的样式参考钉钉开发者文档:
钉钉机器人开发

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

  • 为什么不用markdown形式?
    答:当然可以用markdown形式,但是markdown和actioncard的展现方式不一样 为了好看我还是选择用actioncard类型
    actionCard推送
    在这里插入图片描述

然后就是做推送了


	/**
     * @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 + ("&timestamp=" + 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任务调用一下方法看看推出来的东西咯
推送内容
就酱
如果推送业务或者机器人变多的话 最好写一个管理界面去管理你的机器人关联你推送的业务

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值