You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Discord语音频道当前成员列表?解决API调用报错

问题原因

你调用的/channels/{channel_id}/thread-members接口是线程频道专属的,仅用于获取线程频道的成员,而你要访问的是语音频道,因此Discord返回50024错误(无法对该频道类型执行操作)。

正确解决方案

要获取语音频道内当前在线的成员,需要通过服务器语音状态接口筛选,再获取成员详情:

步骤1:获取服务器内所有语音状态

调用GET /guilds/{guild_id}/voice-states接口,获取服务器中所有用户的语音连接状态,筛选出目标语音频道的条目:

const guildId = "你的服务器ID"; // 替换为目标服务器ID
const channelId = "你的语音频道ID";

try {
  // 获取所有语音状态
  const voiceRes = await fetch(`https://discord.com/api/v10/guilds/${guildId}/voice-states`, {
    headers: {
      Authorization: `Bot ${process.env.DISCORD_TOKEN}`,
      'User-Agent': 'DiscordBot (https://github.com/discord/discord-example-app, 1.0.0)',
    },
    method: 'GET'
  });

  if (!voiceRes.ok) {
    throw new Error(`HTTP错误!状态码: ${voiceRes.status}`);
  }

  const voiceStates = await voiceRes.json();
  // 筛选出目标语音频道的用户ID
  const targetUserIds = voiceStates
    .filter(state => state.channel_id === channelId)
    .map(state => state.user_id);

  if (targetUserIds.length === 0) {
    console.log("该语音频道当前无在线成员");
    return;
  }

  // 步骤2:批量获取这些用户的member对象
  const membersRes = await fetch(`https://discord.com/api/v10/guilds/${guildId}/members?user_ids=${targetUserIds.join(',')}`, {
    headers: {
      Authorization: `Bot ${process.env.DISCORD_TOKEN}`,
      'User-Agent': 'DiscordBot (https://github.com/discord/discord-example-app, 1.0.0)',
    },
    method: 'GET'
  });

  if (!membersRes.ok) {
    throw new Error(`HTTP错误!状态码: ${membersRes.status}`);
  }

  const members = await membersRes.json();
  console.log("语音频道内的成员列表:", members);
  // 可在此处理成员数据,比如获取服务器昵称:members.forEach(member => console.log(member.nick || member.user.username))

} catch (err) {
  console.error("获取成员列表失败:", err);
}

必要权限

你的机器人需要在目标服务器拥有以下权限:

  • ViewChannel:允许查看语音频道
  • VoiceStateRead:允许读取语音状态

更简便的方式(推荐)

如果你使用Discord.js等官方维护的库,代码会更简洁,直接通过频道对象获取成员:

// 假设已初始化Discord.js客户端client
const channel = client.channels.cache.get(channelId);
if (channel.type === 2) { // 确认是语音频道
  const members = channel.members; // 直接获取频道内的成员集合
  members.forEach(member => {
    console.log("成员昵称:", member.nickname || member.user.username);
  });
}

内容的提问来源于stack exchange,提问作者Anthony De Vellis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:37:31