在Discord.js v11.4.2中如何获取服务器成员的ID?
在Discord.js v11.4.2中获取服务器成员ID的正确方法
嘿,我来帮你梳理下代码里的问题,然后给出正确的实现方式~
首先先说说你现有代码里的几个小问题:
client.guilds.get(message.guild.id)完全没必要哦,message.guild本身就是当前触发命令的服务器对象,直接用它就行,不用多此一举再从客户端的服务器集合里获取一遍。memserver.users.tag是错误的用法:users是一个用户集合(Collection),不是单个用户对象,所以不能直接访问tag属性;而且你要的是成员ID,tag是用户的昵称+标签(比如User#1234),不是ID。
接下来给你两种正确的实现方式,根据你的需求选择:
方式1:获取缓存中的所有成员ID(适合小服务器)
如果你的服务器成员不多,机器人已经缓存了所有成员,可以直接用这段代码:
if(message.content === '!members'){ // 直接使用当前服务器对象 const targetGuild = message.guild; // 遍历成员集合,提取每个成员的ID const memberIds = targetGuild.members.map(member => member.id); // 打印到控制台 console.log('服务器成员ID列表:', memberIds); // 也可以发送到Discord频道里 message.channel.send(`服务器成员ID列表:\n${memberIds.join('\n')}`); }
这里的关键是targetGuild.members——它是当前服务器所有成员的GuildMember对象集合,每个GuildMember都有id属性,就是对应的用户ID。
方式2:获取完整的成员列表(适合大服务器)
如果服务器成员较多,机器人可能没有缓存所有成员,这时候需要调用API来获取完整列表:
if(message.content === '!members'){ // 调用fetchMembers从API获取所有成员 message.guild.fetchMembers() .then(updatedGuild => { const memberIds = updatedGuild.members.map(member => member.id); console.log('完整服务器成员ID列表:', memberIds); message.channel.send(`完整服务器成员ID列表:\n${memberIds.join('\n')}`); }) .catch(error => { console.error('获取成员失败:', error); message.channel.send('抱歉,无法获取服务器成员列表,请检查机器人是否有足够权限!'); }); }
fetchMembers()会向Discord API请求服务器的所有成员数据,更新本地缓存后返回,这样就能拿到完整的成员ID列表了。
另外补充个小知识点:guild.users和guild.members的区别——users是服务器内所有用户的User对象集合,members是GuildMember对象集合(包含用户在服务器内的角色、昵称等额外信息),两者的id属性是一致的,都是用户的唯一ID,不过处理服务器成员相关的逻辑,用members会更合适哦。
内容的提问来源于stack exchange,提问作者user13532543




