【SpringBoot】✈️整合飞书群机器人发送消息

💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥

🏆本篇文章阅读大约耗时3分钟。

⛳️motto:不积跬步、无以千里

📋📋📋本文目录如下:🎁🎁🎁

目录

前言

账号创建

代码实现

1、添加配置

2、测试接口

安全校验

章末

前言

小伙伴们大家好,上篇文章是简单实现了常见的图形验证码的使用,文章链接如下:

【验证码】⭐️集成图形验证码实现安全校验-CSDN博客

这篇文章来看下,如何整合飞书的群机器人发送自定义消息,一切从简(摆烂 bushi )

账号创建

本地是在电脑端,点击左上角的加号,选择创建群组,之后在对应群组页面的右上角打开设置,点击群机器人,添加机器人,选择下面这一个即可

点击创建机器人后可以获取到对应的 webhook 地址

代码实现

1、添加配置

将 webhook 加到配置文件中,然后用配置类来读取,将配置类交由 spring 管理

XML 复制代码
ext:
  larkBotConfig:
    webhookUrl: https://open.feishu.cn/open-apis/bot/v2/hook/3e2c19d1-8fdd-4b56-b147-b613e90064a5
java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 *
 * @author benbenhuang
 * @date 2025/5/18 21:13
 */
@Configuration
@ConfigurationProperties(prefix = "ext")
@Data
public class ExtProperties {
    private final LarkBotConfig larkBotConfig = new LarkBotConfig();

    @Data
    public static class LarkBotConfig{
        private String webhookUrl;
    }
}
2、测试接口

将需要发送的消息,传递给接口,测试下 效果如下:

java 复制代码
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * @author benbenhuang
 * @date 2025年05月18日 19:28
 */
@RequestMapping("/testLark")
@RestController
@Slf4j
public class LarkController {

    @Autowired
    private ExtProperties extProperties;
    @PostMapping("/send")
    public void sendLark(@RequestParam("notice") String notice){
        send(notice);
    }

    private void send(String notice){
        try {
            Map<String,Object> header=new HashMap();
            Map<String,Object> text=new HashMap();
            text.put("text",  notice);
            header.put("msg_type", "text");
            header.put("content", text);
            //发送post请求
            String result = HttpRequest.post(extProperties.getLarkBotConfig().getWebhookUrl()).body(JSON.toJSONString(header), "application/json;charset=UTF-8").execute().body();

            log.info("lark resp:{}", result);
        } catch (Exception e) {
            log.error("lark发送消息异常", e);
        }
    }

    
}

安全校验

1、上面的方式是没有加权限校验的实现,也就是说只要获取到 webhook 链接,谁都可以向这个群里发送消息,针对此情况可以开启群机器人的 权限校验,从这里开启,获取到秘钥之后,点击保存即可

2、调整配置

加入秘钥配置:

3、测试接口

安全校验具体到代码层面就是,请求参数中根据官方文档中要求的时间戳和加密后的sign值

自定义机器人使用指南 - 开发指南 - 飞书开放平台

java 复制代码
@RequestMapping("/teatLark")
@RestController
@Slf4j
public class LarkController {

    @Autowired
    private ExtProperties extProperties;

    @PostMapping("/sendWithToken")
    public void sendLarkWithToken(@RequestParam("notice") String notice){
        sendWithSignature(notice);
    }

    private void sendWithSignature(String notice) {
            String secret = extProperties.getLarkBotConfig().getSecret(); // 从 Lark 后台获取
            String timestamp = String.valueOf(System.currentTimeMillis() / 1000); // 当前时间戳,单位秒
            String sign = calculateSignature(timestamp, secret);
        try {
                Map<String,Object> json=new HashMap();
                Map<String,Object> text=new HashMap();
                text.put("text",  notice);
                json.put("msg_type", "text");
                json.put("content", text);
                json.put("timestamp", timestamp);
                json.put("sign", sign);
                //发送post请求
                String result = HttpRequest.post(extProperties.getLarkBotConfig().getWebhookUrl()).body(JSON.toJSONString(json), "application/json;charset=UTF-8").execute().body();

                log.info("lark resp:{}", result);
            } catch (Exception e) {
                log.error("lark发送消息异常", e);
            }
    }


    private static String calculateSignature(String timestamp, String secret) {
        try {
            //把timestamp+"\n"+密钥当做签名字符串
            String stringToSign = timestamp + "\n" + secret;
            //使用HmacSHA256算法计算签名
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            byte[] signData = mac.doFinal(new byte[]{});
            return new String(Base64.getEncoder().encodeToString(signData));
        } catch (Exception e) {
            throw new RuntimeException("sign 计算异常");
        }
    }

}

章末

文章到这里就结束了~

往期推荐 > > >

【服务器搭建】✈️用自己电脑搭建一个服务器!

【IDEA】✈️自定义模板,自动生成类和方法注释

【日志链路】⭐️SpringBoot 整合 TraceId 日志链路追踪!

相关推荐
vx-Biye_Design1 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
前端精髓8 小时前
NestJS 是什么(对着 Spring Boot 一起学习)
spring boot·后端·学习
武哥聊编程10 小时前
【AI实战项目】基于SpringAI+Springboot+Vue的AI面试刷题训练平台
vue.js·人工智能·spring boot·springai
vipxieliang11 小时前
固定电话验证详解:区号、号码、分机号的完整验证
java·spring boot
步行cgn11 小时前
Spring Boot 主入口类上的 @Enable 和 @Scan 注解详解
java·spring boot·后端
xixingzhe211 小时前
SpringBoot DDD 实战入门文档
spring boot·spring·ddd
杨运交13 小时前
[069][公共模块]Spring Boot 全局异常处理与参数校验实战(下):校验异常精细化处理与 WebFlux 适配
java·spring boot·后端
行者-全栈开发14 小时前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
Andya_net14 小时前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python
小荷才露尖尖角,早有蜻蜓立上头15 小时前
class java.util.LinkedHashMap cannot be cast to xxx
java·spring boot