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

Discord.py中能否在机器人被封禁离开服务器前打印封禁者信息?

获取Discord机器人被封禁时的封禁者信息:可行且有解决方法

这个需求完全可行,你的问题出在审核日志的获取逻辑上——原代码不仅判断条件有误,还没有精准定位到机器人被封禁的那条日志,加上机器人被封禁后会快速失去公会权限,导致还没拿到日志就无法操作。

修正后的代码实现

async def report(message):
    # 注意:CHANNEL_LISTEN_ID要设为机器人常驻服务器的频道ID,不是被封禁的公会频道
    channel = bot.get_channel(CHANNEL_LISTEN_ID)
    await channel.send(message)

@bot.event
async def on_member_ban(guild, member):
    if member.id == bot.user.id:
        try:
            # 只获取最近的封禁操作日志,限定数量提高速度
            async for entry in guild.audit_logs(action=discord.AuditLogAction.ban, limit=10):
                # 匹配被封禁的成员是机器人自己的日志
                if entry.target.id == bot.user.id:
                    await report(f'HEELLPPPP! <@{entry.user.id}> IS BANNING ME, DAMN IT!')
                    break
        except discord.Forbidden:
            # 如果没有查看审核日志的权限,发送兜底消息
            await report('HEELLPPPP! SOMEONE IS BANNING ME, BUT I CAN\'T SEE WHO!')
        except Exception as e:
            await report(f'HEELLPPPP! I GOT BANNED, BUT SOMETHING WENT WRONG: {str(e)}')
    else:
        await report('<:pepecop:1114663204971360316>')

关键注意事项

  • 权限要求:机器人必须在被封禁的公会中拥有查看审核日志(View Audit Log)权限,否则无法获取封禁者信息。
  • 报告频道选择:CHANNEL_LISTEN_ID一定要是机器人不会被移除的服务器频道(比如你自己的私人服务器),不然机器人被封禁后连报告消息都发不出去。
  • 日志筛选逻辑:通过action=discord.AuditLogAction.ban直接过滤封禁操作,再遍历最近的10条日志找目标为机器人的条目,比原代码的find方法更高效且精准,能在权限失效前完成查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:22:48