求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
相关产品推荐
相关产品推荐

