如何在Discord.js中区分服务器用户数与机器人成员数?
如何用Discord.js的filter方法区分服务器总用户数与机器人成员数
嘿,刚好我做过类似的功能,用Discord.js的filter方法区分机器人和普通用户其实超简单,我给你一步步讲清楚!
首先得明确核心逻辑:Discord.js里的每个GuildMember(服务器成员)对应的User对象,都自带一个**bot布尔属性**——机器人账号的这个属性是true,普通人类用户则是false。我们刚好可以利用这个属性来做筛选!
核心实现步骤
- 获取总成员数:直接用
guild.memberCount就能拿到,这个属性会返回服务器里的所有成员总数(包含机器人)。 - 筛选机器人成员:通过
guild.members.cache.filter()方法,传入判断条件member.user.bot,就能把所有机器人成员筛选出来,再用.size获取筛选后的数量。 - 计算人类成员数(可选):用总成员数减去机器人数量就行,一步到位。
完整代码示例
基础版(使用缓存成员)
如果你的机器人已经缓存了服务器的成员,直接用下面的代码就行:
// 假设你在Slash命令里,已经拿到了interaction对象 const guild = interaction.guild; if (!guild) return interaction.reply("这个命令只能在服务器内使用哦!"); // 总成员数 const totalMembers = guild.memberCount; // 筛选机器人并统计数量 const botCount = guild.members.cache.filter(member => member.user.bot).size; // 人类成员数 const humanCount = totalMembers - botCount; // 回复信息 await interaction.reply(` 📊 **服务器成员统计** - 总成员数:${totalMembers} - 人类用户:${humanCount} - 机器人:${botCount} `);
进阶版(获取所有成员,包括离线)
如果服务器成员较多,缓存里可能没有加载全部成员,这时候可以先调用guild.members.fetch()来拉取所有成员(需要机器人有GUILD_MEMBERS权限):
module.exports = { data: new SlashCommandBuilder() .setName("serverinfo") .setDescription("显示服务器详细信息"), async execute(interaction) { const guild = interaction.guild; if (!guild) return interaction.reply("请在服务器内使用此命令!"); // 先获取所有成员(包括离线) await guild.members.fetch(); const totalMembers = guild.memberCount; const botCount = guild.members.cache.filter(member => member.user.bot).size; const humanCount = totalMembers - botCount; await interaction.reply({ embeds: [ new EmbedBuilder() .setTitle(`${guild.name} 服务器信息`) .addFields( { name: "总成员数", value: `${totalMembers}`, inline: true }, { name: "人类用户", value: `${humanCount}`, inline: true }, { name: "机器人", value: `${botCount}`, inline: true } ) .setColor(0x2b2d31) ] }); }, };
小提醒
- 别搞混
member和user对象哦,判断机器人的属性是在member.user.bot上,不是member.bot。 - 上面的代码是Discord.js v14+的写法,如果是旧版本(v12及以下),语法会有小差异,比如
guild.members.cache在v12里是guild.members,不过现在大部分项目都用v14+了,这个可以放心用。
内容的提问来源于stack exchange,提问作者Zachary Murphy




