如何获取Discord.js V13/V14机器人所在服务器的总用户数?
解决Discord.js V13/V14获取机器人所在服务器总用户数的问题
在Discord.js V13及以后版本中,client.users.cache.size无法返回所有服务器的用户总数——因为该缓存仅存储机器人已经交互过的用户(默认只有机器人自身),所以会出现仅显示1个用户的情况。以下是两种可行解决方案:
方法一:遍历服务器成员数(精确值)
通过累加机器人所在所有服务器的成员数得到总数,需满足两个前提:
- 启用
GuildMembers权限意图(Intent) - 确保服务器成员已被缓存(或主动获取)
步骤1:开启GuildMembers意图
先在Discord开发者门户的机器人设置中打开"Server Members Intent",再在客户端初始化时传入该意图:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, // 必须添加此意图 // 根据需求添加其他意图,比如GuildMessages等 ] });
步骤2:修改ready事件代码
替换原有的client.users.cache.size为累加逻辑:
client.once("ready", () => { // 计算所有服务器总用户数(可选择排除机器人) const totalUsers = client.guilds.cache.reduce((total, guild) => { // 若要排除机器人,使用此行替代 // const validMembers = guild.members.cache.filter(member => !member.user.bot).size; return total + guild.memberCount; }, 0); console.log(`I'm currently on ${client.guilds.cache.size} Servers with ${totalUsers} people.`) const activities = [ `with ${totalUsers} people.`, "music.", "with my Owner.", ` | Version ${client.BotVersion}`, `on ${client.guilds.cache.size} Servers.`, "/help" ]; setInterval(() => { const randomIndex = Math.floor(Math.random() * activities.length); const newActivity = activities[randomIndex]; client.user.setActivity(newActivity); }, 10000); client.user.setActivity(` | Version ${client.BotVersion}`) });
注意:若服务器成员未被缓存,
guild.memberCount可能不准确。对大型服务器可使用guild.members.fetch()主动获取成员,但需遵守Discord API限流规则。
方法二:使用近似成员数(无需特殊权限)
如果不需要精确实时数值,可使用Discord提供的approximateMemberCount属性——返回服务器近似成员数,无需启用GuildMembers意图,获取速度更快:
client.once("ready", () => { const totalUsers = client.guilds.cache.reduce((total, guild) => { return total + guild.approximateMemberCount; }, 0); // 后续代码同方法一... });
该方法优点是无需额外权限和缓存操作,缺点是数值为近似值,可能与实际成员数有小幅偏差。
内容的提问来源于stack exchange,提问作者Blaxyy
相关产品推荐
相关产品推荐

