Discord自定义欢迎消息及邀请统计机器人功能异常排查求助
解决Discord机器人邀请统计与欢迎消息错误问题
你这问题其实很好排查——你的代码里完全没去获取真正邀请新成员的用户,反而直接把新加入的成员member.name同时填在了“被邀请人”和“邀请人”的位置,可不就出现“Person1被Person1邀请”的乌龙嘛!
要实现正确的邀请追踪和统计,我们得借助Discord.py的邀请记录功能,步骤和修正后的代码如下:
核心思路
- 机器人启动时先缓存服务器所有邀请的使用次数
- 当有成员加入时,重新获取服务器邀请记录,对比缓存找到使用次数增加的那个邀请(也就是刚被用来邀请新成员的链接)
- 通过这个邀请记录拿到邀请人,再统计该邀请人的总邀请数
- 最后发送符合要求的欢迎消息
修正后的完整代码
# 先定义全局缓存,用来存储各服务器的邀请使用次数 bot.invite_cache = {} # 机器人启动时初始化邀请缓存(需要机器人有Manage Guild权限) @bot.event async def on_ready(): for guild in bot.guilds: try: invites = await guild.invites() bot.invite_cache[guild.id] = {inv.code: inv.uses for inv in invites} except discord.Forbidden: print(f"机器人在服务器 {guild.name} 没有获取邀请的权限,请授予Manage Guild权限!") # 处理成员加入事件 @bot.event async def on_member_join(member): welcome_channel_id = 881620025948135436 welcome_channel = member.guild.get_channel(welcome_channel_id) if not welcome_channel: print("指定的欢迎频道不存在!") return # 获取当前服务器的所有邀请记录 try: current_invites = await member.guild.invites() except discord.Forbidden: await welcome_channel.send(f"`{member.name}` 加入了服务器,但机器人没有权限获取邀请记录,无法追踪邀请人") # 发送私信部分 await member.send(embed=discord.Embed(title="欢迎加入!", description="很高兴你能来到我们服务器~")) return # 对比缓存和当前邀请,找到被使用的邀请链接 invite_used = None guild_cache = bot.invite_cache.get(member.guild.id, {}) for inv in current_invites: if guild_cache.get(inv.code, 0) < inv.uses: invite_used = inv # 更新缓存,确保下次统计准确 bot.invite_cache[member.guild.id][inv.code] = inv.uses break if invite_used and invite_used.inviter: inviter = invite_used.inviter # 统计该邀请人的总邀请数:累加其名下所有邀请的使用次数 total_invites = sum(inv.uses for inv in current_invites if inv.inviter == inviter) # 发送正确的欢迎消息 await welcome_channel.send(f"`{member.name}` 被 `{inviter.name}` 邀请,`{inviter.name}` 已有 **{total_invites}** 个邀请人数") else: # 处理无法追踪邀请人的情况(比如是服务器所有者直接添加、邀请链接过期等) await welcome_channel.send(f"`{member.name}` 加入了服务器,但无法追踪到邀请人") # 发送私信Embed(这里替换成你自己的Embed内容即可) welcome_embed = discord.Embed( title="欢迎加入服务器!", description="期待你的参与哦😉", color=discord.Color.blue() ) await member.send(embed=welcome_embed)
注意事项
- 必须给机器人授予**Manage Guild(管理服务器)**权限,否则无法获取邀请记录
- 如果服务器有大量邀请链接,缓存和对比的过程会很高效,不用担心性能问题
- 代码里处理了权限不足、找不到邀请人等异常情况,避免机器人崩溃
内容的提问来源于stack exchange,提问作者Maruf
相关产品推荐
相关产品推荐

