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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 15:36:02