【钉钉群聊机器人定时发送消息功能实现】

Java实现 钉钉群聊机器人定时发送消息功能

机器人作为一种独立的应用能力,在钉钉中扮演着重要角色。只需进行简单的设置,机器人就能够在单聊场景或群聊场景中发送消息通知,或者提供与用户的交互式服务。利用机器人,可以有效地将业务信息和任务融入钉钉的聊天环境中,从而加速工作流程和团队协作。

钉钉群聊准备工作

钉钉发起群聊

打开钉钉,发起群聊

创建项目群

打开钉钉群聊设置

打开机器人管理

选择添加机器人

选择Webhook机器人

自定义-通过Webhook接入自定义服务

添加机器人

设置机器人名字

安全设置

此处有三个选项,可以参考钉钉的说明文档,我选择的是自定义关键字

触发自定义关键字需要在推送text内容中包含有自己设置的关键词才能发送成功,完成后点击保存

保存Webhook地址(重点是token)

请求地址是固定的,https://oapi.dingtalk.com/robot/send

这里着重记录access_token,这是每个机器人唯一的

到这里钉钉群聊准备工作就完成了

项目代码实现

因为我们的功能需求是,需要每天定时将项目前一天的核心信息汇总,通过群聊机器人发送到钉钉群聊当中,所以这里主要通过两个工具来辅助实现的

1.SpringBoot框架自带的调度任务

2.钉钉(阿里)提供的sdk工具包

添加依赖

pom.xml 文件添加以下依赖项:

xml 复制代码
			<!--钉钉消息通知相关-->
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>alibaba-dingtalk-service-sdk</artifactId>
                <version>2.0.0</version>
            </dependency>

启动类添加定时任务启动扫描

需要在主应用程序类或配置类上添加 @EnableScheduling 注解以启用调度功能。

这块内容在之前的文章中有 【SpringBoot 调度任务】挺简单的

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@Slf4j
@EnableScheduling
public class BizApplication {
    public static void main(String[] args) {
        log.info("start to run...");

        SpringApplication.run(BizApplication.class, args);

        log.info("started finish");
    }
}

编写调度任务

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 订单调度器
 *
 * @author: 高克莱
 * @date: 2024/12/18
 */
@Slf4j
@Component
public class InfoScheduler {
    /**
     * 加锁等待时间(秒)
     */
    public static final long LOCK_WAIT_TIME = 0L;

    /**
     * 加锁超时时间(秒)
     */
    public static final long LOCK_LEASE_TIME = 60L;

    @Autowired
    private RedisLock redisLock;
    @Autowired
    private DingtalkClient dingtalkClient;
    
    /**
     * 每天上午9点信息汇总
     */
    @Scheduled(cron = "0 0 9 * * ?")
    public void infoSummary(){
        RLock lock = null;
        try {
            // 加锁
            lock = redisLock.getLock("Scheduler:infoSummary");
            lock.tryLock(LOCK_WAIT_TIME, LOCK_LEASE_TIME, TimeUnit.SECONDS);
            // 加锁失败
            if (!lock.isLocked()) {
                // 不处理
                return;
            }
            //根据自己的业务需求,整理好信息内容
            StringBuilder msgContent = new StringBuilder();           

            //机器人发送信息
            dingtalkClient.sendInfoSms(msgContent.toString());

        }catch (Throwable e){
            log.error("RefundScheduler infoSummaryerror", e);
        } finally {
            redisLock.releaseLock(lock);
        }
    }

}

定义接口

java 复制代码
/**
 * 钉钉群聊机器人消息通知客户端
 *
 * @author: 高克莱
 * @date: 2024/12/18
 */
public interface DingtalkClient {

    /**
     * 钉钉群聊机器人发送每日信息
     * @param msgContent
     */
    void senInfoSms(String msgContent);
}

实现接口

钉钉功能实现部分可以直接打开【钉钉开放平台】搜索 "自定义机器人发送群聊消息"

java 复制代码
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.sunrise.integration.client.DingtalkClient;
import com.taobao.api.ApiException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 钉钉群聊机器人消息通知客户端实现
 *
 * @author: 高克莱
 * @date: 2024/12/18
 */
@Component
public class DingtalkClientIpml implements DingtalkClient {

	//webhook.url 为 https://oapi.dingtalk.com/robot/send
    @Value("${dingtalk.webhook.url}")
    private String WEBHOOK_URL;

	//webhook.access_token 为 自己保存的access_token,前面步骤提过(钉钉群聊准备工作-保存Webhook地址(重点是token))
    @Value("${dingtalk.webhook.access_token}")
    private String CUSTOM_ROBOT_TOKEN;

    private DingTalkClient client;
    @Override
    public void senInfoSms(String msgContent) {
        try {
            client = new DefaultDingTalkClient(WEBHOOK_URL);
            OapiRobotSendRequest req = new OapiRobotSendRequest();

            //定义文本内容
            OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
            msgContent = "信息通知:\n" + msgContent;
            text.setContent(msgContent);

            //设置消息类型 文本消息
            req.setMsgtype("text");
            req.setText(text);

            //定义 @ 对象  群聊机器人可以@群成员
//        OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
//        at.setAtUserIds(Arrays.asList("xxxxxxx"));//at指定用户的userId,userId需要在钉钉后台管理中查询
//        at.setIsAtAll(true);//at所有人
//        req.setAt(at);

            OapiRobotSendResponse rsp = client.execute(req, CUSTOM_ROBOT_TOKEN);
        } catch (ApiException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}

调用频率限制

由于消息发送太频繁会严重影响群的使用体验,因此自定义机器人发送消息的频率限制如下:

每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟

效果:

相关推荐
考虑考虑18 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613518 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊19 小时前
Java学习第22天 - 云原生与容器化
java
渣哥21 小时前
原来 Java 里线程安全集合有这么多种
java
间彧21 小时前
Spring Boot集成Spring Security完整指南
java
间彧1 天前
Spring Secutiy基本原理及工作流程
java
Java水解1 天前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆1 天前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学1 天前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole1 天前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端