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

discord.py框架on_message事件运行命令及ctx使用相关问题咨询

discord.py开发问题解答

1. 是否可以在on_message()事件中使用ctx参数?

on_message()事件默认仅接收message作为入参,没有内置的ctx参数。如果需要使用ctx,可以调用bot实例的get_context()方法,从message对象手动生成ctx实例,生成后的ctx和命令函数中传入的ctx功能完全一致。
示例代码:

async def on_message(self, message):
    # 手动生成ctx
    ctx = await self.get_context(message)

2. 若无法直接使用ctx,是否可以让自定义命令在on_message事件中正常运行?

可以,有两种常用实现方式:

方式一:触发内置命令处理逻辑

如果是用@commands.command装饰器注册的标准命令,只需要在on_message自定义逻辑的末尾调用await self.process_commands(message),所有符合前缀规则的命令就会自动触发运行。
*注意:重写on_message事件后如果不调用process_commands,所有注册的标准命令都会默认失效。
示例代码:

async def on_message(self, message):
    # 你的自定义on_message逻辑
    if message.author.bot:
        return
    
    # 触发命令处理
    await self.process_commands(message)

方式二:手动调用自定义方法

针对你示例中的自定义类方法a(),可以在手动生成ctx后直接传入调用即可,适配你给出的代码结构的完整写法如下:

# func.py
class Function: # 类定义括号内为父类,不需要传self
    async def a(self, ctx):
        # 你的方法逻辑
        await ctx.send("调用成功")


# bot.py
from discord.ext import commands
class Bot(commands.Bot):
    def __init__(self, *args, **kwargs):
        super().__init__(command_prefix="!", *args, **kwargs)
        self.func = Function() # 初始化自定义功能类实例
    
    async def on_message(self, message):
        if message.author.bot:
            return
        # 生成ctx
        ctx = await self.get_context(message)
        # 调用自定义方法
        await self.func.a(ctx)
        
        # 如果还要运行标准命令,保留这行
        await self.process_commands(message)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:54:09