【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 日志链路追踪!

相关推荐
qq_124987075331 分钟前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_36 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732061 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu4 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶4 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip5 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide6 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf6 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva7 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
橙露7 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot