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




