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

Discord自定义欢迎消息及邀请统计机器人功能异常排查求助

解决Discord机器人邀请统计与欢迎消息错误问题

你这问题其实很好排查——你的代码里完全没去获取真正邀请新成员的用户,反而直接把新加入的成员member.name同时填在了“被邀请人”和“邀请人”的位置,可不就出现“Person1被Person1邀请”的乌龙嘛!

要实现正确的邀请追踪和统计,我们得借助Discord.py的邀请记录功能,步骤和修正后的代码如下:

核心思路

  1. 机器人启动时先缓存服务器所有邀请的使用次数
  2. 当有成员加入时,重新获取服务器邀请记录,对比缓存找到使用次数增加的那个邀请(也就是刚被用来邀请新成员的链接)
  3. 通过这个邀请记录拿到邀请人,再统计该邀请人的总邀请数
  4. 最后发送符合要求的欢迎消息

修正后的完整代码

# 先定义全局缓存,用来存储各服务器的邀请使用次数
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:17:59