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

如何实现多个Discord.py on_message事件同时生效?

解决Discord.py多个on_message事件仅最后一个生效的问题

这是个很常见的Discord.py新手坑——我来给你理清问题根源和解决办法:

问题根源

在Discord.py中,当你多次用@client.event装饰on_message函数时,每一次定义都会覆盖之前注册的事件处理函数。客户端只会保留最后一个被注册的on_message逻辑,这就是为什么你现在只有test对应的回复能正常工作。

解决方案

这里有两种靠谱的解决思路,你可以根据代码复杂度选择:

方案1:合并所有逻辑到同一个on_message函数

这是最直接的方式,把所有消息触发的逻辑都放到同一个on_message里,依次检查条件即可:

@client.event
async def on_message(message):
    # 处理"hey"触发的回复
    if message.content.startswith("hey"):
        await message.reply('こんにちは', mention_author=True)
    # 处理"test"触发的回复
    if message.content.startswith("test"):
        await message.reply('123', mention_author=True)
    # 必须保留这一行,确保bot的命令系统正常运行
    await client.process_commands(message)

方案2:使用add_listener注册多个独立的监听器

如果你的逻辑越来越复杂,想拆分到不同函数里保持整洁,可以用client.add_listener()方法注册多个消息处理函数:

# 单独处理"hey"的函数
async def handle_hey_message(message):
    if message.content.startswith("hey"):
        await message.reply('こんにちは', mention_author=True)

# 单独处理"test"的函数
async def handle_test_message(message):
    if message.content.startswith("test"):
        await message.reply('123', mention_author=True)

# 把两个函数注册为on_message事件的监听器
client.add_listener(handle_hey_message, "on_message")
client.add_listener(handle_test_message, "on_message")

# 别忘了保留一个on_message来处理命令(也可以把process_commands放到任意一个监听器里)
@client.event
async def on_message(message):
    await client.process_commands(message)

重要提醒

不管用哪种方案,必须确保await client.process_commands(message)被调用——这行代码是让bot的命令系统(比如用@client.command()定义的命令)正常工作的关键,千万别漏掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:57:46