本文目录导读:

我来详细介绍Java实现飞书通知的几种方式,包括Webhook机器人和自定义应用两种方案。
Webhook机器人(最简单)
创建飞书机器人
在飞书群聊中添加群机器人,获取Webhook地址。
Java实现代码
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.json.JSONObject;
public class FeishuWebhookNotifier {
private static final String WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/your-webhook-url";
/**
* 发送文本消息
*/
public static void sendTextMessage(String content) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(WEBHOOK_URL);
// 构建消息体
JSONObject message = new JSONObject();
message.put("msg_type", "text");
JSONObject contentJson = new JSONObject();
contentJson.put("text", content);
message.put("content", contentJson);
// 设置请求实体
StringEntity entity = new StringEntity(message.toString(), "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
// 发送请求
httpClient.execute(httpPost);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送富文本消息
*/
public static void sendRichTextMessage(String title, String content) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(WEBHOOK_URL);
JSONObject message = new JSONObject();
message.put("msg_type", "post");
JSONObject contentJson = new JSONObject();
contentJson.put("zh_cn", new JSONObject()
.put("title", title)
.put("content", new Object[][]{
{new JSONObject().put("tag", "text").put("text", content)}
})
);
message.put("content", contentJson);
StringEntity entity = new StringEntity(message.toString(), "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpClient.execute(httpPost);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送Markdown消息
*/
public static void sendMarkdownMessage(String content) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(WEBHOOK_URL);
JSONObject message = new JSONObject();
message.put("msg_type", "interactive");
JSONObject card = new JSONObject();
JSONObject header = new JSONObject()
.put("title", new JSONObject()
.put("tag", "plain_text")
.put("content", "通知消息"));
card.put("header", header);
JSONObject element = new JSONObject()
.put("tag", "markdown")
.put("content", content);
card.put("elements", new Object[]{element});
message.put("card", card);
StringEntity entity = new StringEntity(message.toString(), "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpClient.execute(httpPost);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
// 发送文本消息
FeishuWebhookNotifier.sendTextMessage("Hello, 飞书! \n这是测试消息");
// 发送Markdown消息
String markdownContent = "## 系统告警\n" +
"**服务器**: 127.0.0.1\n" +
"**CPU使用率**: 95%\n" +
"**时间**: 2024-01-01 12:00:00";
FeishuWebhookNotifier.sendMarkdownMessage(markdownContent);
}
}
自定义应用(功能更强大)
创建飞书应用
- 前往 飞书开放平台
- 创建应用,获取 App ID 和 App Secret
Maven依赖
<dependency>
<groupId>com.larksuite.oapi</groupId>
<artifactId>oapi-sdk</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.25</version>
</dependency>
完整实现代码
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class FeishuAppNotifier {
private static final String APP_ID = "your-app-id";
private static final String APP_SECRET = "your-app-secret";
private static final String TENANT_ACCESS_TOKEN_URL = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";
/**
* 获取 tenant_access_token
*/
private static String getTenantAccessToken() throws Exception {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(TENANT_ACCESS_TOKEN_URL);
JSONObject requestBody = new JSONObject();
requestBody.put("app_id", APP_ID);
requestBody.put("app_secret", APP_SECRET);
StringEntity entity = new StringEntity(requestBody.toString(), "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
StringBuilder response = new StringBuilder();
httpClient.execute(httpPost, httpResponse -> {
BufferedReader reader = new BufferedReader(
new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return null;
});
JSONObject jsonResponse = JSONObject.parseObject(response.toString());
return jsonResponse.getString("tenant_access_token");
}
}
/**
* 发送消息给用户
*/
public static void sendMessageToUser(String userId, String content) throws Exception {
String token = getTenantAccessToken();
String url = "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id";
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Authorization", "Bearer " + token);
httpPost.setHeader("Content-Type", "application/json; charset=utf-8");
JSONObject message = new JSONObject();
message.put("receive_id", userId);
message.put("msg_type", "text");
message.put("content", new JSONObject().fluentPut("text", content).toString());
StringEntity entity = new StringEntity(message.toString(), "UTF-8");
httpPost.setEntity(entity);
httpClient.execute(httpPost);
}
}
/**
* 发送消息到群聊
*/
public static void sendMessageToGroup(String chatId, String content) throws Exception {
String token = getTenantAccessToken();
String url = "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id";
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Authorization", "Bearer " + token);
httpPost.setHeader("Content-Type", "application/json; charset=utf-8");
JSONObject message = new JSONObject();
message.put("receive_id", chatId);
message.put("msg_type", "interactive");
// 构建消息卡片
JSONObject card = new JSONObject();
JSONObject header = new JSONObject()
.fluentPut("title", new JSONObject()
.fluentPut("tag", "plain_text")
.fluentPut("content", "系统通知"));
card.put("header", header);
JSONObject element = new JSONObject()
.fluentPut("tag", "markdown")
.fluentPut("content", content);
card.put("elements", new Object[]{element});
message.put("content", card.toString());
StringEntity entity = new StringEntity(message.toString(), "UTF-8");
httpPost.setEntity(entity);
httpClient.execute(httpPost);
}
}
}
Spring Boot集成(推荐)
创建配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "feishu")
public class FeishuConfig {
private String webhookUrl;
private String appId;
private String appSecret;
// getters and setters
}
application.yml配置
feishu: webhook-url: https://open.feishu.cn/open-apis/bot/v2/hook/your-webhook-url app-id: your-app-id app-secret: your-app-secret
创建Service类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class FeishuNotificationService {
private static final Logger log = LoggerFactory.getLogger(FeishuNotificationService.class);
@Autowired
private FeishuConfig feishuConfig;
@Autowired
private RestTemplate restTemplate;
public void sendNotification(String message, String messageType) {
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
JSONObject requestBody = new JSONObject();
requestBody.put("msg_type", messageType);
JSONObject content = new JSONObject();
content.put("text", message);
requestBody.put("content", content);
HttpEntity<String> request = new HttpEntity<>(requestBody.toString(), headers);
ResponseEntity<String> response = restTemplate.postForEntity(
feishuConfig.getWebhookUrl(),
request,
String.class
);
if (response.getStatusCode() == HttpStatus.OK) {
log.info("飞书通知发送成功");
}
} catch (Exception e) {
log.error("飞书通知发送失败", e);
}
}
}
使用示例
@RestController
@RequestMapping("/api/notification")
public class NotificationController {
@Autowired
private FeishuNotificationService feishuService;
@PostMapping("/send")
public String send(@RequestBody NotificationRequest request) {
// 简单文本消息
feishuService.sendNotification("服务器告警:CPU使用率超过90%", "text");
// Markdown格式
String markdown = "**服务器状态**\n" +
"- IP: 192.168.1.1\n" +
"- CPU: 95%\n" +
"- 内存: 80%";
feishuService.sendNotification(markdown, "interactive");
return "success";
}
}
使用OKHttp(高效)
import okhttp3.*;
public class FeishuOkHttpNotifier {
private static final OkHttpClient client = new OkHttpClient();
private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
public static void sendMessage(String webhookUrl, String content) {
try {
JSONObject json = new JSONObject();
json.put("msg_type", "text");
json.put("content", new JSONObject().fluentPut("text", content));
RequestBody body = RequestBody.create(json.toString(), JSON);
Request request = new Request.Builder()
.url(webhookUrl)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.err.println("发送失败: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println("发送成功: " + response.body().string());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
消息类型说明
| 消息类型 | 说明 | 适用场景 |
|---|---|---|
| text | 纯文本消息 | 简单通知 |
| post | 富文本消息 | 结构化信息 |
| interactive | 消息卡片 | 复杂交互通知 |
| image | 图片消息 | 图表展示 |
| share_chat | 分享群聊 | 群聊推荐 |
最佳实践建议
- 异步发送:使用线程池或MQ异步发送通知
- 错误重试:实现重试机制
- 限流控制:飞书API有频率限制
- 消息模板:预定义消息模板
- 日志记录:记录发送状态
选择合适的方案,根据你的具体需求实现飞书通知功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播