使用Discord.js开发Discord机器人如何获取当前语音频道全部成员
报错原因
你遇到的两个报错都是Discord.js v12及以上版本的API变动导致的:v12开始所有管理器挂载的集合数据都移到了.cache属性下,原来直接调用find、get的旧写法已经失效。
- 按ID找频道的正确写法:你原来的
message.guild.channels.find(c => c.id === 频道ID)改成message.guild.channels.cache.get(频道ID),按ID查找用get效率比find更高 - 按名称找频道的正确写法:你原来的
client.channels.get("name", "频道名称")是v11的废弃写法,v12之后按属性查找统一用find,写法为client.channels.cache.find(c => c.name === '频道名称')
语音频道成员获取实现
前置准备
首先要在Discord开发者门户的机器人设置页,开启GuildVoiceStates、Guilds、GuildMembers三个特权网关意图,否则无法正常获取语音频道成员数据。
完整代码示例
// 从当前服务器获取指定ID的语音频道 const targetVoiceChannel = message.guild.channels.cache.get('替换为你的语音频道ID'); // 校验频道有效性:确认存在且是语音频道 if (!targetVoiceChannel || targetVoiceChannel.type !== 2) { return message.reply('未找到对应语音频道'); } // 获取频道内的所有成员,返回Collection集合 const voiceMembers = targetVoiceChannel.members; // 示例:遍历打印所有成员信息 voiceMembers.each(member => { console.log(`成员用户名:${member.user.tag},成员ID:${member.id}`); }); // 示例:提取所有成员ID的数组 const memberIdList = Array.from(voiceMembers.keys());
注意事项
- 如果目标语音频道是私有频道,需要确保机器人拥有该频道的「查看频道」「连接」权限,否则会获取不到成员列表
- 如果你用的是Discord.js v14,语音频道的type可以替换为枚举值
ChannelType.GuildVoice,需要提前从discord.js包引入该枚举
内容的提问来源于stack exchange,提问作者Artem Chiruhin
相关产品推荐
相关产品推荐

