问题描述
我正在尝试在 DiscordJS 中获取超过 100 条消息.我在 here 找到了这段代码,但它不起作用:
I'm trying to fetch more than 100 messages in DiscordJS. I've found this code here but it doesn't work:
async function lots_of_messages_getter(channel, limit = 500) { const sum_messages = []; let last_id; while (true) { const options = { limit: 100 }; if (last_id) { options.before = last_id; } const messages = await channel.fetch(options); sum_messages.push(...messages.array()); last_id = messages.last().id; if (messages.size != 100 || sum_messages >= limit) { break; } } return sum_messages; } client.on("message", async message => { const channel = client.channels.cache.get("12345"); if (message.content.startsWith(prefix+"random")){ console.log(lots_of_messages_getter()); } });
它给了我这个错误:
(node:6312) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'fetch' of undefined
如何解决这个问题?我对 Node.js 有点陌生.
How can this be fixed? I'm kinda new to Node.js.
推荐答案
以下适用于 discord.js v12 和 v13.与您从中获取代码的 旧答案 不同,它返回一个 collection,所以可以使用.first()、等方法.last()、.find()、.get()、.filter()等
The following works in discord.js v12 and v13. Unlike the older answers where you got your code from, it returns a collection, so you can use methods like .first(), .last(), .find(), .get(), .filter(), etc.
const { Collection } = require('discord.js'); async function fetchMore(channel, limit = 250) { if (!channel) { throw new Error(`Expected channel, got ${typeof channel}.`); } if (limit <= 100) { return channel.messages.fetch({ limit }); } let collection = new Collection(); let lastId = null; let options = {}; let remaining = limit; while (remaining > 0) { options.limit = remaining > 100 ? 100 : remaining; remaining = remaining > 100 ? remaining - 100 : 0; if (lastId) { options.before = lastId; } let messages = await channel.messages.fetch(options); if (!messages.last()) { break; } collection = collection.concat(messages); lastId = messages.last().id; } return collection; }
示例用法:
client.on('message', async (message) => { if (message.author.bot) return; try { const list = await fetchMore(message.channel, 120); console.log( list.size, list.filter((msg) => msg.content.includes('something')), ); } catch (err) { console.log(err); } });