Discord.js:如何获取旧消息中特定表情的所有反应用户?
获取Discord消息表情的所有反应用户ID
你遇到的问题核心是Discord API获取反应用户的分页参数不是before,而是after,和消息分页的逻辑相反,这才导致循环重复获取同一批用户。
错误原因
Discord的反应用户接口(GET /channels/{channel.id}/messages/{message.id}/reactions/{emoji})使用after参数实现分页,要求返回ID大于该参数值的用户。你之前用before参数,会一直返回ID小于指定值的用户(也就是第一批的100个),所以每次循环都拿到相同的集合。
正确实现代码
下面是可以获取所有(或指定数量)反应用户ID的函数:
async function getAllReactionUsers(reaction, limit = Infinity) { const allUsers = []; let lastUserId = null; while (true) { const fetchOptions = { limit: 100 }; // 第一次不需要after,后续用最后一个用户的ID作为after参数 if (lastUserId) { fetchOptions.after = lastUserId; } const fetchedUsers = await reaction.users.fetch(fetchOptions); allUsers.push(...fetchedUsers.values()); // 终止条件:获取的用户不足100(说明已取完),或达到指定限制 if (fetchedUsers.size < 100 || allUsers.length >= limit) { break; } // 更新lastUserId为当前批次最后一个用户的ID lastUserId = fetchedUsers.last().id; } // 返回所有用户ID的数组 return allUsers.map(user => user.id); } // 使用示例 const targetMessage = await client.channels.cache .get('920031186871545916') .messages.fetch('1074327140138483835'); const targetReaction = targetMessage.reactions.cache.get('✅'); const allReactorIds = await getAllReactionUsers(targetReaction, 520); console.log(allReactorIds);
额外提示
- 如果需要排除机器人用户,可以在添加用户时过滤:
allUsers.push(...fetchedUsers.filter(user => !user.bot).values()); - 确保你的Bot拥有
READ_MESSAGE_HISTORY和VIEW_CHANNEL权限,否则无法获取反应数据 - 若用户量极大,Discord.js会自动处理API速率限制,无需额外添加延迟
内容的提问来源于stack exchange,提问作者Max von der Mühle
相关产品推荐
相关产品推荐

