Skip to content

接口名称

消息管理API -(IFeishuTenantV1Message)

功能描述

飞书消息管理接口,用于对飞书聊天中的消息进行发送、回复、编辑、撤回、转发以及查询等操作。支持文本、富文本、卡片、图片、视频、音频、文件、表情包等多种消息类型,以及文件上传下载、消息加急、表情回复等丰富的功能。当前接口使用租户令牌访问,适用于租户应用场景,提供完整的消息管理能力。

参考文档

飞书消息管理API文档

函数列表

函数名称功能描述认证方式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);

认证:租户令牌

参数

参数名类型必填说明示例值
sendMessageRequestSendMessageRequest✅ 必填发送消息请求体见下方结构
sendMessageRequest.ReceiveIdstring✅ 必填消息接收者的ID"ou_7d8a6e6df7621556ce0d21922b676706ccs"
sendMessageRequest.MsgTypestring✅ 必填消息类型"text"
sendMessageRequest.Contentstring✅ 必填消息内容JSON字符串"{"text":"Hello World"}"
sendMessageRequest.Uuidstring⚪ 可选请求去重的唯一标识"unique-request-id"
receive_id_typestring⚪ 可选用户ID类型,默认值:open_id"open_id"
cancellationTokenCancellationToken⚪ 可选取消操作令牌-

响应

成功响应示例:

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_idstring✅ 必填待回复的消息ID"om_dc13264520392913993dd051dba21dcf"
replyMessageRequestReplyMessageRequest✅ 必填回复消息请求体见下方结构
replyMessageRequest.MsgTypestring✅ 必填消息类型"text"
replyMessageRequest.Contentstring✅ 必填消息内容JSON字符串"{"text":"收到,我会处理"}"
replyMessageRequest.Uuidstring⚪ 可选请求去重的唯一标识"unique-reply-id"
cancellationTokenCancellationToken⚪ 可选取消操作令牌-

响应

成功响应示例:

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_idstring✅ 必填待撤回的消息ID"om_dc13264520392913993dd051dba21dcf"
cancellationTokenCancellationToken⚪ 可选取消操作令牌-

响应

成功响应示例:

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_typestring✅ 必填容器类型"chat"
container_idstring✅ 必填容器ID"oc_234jsi43d3ssi993d43545f"
start_timestring⚪ 可选起始时间(秒级时间戳)"1608594809"
end_timestring⚪ 可选结束时间(秒级时间戳)"1609296809"
sort_typestring⚪ 可选消息排序方式"ByCreateTimeAsc"
page_sizeint⚪ 可选分页大小,默认值:1050
page_tokenstring⚪ 可选分页标记"xxx"
cancellationTokenCancellationToken⚪ 可选取消操作令牌-

响应

成功响应示例:

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_idstring✅ 必填待添加表情回复的消息ID"om_dc13264520392913993dd051dba21dcf"
sendMessageRequestReactionRequest✅ 必填添加消息表情回复请求体见下方结构
sendMessageRequest.ReactionType.EmojiTypestring✅ 必填emoji类型"thumbs_up"
cancellationTokenCancellationToken⚪ 可选取消操作令牌-

响应

成功响应示例:

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参数)
  • 分页查询优化
  • 大文件处理支持

实用场景示例

  • 智能客服回复系统
  • 聊天记录分析
  • 消息撤回管理
  • 表情互动自动化

所有代码示例都提供了完整的业务场景实现,包含错误处理、日志记录、性能优化等最佳实践。开发者可以基于这些示例快速构建强大的消息管理应用。