Discord.js 如何通过用户ID校验服务器内成员是否在id_blacklist数组中
轮询式黑名单校验核心实现
以下逻辑完全兼容你现有的定时轮询代码结构,可直接嵌入使用:
// 替换为你实际的目标服务器ID、已初始化的Discord.Client实例 const TARGET_GUILD_ID = "你的防护服务器ID"; const bot = /* 填入你项目里已有的机器人客户端实例 */ // 提前将黑名单转为Set结构,匹配效率远高于数组includes const id_blacklist = new Set(["some","user","id-s"]); setInterval(async () => { await checkUsers() }, 5000); async function checkUsers(){ // 获取目标服务器实例,未命中缓存直接跳过本轮校验 const targetGuild = bot.guilds.cache.get(TARGET_GUILD_ID); if (!targetGuild) return; try { // 强制从Discord API拉取实时成员列表,不使用本地滞后缓存 const guildMembers = await targetGuild.members.fetch({ force: true, withPresences: false // 关闭无关字段拉取,降低请求开销 }); // 逐成员匹配黑名单 for (const [memberId, member] of guildMembers) { if (id_blacklist.has(memberId)) { // 命中后的处理逻辑可自定义,示例为直接封禁 console.log(`检测到黑名单用户 ${member.user.tag},ID:${memberId}`); await member.ban({ reason: "存在历史破坏服务器的违规记录" }); } } } catch (err) { // 捕获权限不足、API限频等异常,避免轮询任务直接崩溃 console.error("黑名单轮询校验失败:", err.message); } }
关键注意事项
- 你遇到的
guildMemberAdd事件无法触发的问题,绝大多数是没有在Discord开发者后台为机器人开启Server Members Intent特权网关权限;开启后原生事件会正常触发,本次实现的轮询仅作为兜底方案,不能完全替代事件的实时检测能力。 - 性能优化细节:长黑名单场景下不要用普通数组存储ID,转成Set结构后单次匹配的时间复杂度为O(1),避免每5秒一次的循环遍历带来不必要的性能损耗。
- 权限前置要求:机器人必须在目标服务器拥有封禁/踢出成员的操作权限,且自身角色层级高于需要处理的黑名单用户,否则操作会被Discord拒绝。
- 限频适配:如果服务器成员规模超过1000人,可适当拉长轮询间隔到15-30秒,避免高频拉取成员列表触发Discord API的速率限制。
内容的提问来源于stack exchange,提问作者Wolfyxon
相关产品推荐
相关产品推荐

