You need to enable JavaScript to run this app. discord.py编辑消息snipe命令明明存在已编辑消息却提示无内容
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 03:06:09