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

discord.js中如何获取未与bot共享guild的用户

discord.js 获取未与机器人共享任何服务器用户的实现方案

核心前提:Discord API 有严格的权限边界,机器人无法查询全平台任意用户信息,只能获取到和自身存在共同 guild、或主动触发过机器人交互/发送过私信的用户数据,不存在绕过该限制的合规方案。

实现逻辑

  • 开启必要权限:先到Discord开发者后台,为你的机器人开启Server Members Intent特权网关意图,discord.js v14及以上版本没有该权限无法拉取服务器完整成员列表。
  • 收集共服用户集合:遍历机器人加入的所有guild,拉取每个guild的全量成员,去重后得到所有和机器人存在共同服务器的用户ID集合。
  • 准备待检测用户池:待检测的用户ID只能来自你业务侧之前留存的数据(比如之前触发过机器人命令、发过私信的用户记录),API不支持无来源扫描全网用户。
  • 计算差集:待检测用户池中不在共服用户集合里的ID,就是你要找的目标用户。

可直接运行的参考代码(discord.js v14)

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMembers,
    // 按需补充你业务需要的其他意图
  ]
});

// 替换为你自己业务侧存储的待检测用户ID数组
const pendingCheckUserIds = ['123456789012345678', '876543210987654321'];

async function getUsersWithoutSharedGuild() {
  const sharedUserIds = new Set();
  // 遍历所有机器人加入的服务器
  for (const guild of client.guilds.cache.values()) {
    // 拉取当前服务器全量成员
    const memberList = await guild.members.fetch();
    memberList.forEach(member => {
      if (member.user.id !== client.user.id) sharedUserIds.add(member.user.id);
    });
  }
  // 过滤出没有共服的用户
  return pendingCheckUserIds.filter(userId => !sharedUserIds.has(userId));
}

client.on('ready', async () => {
  console.log(`机器人已登录:${client.user.tag}`);
  const targetUserIds = await getUsersWithoutSharedGuild();
  console.log('未与机器人共享任何服务器的用户ID列表:', targetUserIds);
});

client.login('你的机器人Token');

避坑提示

  • 拉取全量成员的接口有调用频率限制,如果你的机器人加入的服务器多、单服成员规模大,要在遍历guild拉成员的逻辑里加适当延迟,避免触发API限流导致请求被拦截。
  • 任何声称可以直接查询全Discord任意用户是否和你共服的方案都是违规的,要么涉及爬取Discord非公开接口,要么涉及滥用用户数据,会直接导致你的机器人账号被平台封禁。
  • 如果你没有提前留存过待检测的用户ID,这个功能无法实现,Discord从未开放过全平台用户列表的查询接口,没有取巧空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:22