Discord.py机器人多频道消息删除操作触发traceback报错求助
报错原因
你遇到的报错大概率为discord.NotFound异常,触发原因如下:
- 加了(A)处的删除逻辑后,你没有对删除操作做异常捕获,同时高频的删除请求提升了「尝试删除已被其他逻辑/管理员手动操作清除的消息」的概率,只要目标消息已经不在Discord服务器上,调用
await message.delete()就会直接抛出traceback。 - 你直接对只读的
message.content属性赋值修改,会导致Discord.py的Message对象内部状态异常,也是引发未知报错的隐性原因。 - 809051707996110858频道的消息删除后没有做流程控制,后续代码仍会对这条已被删除的消息执行多余的属性读取、逻辑判断操作,也可能引发异步时序冲突。
修复方案
按以下逻辑修改代码即可解决问题:
- 事件开头先过滤机器人自身发送的消息,避免无效逻辑触发
- 用临时变量存储小写后的消息内容,不要修改原Message对象的只读属性
- 给所有删除操作加上异常捕获,处理消息不存在的场景
- 根据你的业务需求选择是否在删除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
相关产品推荐
相关产品推荐

