Discord.py机器人触发🔄表情反应后原消息无法删除问题排查
问题原因
原消息无法删除的核心触发点如下:
- 执行顺序问题:现有代码先调用
rlgarage函数再执行删除操作,如果rlgarage执行过程中抛出异常,后续的删除逻辑会直接中断无法运行 - 无异常捕获:如果触发回调时原消息已经被其他逻辑/人工删除,
msg.delete()会抛出discord.NotFound异常,没有捕获的情况下会导致流程中断 - 权限缺失:机器人没有对应频道的「管理消息」权限,无法删除已发送的消息
修复代码
msg = await ctx.send(embed=embed) await msg.add_reaction("🔄") try: await bot.wait_for( "reaction_add", timeout=1000.0, check=lambda reaction, user: user == ctx.author and reaction.emoji == "🔄" and reaction.message == msg, ) except asyncio.TimeoutError: try: await msg.remove_reaction("🔄", bot.user) except discord.NotFound: pass else: # 先执行删除操作,避免后续逻辑出错导致残留 try: # 权限校验(可选,用于快速排查问题) if not ctx.channel.permissions_for(ctx.guild.me).manage_messages: raise PermissionError("缺少管理消息权限,无法删除原消息") await msg.delete() except (discord.NotFound, discord.Forbidden, PermissionError): # 消息已删除/无权限时直接跳过,不影响后续刷新逻辑 pass # 再执行刷新后的命令逻辑 await rlgarage(ctx, arg=arg)
关键修改说明
- 调整了执行顺序,将删除原消息的逻辑放到命令执行前,避免命令执行出错导致原消息留存
- 给删除逻辑增加了全场景异常捕获,兼容消息已提前删除、机器人无权限的场景,不会中断后续刷新逻辑
- 增加了可选的权限校验逻辑,便于开发时快速定位权限类问题
内容的提问来源于stack exchange,提问作者Pricysquirrl
相关产品推荐
相关产品推荐

