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

Discord.js v14获取非机器人在线成员异常问题求助

问题描述

我需要统计非机器人用户、非机器人在线用户及机器人用户的数量,其中非机器人用户和机器人用户的统计功能正常,但非机器人在线用户的统计返回随机数值,且member.presence始终为null。

当前使用的统计代码:

await guild.members.fetch({ withPresences: true }).then(async fetchedMembers => {
    const onlineS = await fetchedMembers.filter(member => !member.presence || member.presence?.status !== 'offline' && !member.user.bot);
    console.log(onlineS.size)
})

客户端初始化代码:

const client = new Client({ 
    intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildPresences ],
    partials: [Partials.Message, Partials.Channel, Partials.Reaction, Partials.GuildMember],
    allowedMentions: { parse: [ 'roles', 'users' ] }
});

已在Discord开发者门户中开启了presence权限,请问哪里出现了错误?


问题排查与解决

1. 过滤逻辑完全错误

你的判断条件写反了:!member.presence会把所有没有presence数据的用户(包括在线但未获取到presence的用户)都纳入统计,这就是数值随机的核心原因。正确逻辑应该是只保留有presence数据且状态不为offline的非机器人用户。

2. 批量获取presence的API限制

即使添加了withPresences: true,Discord API也无法返回服务器所有成员的完整presence数据:

  • 仅会返回近期活跃用户的presence,大部分用户的member.presence会是null
  • 服务器规模越大,批量请求返回的presence数据越不完整,这是平台的硬性限制

修正后的代码

await guild.members.fetch({ withPresences: true }).then(fetchedMembers => {
    // 先筛选所有非机器人用户
    const nonBotMembers = fetchedMembers.filter(member => !member.user.bot);
    // 再从非机器人中筛选有presence且状态非离线的用户
    const onlineNonBot = nonBotMembers.filter(member => {
        return member.presence && member.presence.status !== 'offline';
    });
    
    console.log('非机器人在线用户数:', onlineNonBot.size);
    console.log('总非机器人用户数:', nonBotMembers.size);
    console.log('机器人用户数:', fetchedMembers.filter(member => member.user.bot).size);
});

更精准的统计方案

如果需要实时、准确的在线状态统计,建议:

  • 监听presenceUpdate事件,在内存中维护一份成员在线状态的缓存
  • 避免依赖批量fetch获取presence,改用事件驱动的方式更新状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:04:59