SpringBoot整合钉钉实现消息推送

前言

钉钉作为一款企业级通讯工具,具有广泛的应用场景,包括但不限于团队协作、任务提醒、工作汇报等。

通过Spring Boot应用程序整合钉钉实现消息推送,我们可以实现以下功能:

  • 实时向指定用户或群组发送消息通知。
  • 自定义消息内容和格式,满足不同业务需求。
  • 监控和提醒功能的实现,提高工作效率和沟通效果。

在接下来的部分,我们将逐步介绍如何在Spring Boot中配置和调用钉钉消息推送API,以实现消息推送功能。

钉钉群安装机器人

电脑端登录钉钉,选择一个群聊进行如下的操作:

点击群设置

群设置——>点击机器人

机器人管理——>添加机器人

添加机器人

选择自定义

点击添加

添加机器人设置

注:复制生成的签名串,后续将会用到!

复制出来的结果如下:
SEC1cc02e7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

勾选协议,点击完成即可!

接下来节将会出现如下配置:

image

注:复制Webhook地址,后续将使用该地址向钉钉群推送消息!

地址如下:

https://oapi.dingtalk.com/robot/send?access_token=89742c23bdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

到此位置,经过以上步骤,钉钉群安装机器人完成了。

添加机器人完成

集成钉钉消息推送功能

引入依赖

在项目pom.xml文件中引入依赖,当前版本1.0.3.RELEASE

        <dependency>
            <groupId>cn.snowheart</groupId>
            <artifactId>spring-boot-dingtalk-robot-starter</artifactId>
            <version>1.0.3.RELEASE</version>
        </dependency>

配置WebHook地址

在application.yml配置文件中配置钉钉机器人的WebHook地址:

dingtalk:
  robot:
    prefix: https://oapi.dingtalk.com/robot/send
    access-token: 89742c23bdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    secret:
      secret-enabled: true
      secret-token: SEC1cc02e7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

功能测试

@RestController
@RequestMapping
@Slf4j
public class DingTalkController {

    @Autowired
    private DingTalkRobotClient dingTalkRobotClient;

    /**
     * 测试发送文本消息
     */
    @GetMapping("/sendMsg")
    public void sendMessage() {
        DingTalkResponse response = dingTalkRobotClient.sendMessage(new TextMessage("公众号:小小开发者!"));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
    }

}

启动项目,访问:http://127.0.0.1:8080/sendMsg 即可发送!

消息发送

其他相关测试

普通文本通知

  /**
     * 普通文本通知
     */
    @GetMapping("/sendTextMessage")
    public void sendTextMessage() {
        DingTalkResponse response = dingTalkRobotClient.sendTextMessage(new TextMessage("业务处理异常:构建TextMessage对象发布!"));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendTextMessage("业务处理异常:构建普通字符串发布!");
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendTextMessage("业务处理异常:通知指定人!", new String[]{"17767145153"});
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendTextMessage("业务处理异常:通知群内所有人!", true);
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);
    }

访问:http://127.0.0.1:8080/sendTextMessage

普通文本通知

超链接文本

    /**
     * 超链接文本
     */
    @GetMapping("/sendLinkMessage")
    public void sendLinkMessage() {
        DingTalkResponse response = dingTalkRobotClient.sendLinkMessage(new LinkMessage("业务处理异常:AAAAAA",
                "BBBBBB",
                "CCCCCC",
                "DDDDDD"));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);
}

访问:http://127.0.0.1:8080/sendLinkMessage

超链接文本

Markdown文本推送

 private static final String markDownDemoText = "业务报警:标题" +
            "# 一级标题\n" +
            "## 二级标题\n" +
            "### 三级标题\n" +
            "#### 四级标题\n" +
            "##### 五级标题\n" +
            "###### 六级标题\n";

    /**
     * markdown文本推送
     */
    @GetMapping("/sendMarkdownMessage")
    public void sendMarkdownMessage() {
        // 构建 markdown 对象用法
        DingTalkResponse response = dingTalkRobotClient.sendMarkdownMessage(new MarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",
                markDownDemoText));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        // 不构建对象
        response = dingTalkRobotClient.sendMarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",
                markDownDemoText);
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        // 发送给指定人
        response = dingTalkRobotClient.sendMarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",
                markDownDemoText, new String[]{"19087690186"});
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);
        //发送给全体人
        response = dingTalkRobotClient.sendMarkdownMessage("业务处理异常:钉钉markdown消息支持的语法",
                markDownDemoText, true);
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);
    }

访问:http://127.0.0.1:8080/sendMarkdownMessage

markdown文本推送

ActionCard 业务推送

 /**
     * ActionCard业务推送
     */
    @GetMapping("/sendActionCardMessage")
    public void sendActionCardMessage() {
        DingTalkResponse response = dingTalkRobotClient.sendActionCardMessage(new ActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +
                "**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划"));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +
                "**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划");
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +
                        "**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
                HideAvatarType.HIDE);
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +
                        "**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
                ActionCardButton.defaultReadButton("https://www.dingtalk.com"));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendActionCardMessage("业务报警:This is title", "![screenshot](@lADOpwk3K80C0M0FoA)\n" +
                        "**Apple Store** 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
                HideAvatarType.HIDE,
                ActionCardButton.defaultReadButton("https://www.dingtalk.com"));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);
    }

访问:http://127.0.0.1:8080/sendActionCardMessage

ActionCard 业务推送

FeedCard 消息推送

    /**
     * FeedCard 消息推送
     * @throws InterruptedException
     */
    @GetMapping("/sendFeedCardMessage")
    public void sendFeedCardMessage()  {
        ArrayList<FeedCardMessageItem> items = new ArrayList<>();
        items.add(new FeedCardMessageItem("业务处理异常:成为架构师的路上,看这一篇文章就足够了,因为……",
                "http://mp.weixin.qq.com/s/CPUaB60pue0Zf3fUL9xqvw",
                "https://mmbiz.qpic.cn/mmbiz_jpg/YriaiaJPb26VMtfgPvTsM9amH5hf3pmTbf40ia6OLE845icrDb0vt4AsMnTyva5mMMpwwxnkVR5UjCEI8ADvSic1qWQ/640"));

        items.add(new FeedCardMessageItem("业务处理异常:想成为一名Web开发者?你应该学习Node.js而不是PHP",
                "http://mp.weixin.qq.com/s/x8dm9e7gwLXSEzxE6sQYow",
                "https://mmbiz.qpic.cn/mmbiz_jpg/YriaiaJPb26VND0Q0hSBOoyVkr9cXQrFjWI7hOzax1IxIibqanXYD4W8nyeYX5iaicjgiaqia7ly94iawOsGwehbKGwGsA/640"));

        DingTalkResponse  response = dingTalkRobotClient.sendFeedCardMessage(new FeedCardMessage(items));
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);

        response = dingTalkRobotClient.sendFeedCardMessage(items);
        Assert.assertEquals(response.getErrcode().longValue(), 0L);
        log.info(response.toString());
        ThreadUtil.sleep(3000);
    }

访问:http://127.0.0.1:8080/sendFeedCardMessage

FeedCard 消息推送

总结

通过本文的介绍,我们深入了解了如何使用Spring Boot应用集成钉钉实现消息的推送,实现了实时消息通知和提醒功能;在实际应用中,钉钉消息推送功能可以帮助企业提高内部沟通效率,及时传达重要信息和通知,提升团队协作和工作效率。

希望本文对您了解和应用钉钉消息推送功能有所帮助,如果你觉得本文对你有帮助,请点赞分享,让更多人受益!

源码获取

本文代码获取方式:
后台回复【消息推送】即可获取!

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现消息推送的关键是要使用 WebSocket 技术。WebSocket 是一种基于 TCP 的协议,它提供了双向通信的功能,使得服务器可以主动向客户端推送消息。 下面是使用 Spring Boot 整合 WebSocket 实现消息推送的步骤: 1. 添加依赖 在 pom.xml 文件中添加 Spring WebSocket 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建 WebSocket 配置类 创建一个 WebSocketConfig 类,注入 ServerEndpointExporter 对象,使得 Spring Boot 自动配置 WebSocket 的相关类: ```java @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } ``` 3. 创建 WebSocket 处理类 创建一个 WebSocketHandler 类,使用 @ServerEndpoint 注解标识该类为 WebSocket 处理类,并实现 onOpen、onClose、onMessage 和 onError 四个方法: ```java @ServerEndpoint("/websocket") @Component public class WebSocketHandler { private static CopyOnWriteArraySet<WebSocketHandler> webSocketSet = new CopyOnWriteArraySet<>(); private Session session; @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); } @OnClose public void onClose() { webSocketSet.remove(this); } @OnMessage public void onMessage(String message) { // 处理客户端发来的消息 } @OnError public void onError(Throwable error) { error.printStackTrace(); } } ``` 其中,@ServerEndpoint("/websocket") 注解表示 WebSocket 的访问路径。 4. 客户端连接 在客户端页面中,使用 JavaScript 创建 WebSocket 对象,并指定连接地址: ```javascript let websocket = new WebSocket("ws://localhost:8080/websocket"); ``` 5. 服务端推送消息 在 WebSocketHandler 类中,可以通过调用所有 WebSocketHandler 对象的 session 对象,向客户端推送消息: ```java webSocketSet.forEach(handler -> { try { handler.session.getBasicRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } }); ``` 6. 配置 Nginx 如果需要使用 Nginx 进行反向代理,需要在 Nginx 的配置文件中添加如下配置: ```nginx location /websocket { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } ``` 7. 在 Vue 中接收消息 在 Vue 中,可以通过监听 WebSocket 的 onmessage 事件,来接收 WebSocket 服务器推送消息: ```javascript websocket.onmessage = function(event) { let message = event.data; // 处理推送消息 }; ``` 至此,Spring Boot 和 Vue 的 WebSocket 消息推送实现了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小Java开发者

“是一种鼓励,你懂的”

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值