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

求Discord.js中类似discord.py的指定时间后频道全量消息获取代码

实现Discord.js中遍历指定时间后所有消息(从最早开始)

要实现和你给出的discord.py代码等效的功能,Discord.js需要通过分页获取消息来绕过100条的限制,以下是具体实现:

核心思路

Discord.js的channel.messages.fetch()单次最多返回100条消息,要获取全部符合条件的消息,需要循环调用该方法:

  • 每次获取一批消息后,记录这批消息中最早的那条的ID
  • 下一次调用时将该ID作为before参数,继续获取更早的消息(结合after参数限定时间范围)
  • 直到没有更多消息返回,停止循环
  • 最后将所有消息按时间升序排列(对应oldest_first=True)

代码实现

async function fetchAllMessagesAfter(channel, targetDate) {
  const allMessages = [];
  let lastMessageId = null;

  while (true) {
    const options = {
      limit: 100,
      after: targetDate,
      // 第一次获取无需before,后续用lastMessageId取更早的消息
      ...(lastMessageId && { before: lastMessageId })
    };

    const messages = await channel.messages.fetch(options);
    if (messages.size === 0) break;

    allMessages.push(...messages.values());
    // 更新lastMessageId为当前批次中最早消息的ID
    lastMessageId = messages.last().id;
  }

  // 按创建时间升序排序,确保最早的消息在前
  allMessages.sort((a, b) => a.createdTimestamp - b.createdTimestamp);
  return allMessages;
}

// 使用示例
const targetDatetime = new Date('2024-01-01T00:00:00'); // 替换为你的指定时间
const channel = await client.channels.fetch('目标频道ID'); // 替换为实际频道ID

const messages = await fetchAllMessagesAfter(channel, targetDatetime);
// 遍历每条消息
messages.forEach(message => {
  console.log(`[${message.createdAt}] ${message.author.tag}: ${message.content}`);
});

关键说明

  • after参数接收Date对象,和discord.py的after=datetime参数作用一致
  • 循环逻辑会逐步拉取所有符合时间条件的消息,直到没有新消息返回
  • 通过排序确保消息按从早到晚的顺序排列,满足oldest_first=True的需求
  • 这种方式虽然速度较慢,但能完整获取所有目标消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:40:39