discord.py编辑消息snipe命令明明存在已编辑消息却提示无内容
故障定位与修正方案
导致命令一直返回无编辑消息的核心原因
代码里的编辑消息事件监听方法拼写错误,完全无法被discord.py框架识别触发:
- 错误的方法名写法:
on_messge_edit,这里message单词漏写了字母s - 框架内置的编辑消息监听事件固定名称为
on_message_edit,只有方法名和事件名完全匹配,对应的监听逻辑才会被注册运行
因为这个拼写错误,on_messge_edit从来不会被触发,用来缓存编辑消息的edit_sniped_messages字典一直是空的,执行editsnipe命令时,取对应频道的缓存键必然抛出异常,直接走到except分支返回固定提示。
同步需要修正的潜在隐患
- 增加场景判断:编辑的消息如果来自私聊(没有服务器对象),直接读取
before.guild.id会触发属性错误导致监听崩溃,需要在写入缓存前判断before.guild是否为空,跳过非服务器场景的编辑事件。 - 过滤无效编辑:Discord会对部分没有修改正文的编辑事件做推送(比如自动更新链接预览、消息添加反应),这类场景下
before.content和after.content完全一致,不需要写入缓存,避免无意义覆盖存储值。 - 避免裸except:当前代码用无参数的except捕获所有异常,后续出现其他故障时完全没法定位问题,建议只捕获键不存在的
KeyError,其他异常正常抛出方便调试。 - 适配版本API:如果使用discord.py 2.0及以上版本,用户对象的头像属性已经从
avatar_url调整为avatar.url,旧属性会直接抛出异常,导致嵌入消息生成失败,最终走到异常分支返回无消息的提示。
修正后的核心代码
@commands.Cog.listener() async def on_message_edit(self, before, after): # 跳过机器人消息、跳过私聊场景 if before.author.bot or before.guild is None: return # 跳过正文无变化的无效编辑 if before.content == after.content: return self.client.edit_sniped_messages[(before.guild.id, before.channel.id)] = ( before.content, after.content, before.author, before.channel.name )
内容的提问来源于stack exchange,提问作者Mohd osama
相关产品推荐
相关产品推荐

