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

Discord.js v14如何通过公会ID获取成员数量?

使用Discord.js v14获取公会成员数并显示在语音频道

一、解决成员缓存与数量获取问题

Discord.js v14默认不会缓存所有公会成员,这是你缓存失败的核心原因,需从权限配置和代码逻辑两方面调整:

1. 开启必要网关意图

  • 前往Discord开发者门户的机器人页面,勾选Server Members Intent权限
  • 初始化客户端时声明所需意图:
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMembers // 必须开启此意图才能拉取成员数据
  ]
});

2. 获取准确成员数量

有两种方案适配不同场景:

  • 精确统计(适合小公会):强制拉取所有成员到缓存后获取数量,注意大公会可能触发速率限制:
async function getExactMemberCount(guildId) {
  const guild = client.guilds.cache.get(guildId);
  if (!guild) return 0;
  await guild.members.fetch(); // 拉取所有成员至缓存
  return guild.memberCount;
}
  • 近似统计(适合大公会):使用Discord提供的近似值,无需缓存所有成员,无速率限制:
function getApproxMemberCount(guildId) {
  const guild = client.guilds.cache.get(guildId);
  return guild?.approximateMemberCount || 0;
}

二、创建并更新统计语音频道

通过创建不可加入的语音频道,定期更新频道名称展示成员数:

1. 初始化统计频道(首次运行)

async function createStatsChannel(guildId) {
  const guild = client.guilds.cache.get(guildId);
  if (!guild) return;

  const statsChannel = await guild.channels.create({
    name: `总成员数: 0`,
    type: 2, // 指定为语音频道类型
    permissionOverwrites: [
      {
        id: guild.roles.everyone,
        deny: ['Connect'] // 禁止普通成员加入频道
      }
    ]
  });

  console.log(`统计频道创建完成,ID: ${statsChannel.id}`);
  return statsChannel.id;
}

2. 定期更新频道名称

设置定时任务,周期性刷新成员数并更新频道名称:

async function updateStatsChannel(guildId, channelId) {
  const guild = client.guilds.cache.get(guildId);
  const statsChannel = guild?.channels.cache.get(channelId);
  if (!statsChannel) return;

  // 选择精确或近似统计方式
  const memberCount = await getExactMemberCount(guildId);
  // const memberCount = getApproxMemberCount(guildId);

  await statsChannel.setName(`总成员数: ${memberCount}`);
}

// 每5分钟更新一次(可按需调整间隔)
setInterval(() => {
  updateStatsChannel('你的公会ID', '统计频道ID');
}, 5 * 60 * 1000);

关键注意事项

  • 确保机器人拥有ManageChannels权限,才能创建和修改频道名称
  • 大公会优先使用approximateMemberCount,避免触发Discord速率限制
  • 多公会场景下,需为每个公会单独存储对应的统计频道ID

内容的提问来源于stack exchange,提问作者Atom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:15:59