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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:30:56