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

Discord.py 垃圾桶表情反应仅删除最新对应消息问题排查

Discord 机器人🗑️表情删消息功能故障修复

问题根源

现有代码的reaction_add事件校验逻辑存在遗漏:

  • 原有check方法仅判断了「触发反应的用户是消息发送者」「表情为🗑️」两个条件,完全没有校验反应所属的消息对象
  • 每收到一条用户发送的非机器人消息,on_message事件就会生成一个独立的反应监听,所有监听都使用这套宽松的校验规则。只要用户对任意一条消息添加🗑️反应,所有处于等待状态的监听都会被同时触发,批量删除所有关联的原消息和积分提示消息,最终导致多删消息的问题。

修复后完整代码

@client.event
async def on_message(message):
    if not message.author.bot:
        embed = discord.Embed(title="Points earned!", description="+1 Points")
        points_msg = await message.channel.send(embed=embed)
        await message.add_reaction("🗑️")

        def check(reaction, user):
            return (
                user == message.author
                and str(reaction.emoji) == "🗑️"
                and reaction.message.id == message.id  # 核心修复:绑定当前消息ID
            )

        try:
            # 可按需调整超时时间,单位为秒,示例为5分钟后自动取消监听
            await client.wait_for("reaction_add", timeout=300, check=check)
        except asyncio.TimeoutError:
            # 超时后直接清除消息上的垃圾桶反应,无需发送冗余提示
            await message.clear_reaction("🗑️")
        else:
            await points_msg.delete()
            await message.delete()

关键修改点

  • 在校验逻辑中新增reaction.message.id == message.id判断,确保每个监听只会响应绑定消息上的表情反应,不会被其他消息的操作触发
  • 给wait_for添加合理的超时参数,避免无期限驻留的监听占用系统资源
  • 移除原超时逻辑中无意义的提示消息,超时后直接清除未被使用的垃圾桶反应,交互逻辑更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:09:20