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

