如何用Discord.js机器人列出指定服务器的所有成员?
解决Discord.js机器人无法获取服务器成员的问题
我帮你分析下代码里的几个关键问题,以及对应的修复方案:
问题根源
- API版本不兼容:你用的
client.guilds.find("id", "...")是Discord.js v11及更早版本的写法,v12+已经把集合操作迁移到cache属性下,旧方法已经被移除了。 - 错误的属性调用:服务器对象里没有
users属性,成员数据存在members属性中;而且默认情况下机器人不会缓存所有成员,必须主动获取完整列表。 - 未处理异步操作:获取成员列表是异步行为,直接同步遍历会因为数据未加载完成而没有输出。
修正后的代码
下面是适配Discord.js v12+的正确写法,我加了详细注释:
// 要在异步函数中执行(比如放在命令回调、ready事件里) async function fetchAndLogMembers() { // 从缓存中获取指定服务器 const targetGuild = client.guilds.cache.get("335507048017952771"); // 先判断服务器是否存在 if (!targetGuild) { console.log("找不到指定的服务器,请检查ID是否正确!"); return; } try { // 异步获取服务器所有成员(包括离线成员) const allMembers = await targetGuild.members.fetch(); // 遍历成员并打印用户名 allMembers.forEach(member => { console.log(member.user.username); }); } catch (err) { // 捕获并打印错误(比如权限不足) console.error("获取成员列表时出错:", err); } } // 调用函数执行 fetchAndLogMembers();
额外注意事项
- 开启成员意图:现在Discord要求机器人必须开启「服务器成员意图」才能获取成员列表。你需要登录Discord开发者门户,找到你的机器人应用,在「Bot」标签页的「Privileged Gateway Intents」里,开启「Server Members Intent」。
- 权限检查:确保机器人在目标服务器里有「查看服务器成员」的权限,否则会获取失败。
- 版本建议:尽量使用最新稳定版的Discord.js,旧版本不仅API过时,还可能存在安全漏洞。
内容的提问来源于stack exchange,提问作者user9682247
相关产品推荐
相关产品推荐

