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

Discord.py机器人多频道消息删除操作触发traceback报错求助

报错原因

你遇到的报错大概率为discord.NotFound异常,触发原因如下:

  • 加了(A)处的删除逻辑后,你没有对删除操作做异常捕获,同时高频的删除请求提升了「尝试删除已被其他逻辑/管理员手动操作清除的消息」的概率,只要目标消息已经不在Discord服务器上,调用await message.delete()就会直接抛出traceback。
  • 你直接对只读的message.content属性赋值修改,会导致Discord.py的Message对象内部状态异常,也是引发未知报错的隐性原因。
  • 809051707996110858频道的消息删除后没有做流程控制,后续代码仍会对这条已被删除的消息执行多余的属性读取、逻辑判断操作,也可能引发异步时序冲突。
修复方案

按以下逻辑修改代码即可解决问题:

  1. 事件开头先过滤机器人自身发送的消息,避免无效逻辑触发
  2. 用临时变量存储小写后的消息内容,不要修改原Message对象的只读属性
  3. 给所有删除操作加上异常捕获,处理消息不存在的场景
  4. 根据你的业务需求选择是否在删除8090频道消息后中断后续流程:如果需要8090频道内发送的ok消息也能触发角色授予,就不要加return;如果不需要就保留return减少多余逻辑执行。

修改后的参考代码:

@client.event
async def on_message(message):
    # 过滤机器人自己的消息
    if message.author.bot:
        return

    content_lower = message.content.lower()
    if message.channel.id == 809051707996110858:
        try:
            await message.delete()
        except discord.NotFound:
            pass
        # 如果不需要8090频道的消息触发后续加角色逻辑,就打开下面的return注释
        # return

    if content_lower == 'ok':
        member = message.author
        KING = discord.utils.get(member.guild.roles, id=794268294173294612)
        await member.add_roles(KING, atomic=True)

    if message.channel.id == 856111860931887104:
        if content_lower in codeword:
            try:
                await message.delete()
            except discord.NotFound:
                pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:18:03