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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 13:45:08