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
相关产品推荐
相关产品推荐

