Discord.js 实现查询并发送服务器全部在线成员列表的命令开发问题
Discord.js 在线成员查询命令实现方案(基于v14版本)
前置准备
- 前往Discord开发者平台的机器人管理页,在「Privileged Gateway Intents」板块下开启Presence Intent和Server Members Intent两个特权网关意图,否则无法获取成员状态和完整成员列表
- 邀请机器人进服时,确保授予机器人查看服务器成员权限
基础代码实现
客户端初始化配置
首先要在客户端初始化时声明必要的网关意图:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 必需:基础服务器访问权限 GatewayIntentBits.GuildMembers, // 必需:拉取成员列表 GatewayIntentBits.GuildPresences, // 必需:获取成员在线状态 // 如果使用前缀命令而非斜杠命令,额外添加以下两个意图 GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] });
斜杠命令处理逻辑
以下是斜杠命令/online-members的处理代码:
client.on('interactionCreate', async interaction => { // 只处理聊天输入类斜杠命令 if (!interaction.isChatInputCommand()) return; if (interaction.commandName !== 'online-members') return; // 校验触发场景 if (!interaction.inGuild()) { return interaction.reply({ content: '该命令仅可在服务器内使用', ephemeral: true }); } // 校验机器人权限 if (!interaction.guild.members.me.permissions.has('ViewGuildMembers')) { return interaction.reply({ content: '我缺少查看服务器成员的权限,请联系管理员调整权限配置', ephemeral: true }); } try { // 拉取全量成员列表,避免本地缓存不全导致数据不准 const allGuildMembers = await interaction.guild.members.fetch(); // 过滤在线成员:排除离线用户+排除机器人,可根据需求调整过滤规则 const onlineMembers = allGuildMembers.filter(member => { return member.presence?.status !== 'offline' && !member.user.bot; }); // 格式化返回消息 const memberListText = onlineMembers.map(m => `- ${m.user.tag}`).join('\n'); const finalReply = `当前服务器在线非机器人成员共 ${onlineMembers.size} 人:\n${memberListText}`; // Discord单条消息最长2000字符,超出的话做特殊处理 if (finalReply.length > 2000) { return interaction.reply(`当前在线成员共${onlineMembers.size}人,人数过多无法一次性展示`); } await interaction.reply(finalReply); } catch (error) { console.error('拉取在线成员失败:', error); return interaction.reply({ content: '拉取在线成员列表失败,请稍后重试', ephemeral: true }); } });
自定义调整说明
- 如果要包含机器人在统计列表中,删掉过滤条件里的
&& !member.user.bot即可 - 如果仅需要统计状态为「在线」的成员,排除空闲、请勿打扰状态,把过滤条件的
member.presence?.status !== 'offline'改为member.presence?.status === 'online'即可 - 如果你使用前缀命令而非斜杠命令,只需要把触发逻辑从
interactionCreate事件替换为messageCreate事件的前缀匹配逻辑即可,核心的成员拉取、过滤逻辑完全一致
内容的提问来源于stack exchange,提问作者Uriyah Liberman
相关产品推荐
相关产品推荐

