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

Discord.js开发邀请日志工具时如何查询新成员的邀请人

实现逻辑说明

Discord 原生的 guildMemberAdd 事件不会直接返回邀请人信息,你需要通过缓存邀请使用次数对比的方式实现获取邀请人功能,具体实现步骤如下:

前置要求

  • 开启机器人的 Server Members Intent(在 Discord 开发者后台的机器人设置页开启)
  • 给机器人授予 Manage Guild 权限,否则无法拉取服务器的邀请列表

完整实现代码

首先初始化全局缓存存储邀请数据:

// 全局缓存,结构为 Map<guildId, Map<inviteCode, useCount>>
const invites = new Map();

在机器人 ready 事件中预加载所有服务器的邀请数据:

client.on('ready', async () => {
  // 遍历机器人加入的所有服务器
  for (const guild of client.guilds.cache.values()) {
    try {
      // 拉取服务器所有邀请
      const guildInvites = await guild.invites.fetch();
      // 存入缓存
      invites.set(guild.id, new Map(guildInvites.map(invite => [invite.code, invite.uses])));
    } catch (err) {
      // 无权限拉取邀请的服务器跳过
      console.log(`无法拉取服务器 ${guild.name} 的邀请列表:`, err);
    }
  }
  console.log('机器人启动完成,邀请缓存已初始化');
});

监听邀请新增、删除事件,实时更新缓存:

// 有新邀请创建时更新缓存
client.on('inviteCreate', async (invite) => {
  const guildInvites = invites.get(invite.guild.id) || new Map();
  guildInvites.set(invite.code, invite.uses);
  invites.set(invite.guild.id, guildInvites);
});

// 有邀请被删除时更新缓存
client.on('inviteDelete', async (invite) => {
  const guildInvites = invites.get(invite.guild.id);
  if (guildInvites) {
    guildInvites.delete(invite.code);
    invites.set(invite.guild.id, guildInvites);
  }
});

修改你的 guildMemberAdd 事件逻辑,对比缓存找到使用的邀请:

client.on('guildMemberAdd', async (member) => {
  const channel = member.guild.channels.cache.get('CHANNEL_ID');
  if (!channel) return;

  try {
    // 拉取当前服务器最新的邀请列表
    const newInvites = await member.guild.invites.fetch();
    // 取缓存里的旧邀请数据
    const oldInvites = invites.get(member.guild.id);
    // 找到使用次数+1的邀请
    const usedInvite = newInvites.find(invite => oldInvites?.get(invite.code) === invite.uses - 1);

    // 更新缓存
    invites.set(member.guild.id, new Map(newInvites.map(invite => [invite.code, invite.uses])));

    let inviteInfo = '未知邀请链接';
    if (usedInvite) {
      if (usedInvite.inviter) {
        inviteInfo = `${usedInvite.inviter.tag} (邀请码:${usedInvite.code})`;
      } else {
        inviteInfo = `服务器自定义 vanity 链接 (${usedInvite.code})`;
      }
    }

    channel.send(`欢迎 ${member.user.tag} ,邀请人:${inviteInfo}`);
  } catch (err) {
    console.log('获取邀请信息失败:', err);
    channel.send(`欢迎 ${member.user.tag} ,未查询到邀请人信息`);
  }
});

异常场景说明

  • 如果新成员是通过服务器发现页、或者过期一次性邀请加入,可能无法匹配到邀请记录
  • 如果机器人没有 Manage Guild 权限,会拉取邀请列表失败,需要提前授权

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 07:06:07