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
相关产品推荐
相关产品推荐

