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

Disnake/DiscordPy中on_presence_update等事件重复触发的原因及解决方法

on_presence_update事件重复触发的原因与解决方法

原因分析

  1. 事件装饰器使用错误:你写的@bot.event()带了括号,这会导致事件被重复注册。bot.event是装饰器函数,正确用法是不带括号直接使用@bot.event,带括号调用会生成额外的装饰器实例,最终让同一个事件被绑定多次,触发时就会执行多次。
  2. Discord网关重复推送(次要):少数情况下Discord网关可能重复发送状态更新数据包,但你提到其他事件也有重复触发问题,所以核心原因大概率是装饰器写法错误导致的重复注册。

解决方法

1. 修正装饰器写法

直接去掉bot.event后的括号,这是最直接的修复方式:

@bot.event
async def on_presence_update(before, after):
    print('test')

2. 增加状态变更判断

即使事件注册正确,也可以在逻辑里加判断,只在状态确实变化时执行代码,过滤重复推送:

@bot.event
async def on_presence_update(before, after):
    # 检查在线状态或用户活动是否真的发生变化
    if before.status != after.status or before.activities != after.activities:
        print('状态已更新')

3. 类继承Bot的注意事项

如果是通过继承commands.Bot实现机器人,不要同时用装饰器和类内重写事件方法,避免重复绑定。类内事件的正确写法:

class MyBot(commands.Bot):
    async def on_presence_update(self, before, after):
        if before.status != after.status or before.activities != after.activities:
            print('状态已更新')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:29:55