如何修改Discord.js代码过滤机器人,仅显示真实用户?
解决Discord.js统计真实用户数量并更新机器人状态的问题
原代码使用guild.memberCount统计成员时会包含机器人账号,要过滤掉机器人只统计真实用户,需要修改成员统计逻辑,同时确保机器人拥有必要权限获取成员数据。
修改步骤说明
- 替换成员统计逻辑:放弃直接使用
memberCount,改为遍历每个服务器的成员缓存,过滤掉user.bot为true的账号,再统计真实用户数量。 - 添加网关意图:Discord.js v14及以上版本需要启用
GUILDS和GUILD_MEMBERS特权意图,否则无法获取完整的成员缓存。需在Discord开发者门户的机器人页面开启这两个意图,同时在客户端初始化时声明。 - 修正ActivityType导入:原代码直接使用
ActivityType会导致未定义错误,需从Discord模块中解构导出。
修改后的完整代码
const Discord = require('discord.js'); // 解构获取ActivityType const { ActivityType } = Discord; const token = require('./token.json').token; // 初始化客户端时添加必要的网关意图 const client = new Discord.Client({ intents: [ Discord.GatewayIntentBits.Guilds, Discord.GatewayIntentBits.GuildMembers ] }); setInterval(async () => { // 遍历所有服务器,过滤机器人后统计真实用户总数 let membersCount = client.guilds.cache .map(guild => guild.members.cache.filter(member => !member.user.bot).size) .reduce((a, b) => a + b, 0); await client.user.setPresence({ activities: [{ name: `mit ${membersCount} usern`, type: ActivityType.Playing }], status: "online" }); }, 1000 * 60 * 10); client.login(token);
关键修改点解析
- 过滤机器人:
guild.members.cache.filter(member => !member.user.bot).size会筛选出当前服务器中所有非机器人用户,再获取其数量。 - 网关意图配置:
GatewayIntentBits.Guilds是机器人运行的基础意图,GatewayIntentBits.GuildMembers允许机器人获取服务器成员列表数据,缺少这两个意图会导致成员缓存为空,统计结果为0。 - ActivityType导入:通过解构
const { ActivityType } = Discord;确保ActivityType.Playing能被正确识别。
内容的提问来源于stack exchange,提问作者Zerknabberter
相关产品推荐
相关产品推荐

