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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:01:14