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

