Discord.js v13如何通过频道ID获取语音频道的用户数量?
Discord.js v13 获取指定ID语音频道内用户数量
你原有代码存在几个会导致运行失败/数据不准的问题,以下是可直接落地的实现方案。
前置必要配置
v13版本必须开通对应网关意图才能拿到语音频道成员数据,初始化Client时要加入以下配置,同时需要去Discord开发者后台的Bot设置页,打开GUILD_VOICE_STATES对应的特权开关:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_VOICE_STATES, // 核心必填,负责同步语音状态数据 // 不需要拿成员完整信息的话不用开GUILD_MEMBERS,避免申请权限白名单的麻烦 ] });
修正后的实现代码
/** * 查询语音频道在线人数 * @param {string} guildId 语音频道所属服务器ID * @param {string} channelId 目标语音频道ID * @returns {number} 频道内人数,查询异常时返回-1 */ async function getVoiceChannelUserCount(guildId, channelId) { try { // 优先读缓存,缓存不存在则主动拉取最新数据 const targetGuild = client.guilds.cache.get(guildId) ?? await client.guilds.fetch(guildId); const targetChannel = targetGuild.channels.cache.get(channelId) ?? await targetGuild.channels.fetch(channelId); // 校验频道类型,避免传入文字频道/分类频道导致读members报错 if (!targetChannel || targetChannel.type !== 'GUILD_VOICE') { console.error('传入的频道ID不是有效的语音频道'); return -1; } const userCount = targetChannel.members.size; console.log(`当前语音频道人数:${userCount}`); return userCount; } catch (err) { console.error('查询语音频道人数失败:', err); return -1; } } // 调用示例:替换成你自己的服务器ID和频道ID getVoiceChannelUserCount('1234567890', '0987654321');
常见问题说明
- 不要直接使用
Client类访问缓存,必须传入你执行了login方法的bot实例,类本身不存储任何服务器、频道数据。 - 原有代码里写死的
.get('guildId')要替换成真实的服务器ID,不能直接用占位符字符串。 - 如果返回人数始终为0,优先检查两点:一是
GUILD_VOICE_STATES意图是否在代码和开发者后台都开启了,二是bot本身是否在目标服务器内、有没有查看对应频道的权限。 - v13版本不需要遍历全服成员匹配语音状态,直接读
VoiceChannel.members集合的size属性是性能最优的写法。
内容的提问来源于stack exchange,提问作者xCesir
相关产品推荐
相关产品推荐

