当前位置: 首页 > article >正文

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

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

  • 钉钉群聊准备工作
    • 钉钉发起群聊
    • 创建项目群
    • 打开钉钉群聊设置
    • 打开机器人管理
    • 选择Webhook机器人
    • 添加机器人
    • 安全设置
    • 保存Webhook地址(重点是token)
  • 项目代码实现
    • 添加依赖
    • 启动类添加定时任务启动扫描
    • 编写调度任务
    • 定义接口
    • 实现接口

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

钉钉群聊准备工作

钉钉发起群聊

打开钉钉,发起群聊
请添加图片描述

创建项目群

请添加图片描述

打开钉钉群聊设置

请添加图片描述

打开机器人管理

选择添加机器人
请添加图片描述

选择Webhook机器人

自定义-通过Webhook接入自定义服务请添加图片描述

添加机器人

设置机器人名字
请添加图片描述

安全设置

此处有三个选项,可以参考钉钉的说明文档,我选择的是自定义关键字
触发自定义关键字需要在推送text内容中包含有自己设置的关键词才能发送成功,完成后点击保存
请添加图片描述

保存Webhook地址(重点是token)

请求地址是固定的,https://oapi.dingtalk.com/robot/send
这里着重记录access_token,这是每个机器人唯一的
请添加图片描述
到这里钉钉群聊准备工作就完成了

项目代码实现

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

1.SpringBoot框架自带的调度任务
2.钉钉(阿里)提供的sdk工具包

添加依赖

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

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

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

需要在主应用程序类或配置类上添加 @EnableScheduling 注解以启用调度功能。
这块内容在之前的文章中有 【SpringBoot 调度任务】挺简单的

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");
    }
}

编写调度任务

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);
        }
    }

}

定义接口

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

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

实现接口

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

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分钟

效果:
请添加图片描述


http://www.kler.cn/a/448290.html

相关文章:

  • 文件操作(File类)
  • vue2 - Day03 - (生命周期、组件、组件通信)
  • FastAPI vs Go 性能对比分析
  • flask flask-socketio创建一个网页聊天应用
  • 网络安全防范
  • 【AI知识】为什么激活值过大/过小,初始权重过大/过小,可能导致梯度爆炸/消失?具体例子举例
  • C++ 哈希表封装unordered_map 和 unordered_set
  • 浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换
  • FLV视频封装格式详解
  • SSM 驱动的 JAVA 网络直播带货查询系统设计及 JSP 成功实现解析
  • 如何确保Java爬虫不超出API使用限制:策略示例
  • Vue 环境变量配置、使用方法、注意事项
  • HTML综合案例
  • C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
  • pro文件转换为CMakeLists.txt文件,QT官方工具使用教程
  • vue+springboot+cas配置及cookie传递问题
  • 现代密码学总结(下篇)
  • Golang中的Map是怎么遍历的
  • 面试题整理9----谈谈对k8s的理解1
  • Rocky Linux 9安装RabbitMQ
  • 设计模式之结构型
  • 【ArcGIS Pro微课1000例】0064:栅格目录、栅格数据集、镶嵌数据集
  • 怎样在html中异步加载js文件,以避免js文件太大而影响页面打开速度?
  • 【Tomcat运行startup.bat闪退】
  • Connecting to Oracle 11g Database in Python
  • 1.gitlab 服务器搭建流程