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

Discord.py中多个on_message事件无法触发的原因及解决方法

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

嘿,这个问题我之前折腾Discord机器人的时候也碰到过!原因其实很简单——Discord.py里用@client.event注册同一个事件(比如on_message)的时候,后面的注册会直接覆盖掉前面的,所以最后只有最后一个on_message会被触发。下面给你几种可行的解决办法:

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

这是最直接的方式,把三个事件里的代码整合到一个函数中:

import discord
client = discord.Client()

@client.event
async def on_ready():
    print('in on_ready')

@client.event
async def on_message(message):
    print("in on_message #1")
    print("in on_message #2")
    print("in on_message #3")

client.run("TOKEN")

如果你的逻辑比较复杂,也可以拆成单独的函数,然后在on_message里依次调用:

import discord
client = discord.Client()

async def handle_msg_1(message):
    print("in on_message #1")

async def handle_msg_2(message):
    print("in on_message #2")

async def handle_msg_3(message):
    print("in on_message #3")

@client.event
async def on_ready():
    print('in on_ready')

@client.event
async def on_message(message):
    await handle_msg_1(message)
    await handle_msg_2(message)
    await handle_msg_3(message)

client.run("TOKEN")

方法2:使用@client.listen()装饰器

Discord.py提供了@client.listen()装饰器,它和@client.event不同——多次注册同一个事件时,不会覆盖,而是会按注册顺序依次触发所有监听器。修改后的代码如下:

import discord
client = discord.Client()

@client.event
async def on_ready():
    print('in on_ready')

@client.listen()
async def on_message(message):
    print("in on_message #1")

@client.listen()
async def on_message(message):
    print("in on_message #2")

@client.listen()
async def on_message(message):
    print("in on_message #3")

client.run("TOKEN")

这样当你发送消息时,三个print都会依次输出。

方法3:手动调用client.add_listener()注册事件

你也可以不用装饰器,手动调用add_listener方法来注册每个事件处理函数,效果和@client.listen()一样:

import discord
client = discord.Client()

async def on_message_1(message):
    print("in on_message #1")

async def on_message_2(message):
    print("in on_message #2")

async def on_message_3(message):
    print("in on_message #3")

@client.event
async def on_ready():
    print('in on_ready')

# 注册监听器
client.add_listener(on_message_1, 'on_message')
client.add_listener(on_message_2, 'on_message')
client.add_listener(on_message_3, 'on_message')

client.run("TOKEN")

小提示

如果你使用的是commands.Bot(而不是discord.Client),在处理on_message时别忘了加上await bot.process_commands(message),否则你的命令可能无法正常触发哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:52:38