You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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.usersguild.members的区别——users是服务器内所有用户的User对象集合,membersGuildMember对象集合(包含用户在服务器内的角色、昵称等额外信息),两者的id属性是一致的,都是用户的唯一ID,不过处理服务器成员相关的逻辑,用members会更合适哦。

内容的提问来源于stack exchange,提问作者user13532543

火山引擎 最新活动