接口名称
消息管理API -(IFeishuTenantV1Message)
功能描述
飞书消息管理接口,用于对飞书聊天中的消息进行发送、回复、编辑、撤回、转发以及查询等操作。支持文本、富文本、卡片、图片、视频、音频、文件、表情包等多种消息类型,以及文件上传下载、消息加急、表情回复等丰富的功能。当前接口使用租户令牌访问,适用于租户应用场景,提供完整的消息管理能力。
参考文档
函数列表
| 函数名称 | 功能描述 | 认证方式 | HTTP 方法 |
|---|---|---|---|
| SendMessageAsync | 发送消息到指定用户或群聊 | 租户令牌 | POST |
| ReplyMessageAsync | 回复指定消息 | 租户令牌 | POST |
| EditMessageAsync | 编辑已发送的消息内容 | 租户令牌 | PUT |
| ReceiveMessageAsync | 转发指定消息 | 租户令牌 | POST |
| MergeReceiveMessageAsync | 合并转发多条消息 | 租户令牌 | POST |
| ReceiveThreadsAsync | 转发话题 | 租户令牌 | POST |
| CreateMessageFollowUpAsync | 创建消息跟随气泡 | 租户令牌 | POST |
| GetMessageReadUsesAsync | 查询消息已读用户 | 租户令牌 | GET |
| GetHistoryMessageAsync | 获取历史消息 | 租户令牌 | GET |
| GetMessageFile | 获取消息资源文件(小文件) | 租户令牌 | GET |
| GetMessageLargeFile | 获取消息资源文件(大文件) | 租户令牌 | GET |
| GetContentListByMessageIdAsync | 查询指定消息内容 | 租户令牌 | GET |
| DownFileAsync | 下载文件(小文件) | 租户令牌 | GET |
| DownLargeFileAsync | 下载文件(大文件) | 租户令牌 | GET |
| DownImageAsync | 下载图片(小文件) | 租户令牌 | GET |
| DownLargeImageAsync | 下载图片(大文件) | 租户令牌 | GET |
| UploadFileAsync | 上传文件 | 租户令牌 | POST |
| UploadImageAsync | 上传图片 | 租户令牌 | POST |
| MessageUrgentAppAsync | 消息加急通知(应用内) | 租户令牌 | PATCH |
| MessageUrgentSMSAsync | 消息加急通知(短信) | 租户令牌 | PATCH |
| MessageUrgentPhoneAsync | 消息加急通知(电话) | 租户令牌 | PATCH |
| RevokeMessageAsync | 撤回指定消息 | 租户令牌 | DELETE |
| AddMessageReactionsAsync | 添加消息表情回复 | 租户令牌 | POST |
| GetMessageReactionsPageListAsync | 获取消息表情回复列表 | 租户令牌 | GET |
| DeleteMessageReactionsAsync | 删除消息表情回复 | 租户令牌 | DELETE |
函数详细内容
函数名称:发送消息
函数签名:
csharp
Task<FeishuApiResult<MessageDataResult>?> SendMessageAsync(
[Body] SendMessageRequest sendMessageRequest,
[Query("receive_id_type")] string receive_id_type = Consts.User_Id_Type,
CancellationToken cancellationToken = default);认证:租户令牌
参数:
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| sendMessageRequest | SendMessageRequest | ✅ 必填 | 发送消息请求体 | 见下方结构 |
| sendMessageRequest.ReceiveId | string | ✅ 必填 | 消息接收者的ID | "ou_7d8a6e6df7621556ce0d21922b676706ccs" |
| sendMessageRequest.MsgType | string | ✅ 必填 | 消息类型 | "text" |
| sendMessageRequest.Content | string | ✅ 必填 | 消息内容JSON字符串 | "{"text":"Hello World"}" |
| sendMessageRequest.Uuid | string | ⚪ 可选 | 请求去重的唯一标识 | "unique-request-id" |
| receive_id_type | string | ⚪ 可选 | 用户ID类型,默认值:open_id | "open_id" |
| cancellationToken | CancellationToken | ⚪ 可选 | 取消操作令牌 | - |
响应:
成功响应示例:
json
{
"code": 0,
"msg": "success",
"data": {
"message_id": "om_dc13264520392913993dd051dba21dcf",
"thread_id": "thread_123456",
"mentions": [
{
"user_id": "ou_7d8a6e6df7621556ce0d21922b676706ccs",
"name": "张三"
}
]
}
}常见错误响应:
json
{
"code": 400,
"msg": "消息内容格式错误"
}json
{
"code": 403,
"msg": "无权限发送消息到该会话"
}说明:
- 支持发送文本、富文本、图片、文件、音频、视频、表情包、卡片等多种类型
- uuid参数用于1小时内的请求去重
- 消息内容需要根据msg_type对应不同的JSON结构
代码示例:
javascript
// 发送富文本消息并@相关人员
async function sendRichTextMessage() {
const messageRequest = {
receive_id: "ou_7d8a6e6df7621556ce0d21922b676706ccs", // 接收者ID
msg_type: "post", // 富文本类型
content: JSON.stringify({
post: {
zh_cn: {
title: "项目进度更新",
content: [
[{
tag: "text",
text: "亲爱的团队成员,"
}, {
tag: "at",
user_id: "ou_7d8a6e6df7621556ce0d21922b676706ccs",
user_name: "张三"
}, {
tag: "text",
text: " 项目本周进展如下:"
}]
]
}
}
}),
uuid: generateUniqueId() // 防重复发送
};
try {
const response = await feishuTenantV1Message.sendMessageAsync(messageRequest);
if (response.code === 0) {
console.log('消息发送成功:', response.data.message_id);
// 记录消息发送日志
await logMessageSending(response.data.message_id, 'rich_text');
// 设置消息提醒
await setMessageReminder(response.data.message_id);
} else {
console.error('消息发送失败:', response.msg);
// 处理发送失败
await handleMessageSendingError(response.code, response.msg);
}
} catch (error) {
console.error('发送消息时发生错误:', error);
showMessageNotification('消息发送失败,请检查网络连接');
}
}
// 生成唯一ID
function generateUniqueId() {
return `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
// 记录消息发送日志
async function logMessageSending(messageId, messageType) {
console.log(`消息发送记录: ${messageId}, 类型: ${messageType}, 时间: ${new Date().toISOString()}`);
}
// 设置消息提醒
async function setMessageReminder(messageId) {
// 可以设置定时提醒相关人员查看消息
console.log(`已为消息 ${messageId} 设置提醒`);
}
// 处理消息发送错误
async function handleMessageSendingError(errorCode, errorMessage) {
switch (errorCode) {
case 403:
showUserFriendlyError('您没有权限向该用户发送消息');
break;
case 400:
showUserFriendlyError('消息格式不正确,请检查消息内容');
break;
default:
showUserFriendlyError(`发送失败: ${errorMessage}`);
}
}函数名称:回复消息
函数签名:
csharp
Task<FeishuApiResult<MessageDataResult>?> ReplyMessageAsync(
[Path] string message_id,
[Body] ReplyMessageRequest replyMessageRequest,
CancellationToken cancellationToken = default);认证:租户令牌
参数:
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| message_id | string | ✅ 必填 | 待回复的消息ID | "om_dc13264520392913993dd051dba21dcf" |
| replyMessageRequest | ReplyMessageRequest | ✅ 必填 | 回复消息请求体 | 见下方结构 |
| replyMessageRequest.MsgType | string | ✅ 必填 | 消息类型 | "text" |
| replyMessageRequest.Content | string | ✅ 必填 | 消息内容JSON字符串 | "{"text":"收到,我会处理"}" |
| replyMessageRequest.Uuid | string | ⚪ 可选 | 请求去重的唯一标识 | "unique-reply-id" |
| cancellationToken | CancellationToken | ⚪ 可选 | 取消操作令牌 | - |
响应:
成功响应示例:
json
{
"code": 0,
"msg": "success",
"data": {
"message_id": "om_reply_123456789",
"thread_id": "thread_123456",
"upper_message_id": "om_dc13264520392913993dd051dba21dcf"
}
}常见错误响应:
json
{
"code": 404,
"msg": "原消息不存在"
}json
{
"code": 403,
"msg": "无权限回复该消息"
}说明:
- 回复的内容支持文本、富文本、卡片、图片等多种类型
- 回复消息会自动关联到原消息形成线程
- 适用于对用户咨询进行回复或群内讨论
代码示例:
javascript
// 智能回复用户咨询消息
async function smartReplyToUser(messageId, userInput) {
try {
// 分析用户意图
const intent = await analyzeUserIntent(userInput);
// 生成智能回复内容
const replyContent = await generateSmartReply(intent, userInput);
const replyRequest = {
msg_type: "post", // 使用富文本回复
content: JSON.stringify({
post: {
zh_cn: {
content: [
[{
tag: "text",
text: replyContent.text
}],
// 如果有相关文档链接
...(replyContent.links ? [{
tag: "a",
text: "查看相关文档",
href: replyContent.links[0]
}] : [])
]
}
}
}),
uuid: generateUniqueId()
};
const response = await feishuTenantV1Message.replyMessageAsync(
messageId,
replyRequest
);
if (response.code === 0) {
console.log('智能回复发送成功:', response.data.message_id);
// 记录回复内容用于训练模型
await recordReplyForTraining(messageId, userInput, replyContent);
// 标记消息已处理
await markMessageAsProcessed(messageId);
} else {
console.error('智能回复失败:', response.msg);
// 降级为模板回复
await sendTemplateReply(messageId, intent);
}
} catch (error) {
console.error('发送回复时发生错误:', error);
// 发送错误提示回复
await sendErrorReply(messageId);
}
}
// 分析用户意图
async function analyzeUserIntent(userInput) {
// 这里可以集成NLP服务分析用户意图
const keywords = {
'技术问题': 'technical',
'账号问题': 'account',
'功能使用': 'usage',
'投诉建议': 'feedback'
};
for (const [keyword, intent] of Object.entries(keywords)) {
if (userInput.includes(keyword)) {
return intent;
}
}
return 'general';
}
// 生成智能回复
async function generateSmartReply(intent, userInput) {
const replyTemplates = {
technical: {
text: "我了解您遇到的技术问题,请提供详细的错误信息和操作步骤,我会尽快为您排查。",
links: ["https://help.company.com/technical"]
},
account: {
text: "关于账号问题,请确认您的登录信息是否正确,如需要重置密码请点击:",
links: ["https://help.company.com/account"]
},
usage: {
text: "关于功能使用,您可以查看我们的使用指南,如有具体问题请详细描述。",
links: ["https://help.company.com/usage"]
},
feedback: {
text: "感谢您的反馈!我们已经记录您的建议,会尽快评估并改进。",
links: []
},
general: {
text: "感谢您的咨询,我会尽快为您处理。如需更详细的帮助,请描述具体需求。",
links: []
}
};
return replyTemplates[intent] || replyTemplates.general;
}
// 记录回复用于训练
async function recordReplyForTraining(messageId, userInput, replyContent) {
console.log('记录回复训练数据:', {
messageId,
userInput,
reply: replyContent,
timestamp: new Date().toISOString()
});
}
// 发送模板回复
async function sendTemplateReply(messageId, intent) {
const templateReply = {
text: "感谢您的咨询,我们已收到您的消息,会在24小时内回复您。",
links: []
};
const replyRequest = {
msg_type: "text",
content: JSON.stringify({
text: templateReply.text
})
};
await feishuTenantV1Message.replyMessageAsync(messageId, replyRequest);
}
// 发送错误提示回复
async function sendErrorReply(messageId) {
const errorReply = {
msg_type: "text",
content: JSON.stringify({
text: "抱歉,系统暂时无法回复您的消息,请稍后重试或联系人工客服。"
})
};
await feishuTenantV1Message.replyMessageAsync(messageId, errorReply);
}函数名称:撤回消息
函数签名:
csharp
Task<FeishuNullDataApiResult?> RevokeMessageAsync(
[Path] string message_id,
CancellationToken cancellationToken = default);认证:租户令牌
参数:
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| message_id | string | ✅ 必填 | 待撤回的消息ID | "om_dc13264520392913993dd051dba21dcf" |
| cancellationToken | CancellationToken | ⚪ 可选 | 取消操作令牌 | - |
响应:
成功响应示例:
json
{
"code": 0,
"msg": "success"
}常见错误响应:
json
{
"code": 404,
"msg": "消息不存在"
}json
{
"code": 403,
"msg": "无权限撤回该消息"
}json
{
"code": 400,
"msg": "消息发送超过2分钟,无法撤回"
}说明:
- 机器人可以撤回自己发送的消息
- 群聊的群主可以撤回群内指定的消息
- 消息撤回有时间限制(通常为2分钟)
代码示例:
javascript
// 智能消息撤回系统
async function intelligentMessageRevocation() {
try {
// 获取最近发送的敏感消息
const recentMessages = await getRecentSensitiveMessages();
for (const message of recentMessages) {
// 检查是否需要撤回
const shouldRevoke = await shouldRevokeMessage(message);
if (shouldRevoke) {
await revokeMessageWithLogging(message.message_id, message.reason);
}
}
} catch (error) {
console.error('智能撤回系统错误:', error);
}
}
// 获取最近的敏感消息
async function getRecentSensitiveMessages() {
// 模拟获取最近10分钟内可能需要撤回的消息
return [
{
message_id: "om_sensitive_123",
content: "包含敏感信息的消息",
timestamp: Date.now() - 60000, // 1分钟前
reason: "敏感内容检测"
},
{
message_id: "om_error_456",
content: "发送错误的消息",
timestamp: Date.now() - 30000, // 30秒前
reason: "消息内容错误"
}
];
}
// 判断是否应该撤回消息
async function shouldRevokeMessage(message) {
// 检查消息发送时间(撤回时间限制)
const messageAge = Date.now() - message.timestamp;
const revokeTimeLimit = 2 * 60 * 1000; // 2分钟
if (messageAge > revokeTimeLimit) {
console.log(`消息 ${message.message_id} 超过撤回时间限制`);
return false;
}
// 检查敏感词
const sensitiveWords = ['密码', '身份证', '银行账户'];
const hasSensitiveContent = sensitiveWords.some(word =>
message.content.includes(word)
);
if (hasSensitiveContent) {
return true;
}
// 其他撤回条件判断...
return false;
}
// 带日志记录的消息撤回
async function revokeMessageWithLogging(messageId, reason) {
try {
const response = await feishuTenantV1Message.revokeMessageAsync(messageId);
if (response.code === 0) {
console.log(`消息撤回成功: ${messageId}, 原因: ${reason}`);
// 记录撤回操作日志
await logRevocationOperation({
messageId,
reason,
timestamp: new Date().toISOString(),
operator: 'system'
});
// 发送撤回通知(如需要)
await sendRevocationNotification(messageId, reason);
} else {
console.error(`消息撤回失败: ${messageId}, 错误: ${response.msg}`);
// 记录撤回失败
await logRevocationFailure(messageId, response.msg);
}
} catch (error) {
console.error(`撤回消息时发生错误: ${messageId}`, error);
}
}
// 记录撤回操作
async function logRevocationOperation(operation) {
console.log('消息撤回操作记录:', operation);
// 这里可以发送到日志系统或数据库
}
// 发送撤回通知
async function sendRevocationNotification(messageId, reason) {
// 可以向管理员发送撤回通知
const notification = {
text: `系统自动撤回了消息 ${messageId},原因:${reason}`,
timestamp: new Date().toISOString()
};
console.log('撤回通知:', notification);
}
// 记录撤回失败
async function logRevocationFailure(messageId, errorMessage) {
console.error('消息撤回失败记录:', {
messageId,
error: errorMessage,
timestamp: new Date().toISOString()
});
}函数名称:获取历史消息
函数签名:
csharp
Task<FeishuApiPageListResult<HistoryMessageData>> GetHistoryMessageAsync(
[Query("container_id_type")] string container_id_type,
[Query("container_id")] string container_id,
[Query("start_time")] string? start_time = null,
[Query("end_time")] string? end_time = null,
[Query("sort_type")] string? sort_type = "ByCreateTimeAsc",
[Query("page_size")] int page_size = 10,
[Query("page_token")] string? page_token = null,
CancellationToken cancellationToken = default);认证:租户令牌
参数:
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| container_id_type | string | ✅ 必填 | 容器类型 | "chat" |
| container_id | string | ✅ 必填 | 容器ID | "oc_234jsi43d3ssi993d43545f" |
| start_time | string | ⚪ 可选 | 起始时间(秒级时间戳) | "1608594809" |
| end_time | string | ⚪ 可选 | 结束时间(秒级时间戳) | "1609296809" |
| sort_type | string | ⚪ 可选 | 消息排序方式 | "ByCreateTimeAsc" |
| page_size | int | ⚪ 可选 | 分页大小,默认值:10 | 50 |
| page_token | string | ⚪ 可选 | 分页标记 | "xxx" |
| cancellationToken | CancellationToken | ⚪ 可选 | 取消操作令牌 | - |
响应:
成功响应示例:
json
{
"code": 0,
"msg": "success",
"data": {
"items": [
{
"message_id": "om_dc13264520392913993dd051dba21dcf",
"chat_id": "oc_234jsi43d3ssi993d43545f",
"sender": {
"user_id": "ou_7d8a6e6df7621556ce0d21922b676706ccs",
"name": "张三"
},
"message_type": "text",
"create_time": "1608594809",
"content": "{\"text\":\"Hello World\"}"
}
],
"page_token": "next_page_token",
"has_more": true
}
}常见错误响应:
json
{
"code": 403,
"msg": "无权限访问该会话历史"
}json
{
"code": 404,
"msg": "会话不存在"
}说明:
- 支持查询单聊、群聊和话题的历史消息
- 可以按时间范围筛选消息
- 支持按创建时间升序或降序排列
代码示例:
javascript
// 智能聊天记录分析系统
async function analyzeChatHistory(chatId, analysisType = 'summary') {
let allMessages = [];
let pageToken = null;
const endTime = Math.floor(Date.now() / 1000);
const startTime = endTime - (7 * 24 * 60 * 60); // 最近7天
try {
do {
const response = await feishuTenantV1Message.getHistoryMessageAsync(
"chat", // container_id_type
chatId, // container_id
startTime.toString(),
endTime.toString(),
"ByCreateTimeAsc", // 按时间升序
100, // 每页100条
pageToken
);
if (response.code === 0) {
allMessages = allMessages.concat(response.data.items);
pageToken = response.data.has_more ? response.data.page_token : null;
} else {
throw new Error(response.msg);
}
} while (pageToken);
// 根据分析类型处理消息
const analysisResult = await performMessageAnalysis(allMessages, analysisType);
return analysisResult;
} catch (error) {
console.error('分析聊天记录失败:', error);
throw error;
}
}
// 执行消息分析
async function performMessageAnalysis(messages, analysisType) {
switch (analysisType) {
case 'summary':
return await generateChatSummary(messages);
case 'sentiment':
return await analyzeSentiment(messages);
case 'keywords':
return await extractKeywords(messages);
case 'activity':
return await analyzeActivity(messages);
default:
return await generateChatSummary(messages);
}
}
// 生成聊天摘要
async function generateChatSummary(messages) {
const summary = {
totalMessages: messages.length,
timeRange: {
start: messages[0]?.create_time,
end: messages[messages.length - 1]?.create_time
},
participants: new Set(),
messageTypes: {},
keyTopics: []
};
// 统计参与者和消息类型
messages.forEach(msg => {
summary.participants.add(msg.sender.user_id);
const msgType = msg.message_type;
summary.messageTypes[msgType] = (summary.messageTypes[msgType] || 0) + 1;
});
// 提取关键话题
summary.keyTopics = await extractKeyTopics(messages);
return {
...summary,
participants: Array.from(summary.participants).length,
summaryText: await generateSummaryText(summary)
};
}
// 分析情感倾向
async function analyzeSentiment(messages) {
const sentimentScores = messages.map(msg => {
const content = JSON.parse(msg.content).text || '';
return {
messageId: msg.message_id,
timestamp: msg.create_time,
sender: msg.sender.name,
sentiment: analyzeTextSentiment(content),
content: content.substring(0, 50) + '...'
};
});
const positiveCount = sentimentScores.filter(s => s.sentiment > 0).length;
const negativeCount = sentimentScores.filter(s => s.sentiment < 0).length;
const neutralCount = sentimentScores.filter(s => s.sentiment === 0).length;
return {
totalMessages: sentimentScores.length,
sentiment: {
positive: positiveCount,
negative: negativeCount,
neutral: neutralCount
},
details: sentimentScores
};
}
// 提取关键词
async function extractKeywords(messages) {
const allText = messages
.map(msg => JSON.parse(msg.content).text || '')
.join(' ');
const keywords = extractTextKeywords(allText, 20); // 提取前20个关键词
return {
totalWords: allText.length,
keywords: keywords,
wordFrequency: calculateWordFrequency(allText)
};
}
// 分析活跃度
async function analyzeActivity(messages) {
const activityByHour = {};
const activityByUser = {};
messages.forEach(msg => {
const hour = new Date(parseInt(msg.create_time) * 1000).getHours();
const user = msg.sender.user_id;
activityByHour[hour] = (activityByHour[hour] || 0) + 1;
activityByUser[user] = (activityByUser[user] || 0) + 1;
});
const sortedUsers = Object.entries(activityByUser)
.sort(([, a], [, b]) => b - a)
.slice(0, 10); // 前10名活跃用户
return {
totalMessages: messages.length,
hourlyActivity: activityByHour,
topActiveUsers: sortedUsers,
averageMessagesPerHour: messages.length / 24
};
}
// 简单的文本情感分析
function analyzeTextSentiment(text) {
const positiveWords = ['好', '棒', '优秀', '满意', '感谢', '赞'];
const negativeWords = ['差', '糟', '失望', '不满', '问题', '错误'];
let score = 0;
positiveWords.forEach(word => {
if (text.includes(word)) score++;
});
negativeWords.forEach(word => {
if (text.includes(word)) score--;
});
return score;
}
// 提取关键词(简化版)
function extractTextKeywords(text, limit = 10) {
// 这里应该使用更复杂的NLP算法,简化示例
const words = text.split(/\s+/).filter(word => word.length > 2);
const frequency = {};
words.forEach(word => {
frequency[word] = (frequency[word] || 0) + 1;
});
return Object.entries(frequency)
.sort(([, a], [, b]) => b - a)
.slice(0, limit)
.map(([word]) => word);
}
// 生成摘要文本
async function generateSummaryText(summary) {
return `该群聊在过去一段时间内有 ${summary.totalMessages} 条消息,` +
`参与者 ${summary.participants} 人。` +
`主要消息类型为 ${Object.keys(summary.messageTypes).join('、')},` +
`主要讨论话题包括 ${summary.keyTopics.slice(0, 3).join('、')}等。`;
}
// 使用示例
async function main() {
try {
const chatId = "oc_234jsi43d3ssi993d43545f";
// 生成聊天摘要
const summary = await analyzeChatHistory(chatId, 'summary');
console.log('聊天摘要:', summary);
// 分析情感倾向
const sentiment = await analyzeChatHistory(chatId, 'sentiment');
console.log('情感分析:', sentiment);
} catch (error) {
console.error('分析失败:', error);
}
}函数名称:添加消息表情回复
函数签名:
csharp
Task<FeishuApiResult<ReactionResult>?> AddMessageReactionsAsync(
[Path] string message_id,
[Body] ReactionRequest sendMessageRequest,
CancellationToken cancellationToken = default);认证:租户令牌
参数:
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| message_id | string | ✅ 必填 | 待添加表情回复的消息ID | "om_dc13264520392913993dd051dba21dcf" |
| sendMessageRequest | ReactionRequest | ✅ 必填 | 添加消息表情回复请求体 | 见下方结构 |
| sendMessageRequest.ReactionType.EmojiType | string | ✅ 必填 | emoji类型 | "thumbs_up" |
| cancellationToken | CancellationToken | ⚪ 可选 | 取消操作令牌 | - |
响应:
成功响应示例:
json
{
"code": 0,
"msg": "success",
"data": {
"reaction_id": "ZCaCIjUBVVWSrm5L-3ZTw*************sNa8dHVplEzzSfJVUVLMLcS_",
"emoji_type": "thumbs_up"
}
}常见错误响应:
json
{
"code": 404,
"msg": "消息不存在"
}json
{
"code": 400,
"msg": "不支持的表情类型"
}说明:
- 支持给消息添加表情回复
- 支持的表情类型参考飞书官方文档
- 可以用于快速回应和表达态度
代码示例:
javascript
// 智能表情回复系统
async function intelligentReactionSystem(messageId, senderId, messageContent) {
try {
// 分析消息内容,推荐合适的表情
const recommendedEmoji = await analyzeAndRecommendEmoji(messageContent, senderId);
// 如果推荐表情,则自动添加
if (recommendedEmoji) {
await addMessageReaction(messageId, recommendedEmoji);
}
} catch (error) {
console.error('智能表情回复失败:', error);
}
}
// 分析消息并推荐表情
async function analyzeAndRecommendEmoji(content, senderId) {
// 不给自己发的消息添加表情
if (senderId === currentUser.id) {
return null;
}
// 根据消息内容推荐表情
if (isThankYouMessage(content)) {
return "thumbs_up"; // 👍
}
if (isCongratulationsMessage(content)) {
return "tada"; // 🎉
}
if (isFunnyMessage(content)) {
return "laugh"; // 😂
}
if (isAgreementMessage(content)) {
return "heart"; // ❤️
}
return null;
}
// 判断是否为感谢消息
function isThankYouMessage(content) {
const thankKeywords = ['谢谢', '感谢', 'thank', '谢了'];
return thankKeywords.some(keyword => content.includes(keyword));
}
// 判断是否为祝贺消息
function isCongratulationsMessage(content) {
const congratsKeywords = ['恭喜', '祝贺', '恭喜了', '祝贺你'];
return congratsKeywords.some(keyword => content.includes(keyword));
}
// 判断是否为有趣消息
function isFunnyMessage(content) {
const funnyKeywords = ['哈哈', '呵呵', '666', '哈哈', '搞笑'];
return funnyKeywords.some(keyword => content.includes(keyword));
}
// 判断是否为同意消息
function isAgreementMessage(content) {
const agreeKeywords = ['好的', '没问题', '同意', '可以'];
return agreeKeywords.some(keyword => content.includes(keyword));
}
// 添加表情回复
async function addMessageReaction(messageId, emojiType) {
const reactionRequest = {
reaction_type: {
emoji_type: emojiType
}
};
try {
const response = await feishuTenantV1Message.addMessageReactionsAsync(
messageId,
reactionRequest
);
if (response.code === 0) {
console.log(`表情回复添加成功: ${messageId} -> ${emojiType}`);
// 记录表情使用统计
await recordEmojiUsage(emojiType, messageId);
} else {
console.error(`表情回复添加失败: ${response.msg}`);
}
} catch (error) {
console.error('添加表情回复时发生错误:', error);
}
}
// 记录表情使用统计
async function recordEmojiUsage(emojiType, messageId) {
const usageData = {
emojiType,
messageId,
timestamp: new Date().toISOString(),
userId: currentUser.id
};
console.log('表情使用记录:', usageData);
// 这里可以发送到统计系统
}
// 批量处理消息的表情回复
async function batchProcessMessageReactions(messages) {
for (const message of messages) {
// 避免给已经处理过的消息添加表情
if (await hasProcessedReaction(message.message_id)) {
continue;
}
await intelligentReactionSystem(
message.message_id,
message.sender.user_id,
JSON.parse(message.content).text || ''
);
// 添加延迟避免请求过于频繁
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
// 检查消息是否已经处理过表情回复
async function hasProcessedReaction(messageId) {
// 这里可以查询数据库或缓存来检查
const processedMessages = getProcessedReactionsFromCache();
return processedMessages.includes(messageId);
}
// 从缓存获取已处理的消息列表
function getProcessedReactionsFromCache() {
// 模拟缓存数据
return localStorage.getItem('processedReactions')?.split(',') || [];
}
// 使用示例
async function main() {
// 监听新消息并自动添加表情回复
const newMessages = await getNewMessages();
await batchProcessMessageReactions(newMessages);
}由于篇幅限制,以上展示了部分核心函数的详细文档。实际项目中包含20+个函数,涵盖了消息管理的各个方面:
✅ 完整的消息管理功能:
- 消息发送、回复、编辑、撤回、转发
- 文件和图片的上传下载
- 历史消息查询和分析
- 消息加急通知(应用内、短信、电话)
✅ 高级交互功能:
- 表情回复管理
- 消息跟随气泡
- 已读状态查询
- 多条消息合并转发
✅ 企业级特性:
- 批量操作支持
- 请求去重(uuid参数)
- 分页查询优化
- 大文件处理支持
✅ 实用场景示例:
- 智能客服回复系统
- 聊天记录分析
- 消息撤回管理
- 表情互动自动化
所有代码示例都提供了完整的业务场景实现,包含错误处理、日志记录、性能优化等最佳实践。开发者可以基于这些示例快速构建强大的消息管理应用。