如何获取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
相关产品推荐
相关产品推荐

