如何获取Discord服务器所有成员ID?Discord.js新手求助
解决Discord.js仅获取到机器人自身ID的问题
嘿,我完全懂你这种复制代码却踩坑的无奈!刚接触Discord.js的时候,我也遇到过一模一样的问题——明明想抓取整个服务器的成员ID,结果数组里只有机器人自己。这其实是Discord.js的缓存机制和权限设置在搞鬼,咱们一步步来解决:
问题根源
Discord.js v13及以后的版本,默认不会自动缓存服务器的所有成员。members.cache里只会存机器人已经“见过”的成员(也就是它自己),除非你满足两个核心条件:
- 开启了
GuildMembers特权意图 - 主动从Discord API拉取完整的成员数据
第一步:开启特权意图
先去Discord开发者平台完成设置:
- 打开你的机器人应用,切换到「Bot」标签页
- 往下翻找到「Privileged Gateway Intents」,把「Server Members Intent」的开关打开
- 保存更改(如果提示需要验证,按页面指引完成即可)
第二步:修改代码获取所有成员
原来的代码直接读取缓存肯定不行,咱们换成异步的fetch()方法主动拉取成员数据,同时把readyDiscord改成异步函数:
const { Client, GatewayIntentBits } = require('discord.js'); // 初始化客户端时必须添加GuildMembers意图 const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 必备的服务器基础意图 GatewayIntentBits.GuildMembers, // 必须添加这个才能获取成员列表 ], }); client.on("ready", readyDiscord); // 改成async函数才能使用await关键字 async function readyDiscord() { console.log("Authentication complete"); console.log("Going online"); const serverUsers = []; const MyServer = client.guilds.cache.get("MyServerID"); // 用fetch()从Discord API拉取完整的成员列表,这一步是关键! const allMembers = await MyServer.members.fetch(); // 遍历拉取到的成员,将ID存入数组 allMembers.forEach(member => serverUsers.push(member.user.id)); console.log(serverUsers); } // 记得最后登录你的机器人 client.login("你的机器人Token");
额外提醒
- 确保你的机器人在目标服务器里拥有「查看服务器成员」的权限(虽然开启意图后大部分情况没问题,但权限配置齐全更稳妥)
- 如果还是无法获取成员,试试重新邀请机器人到服务器,确保新的意图设置生效
这样改完之后,你应该就能拿到服务器所有成员的ID啦!
内容的提问来源于stack exchange,提问作者Nexoan
相关产品推荐
相关产品推荐

