You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord.js V12 如何实现特定服务器的成员加入欢迎消息功能

解决Discord.js V12指定服务器成员加入欢迎消息问题

嘿,我之前帮刚入门的朋友实现过几乎一模一样的需求,给你一步步拆解,保证你能看懂:

第一步:确认机器人权限

首先得确保你的机器人在目标服务器里有这些权限,不然会出各种问题:

  • 管理服务器(用来获取邀请信息)
  • 查看成员
  • 发送消息(在指定频道发欢迎语)
  • 读取消息历史(可选,但能避免一些缓存异常)

第二步:核心代码实现

Discord.js V12里要实现这个,关键是提前缓存服务器邀请+监听成员加入事件,直接上代码,注释我写得超详细:

1. 机器人启动时缓存服务器邀请(必须!不然没法追踪邀请人)

// 在client的ready事件里添加这段代码
client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
  
  // 遍历机器人加入的所有服务器,缓存邀请列表
  client.guilds.cache.forEach(guild => {
    guild.fetchInvites()
      .then(invites => {
        // 把缓存存在client的自定义属性里,方便后续调用
        client.invites = client.invites || {};
        client.invites[guild.id] = invites;
      })
      .catch(err => console.error(`无法缓存服务器${guild.name}的邀请:`, err));
  });
});

2. 监听成员加入事件,发送格式化欢迎消息

client.on('guildMemberAdd', async (member) => {
  // 替换成你指定的服务器ID,只有这个服务器触发欢迎
  const TARGET_GUILD_ID = '你的服务器ID';
  // 替换成你要发消息的频道ID
  const WELCOME_CHANNEL_ID = '你的欢迎频道ID';

  // 先判断是不是目标服务器,不是的话直接跳过
  if (member.guild.id !== TARGET_GUILD_ID) return;

  try {
    // 获取当前服务器的最新邀请列表
    const newInvites = await member.guild.fetchInvites();
    // 取出之前缓存的邀请列表
    const oldInvites = client.invites[TARGET_GUILD_ID];

    // 对比新旧邀请,找到被使用的那个(使用次数增加的邀请)
    const usedInvite = newInvites.find(inv => oldInvites.get(inv.code).uses < inv.uses);

    // 更新缓存的邀请列表,保证下次判断是最新的
    client.invites[TARGET_GUILD_ID] = newInvites;

    // 获取指定的欢迎频道
    const welcomeChannel = member.guild.channels.cache.get(WELCOME_CHANNEL_ID);
    if (!welcomeChannel) {
      console.log('找不到指定的欢迎频道!');
      return;
    }

    // 构建欢迎消息,处理邀请人未知的情况(比如成员直接搜索加入)
    const inviterTag = usedInvite ? usedInvite.inviter.tag : 'Unknown';
    const welcomeMessage = `Welcome ${member.user.tag}\nInvited by: ${inviterTag}\nMember count: ${member.guild.memberCount}`;

    // 发送消息到指定频道
    welcomeChannel.send(welcomeMessage);
  } catch (err) {
    console.error('处理欢迎消息时出错:', err);
  }
});

第三步:关键注意事项

  • 记得把代码里的你的服务器ID你的欢迎频道ID替换成你自己的ID(右键服务器/频道,复制ID需要先开启Discord的开发者模式)
  • 如果成员是通过服务器发现直接加入(无邀请链接)或者机器人邀请的,usedInvite会是null,这时候我们默认显示"Unknown",你可以根据需求调整文案
  • 如果你机器人只在一个服务器里,那可以简化缓存邀请的代码,不用遍历所有服务器
  • 确保你的Discord.js版本确实是V12,用npm list discord.js可以查看版本,V13+的代码逻辑会不一样哦

内容的提问来源于stack exchange,提问作者Anna w.t

火山引擎 最新活动