You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用discord.js在频道中搜索含指定文本的消息?

在Discord指定频道搜索含特定关键词消息的多种实现方式

除了你提到的“获取全部消息存入数组再遍历筛选”的通用方案,还有几种更高效或适配不同场景的实现路径:

1. 分批获取+即时筛选(减少内存占用)

Discord API获取历史消息是分页返回的(单次最多100条),没必要把所有消息都存进数组再筛选。可以每次获取一页消息后,直接在当前批次里筛选含“silver”的内容,只保留匹配的结果,处理完就丢弃当前批次的非匹配消息,大幅降低内存消耗,尤其适合消息量很大的频道。

示例代码(discord.js v14):

async function searchSilverMessages(channel) {
  const matchedMessages = [];
  let lastMessageId = null;

  while (true) {
    // 分页获取消息,每次最多100条
    const messages = await channel.messages.fetch({
      limit: 100,
      before: lastMessageId
    });

    if (messages.size === 0) break; // 没有更多消息,终止循环

    // 即时筛选当前批次里含"silver"的消息
    messages.forEach(msg => {
      if (msg.content.toLowerCase().includes('silver')) {
        matchedMessages.push(msg);
      }
    });

    lastMessageId = messages.last().id; // 更新最后一条消息ID,用于下一页查询
  }

  return matchedMessages;
}

2. 调用Discord内置搜索接口(API层面直接筛选)

部分Discord库封装了官方的搜索API,你可以直接传入关键词“silver”让API返回已经筛选后的结果,省去自己遍历的步骤。不过要注意,官方搜索有一些限制(比如支持的关键词语法、时间范围、返回条数上限),需要根据需求调整参数。

示例代码(discord.js v14,利用搜索参数):

async function searchViaDiscordAPI(channel) {
  // 直接搜索含"silver"的消息,API返回已筛选结果
  const matchedMessages = await channel.messages.fetch({
    limit: 100, // 可根据需求调整,最大100
    search: 'silver'
  });

  return Array.from(matchedMessages.values());
}

注:不同版本的库对搜索参数的支持可能有差异,需要确认你使用的库是否封装了该功能。如果没有,可以直接调用Discord的channels/{channel.id}/messages/search端点。

3. 实时缓存(适合频繁搜索场景)

如果你的机器人需要频繁搜索这个关键词,可以在机器人运行时监听messageCreate事件,实时检测每条新消息是否含“silver”,并将符合条件的消息数据(比如ID、内容、时间)存入数据库或本地缓存。之后需要搜索时,直接查询缓存/数据库即可,不用再去拉取历史消息,效率最高。

示例代码(discord.js v14):

// 初始化缓存(用数组或数据库均可)
const silverMessageCache = [];

// 监听新消息事件,实时缓存匹配的消息
client.on('messageCreate', (msg) => {
  if (msg.channel.id === '你的指定频道ID' && msg.content.toLowerCase().includes('silver')) {
    silverMessageCache.push({
      id: msg.id,
      content: msg.content,
      createdAt: msg.createdAt
    });
  }
});

// 后续搜索直接从缓存获取
function getCachedSilverMessages() {
  return silverMessageCache;
}

总结

“全量存入数组再遍历”是最通用的方案,但不是唯一选择:

  • 大频道优先用分批获取+即时筛选,节省内存;
  • 单次搜索需求可以用API内置搜索,减少代码量;
  • 频繁搜索场景推荐实时缓存,效率最高。

内容的提问来源于stack exchange,提问作者deitysilver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:52:12