You need to enable JavaScript to run this app. Discord.js 实现查询并发送服务器全部在线成员列表的命令开发问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:36:03