Discord.py自动审核提及触发用户时报ctx未定义NameError,如何解决?
Discord自动审核功能ctx未定义报错修复方案
报错根源
on_message是Discord.py的原生事件监听回调,仅会传入message对象作为参数,不存在自动注入的ctx(命令上下文)对象。代码中直接引用ctx.author、ctx.send()这类属于命令上下文的属性/方法,自然会触发NameError: name 'ctx' is not defined的报错。
正确修复方式
不需要在这个事件里强行定义ctx,直接复用事件回调已经拿到的message对象替换所有ctx引用即可:
- 将
ctx.author.name替换为message.author.name,即可直接获取触发违规的用户昵称 - 将
await ctx.send(embed=embed)替换为await message.channel.send(embed=embed),即可在违规消息所在的频道发送提醒embed
修正后的完整代码
async def on_message(message): # 跳过机器人自身发送的消息,避免触发逻辑循环 if message.author.id == bot.user.id: return msg_content = message.content.lower() curseWord = [替换为你实际配置的违规词列表] # 优先处理指令触发逻辑,避免违规词拦截阻断正常指令执行 await bot.process_commands(message) if any(word in msg_content for word in curseWord): # 删除违规消息 await message.delete() embed = discord.Embed( title="违规用语提示", description=f"嘿 {message.author.name},本频道不允许使用这类词汇!", color=0x00FFFF ) # 在当前频道发送提醒 await message.channel.send(embed=embed)
避坑提示
ctx对象仅对通过@bot.command()装饰的自定义命令函数有效,这类命令的回调参数会自动注入ctx;纯事件回调(如on_message、on_reaction_add)的参数由事件本身决定,不会自带ctx,强行引用必然报错。- 原代码中定义的
author = message.author.id变量全程未被使用,属于冗余代码,可以直接删除。 - 不建议将
bot.process_commands()放在违规判断的else分支里,否则如果用户发送的消息同时包含违规词和指令内容,会导致指令无法正常执行。
内容的提问来源于stack exchange,提问作者ColeTMK
相关产品推荐
相关产品推荐

