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

如何实现Discord机器人检测自定义表情反应者并修复超时问题?

问题解决:Discord机器人反应检测超时与功能实现

原代码问题分析

你使用了同步的waiting.wait库,这会阻塞Discord的事件循环,导致on_raw_reaction_add事件完全无法被触发处理——机器人卡在等待循环里,根本接收不到用户的反应,最终必然超时。

正确实现方案

改用discord.py内置的异步wait_for方法,它不会阻塞事件循环,能正常接收反应事件;同时直接实现自动添加表情、反应检测、消息删除和通知功能,无需依赖全局变量。

完整修正代码

import asyncio
import discord

# 自定义表情的ID,替换成你实际的表情ID
GREEN_BUTTON_EMOJI_ID = 1123299037236433027

@client.event
async def on_message(message):
    # 假设这里是你的命令触发逻辑,比如判断特定命令关键词
    if message.content.startswith("!trigger_button"):
        # 替换成你实际的频道ID
        target_channel = client.get_channel(你的按钮频道ID)
        notify_channel = client.get_channel(你的通知频道ID)
        timeout_seconds = 15

        # 1. 获取正确的自定义表情
        green_emoji = discord.utils.get(client.emojis, id=GREEN_BUTTON_EMOJI_ID)
        if not green_emoji:
            await target_channel.send("错误:找不到指定的自定义表情!")
            return

        # 2. 发送按钮消息并自动添加表情
        button_msg = await target_channel.send(
            f"**Button:** {green_emoji}",
            delete_after=timeout_seconds  # 超时自动删除消息
        )
        await button_msg.add_reaction(green_emoji)  # 机器人给自己的消息加表情,方便用户点击

        # 3. 定义反应检查条件:匹配目标消息、正确表情、排除机器人自身
        def check(reaction, user):
            return (
                reaction.message.id == button_msg.id
                and reaction.emoji == green_emoji
                and not user.bot
            )

        try:
            # 4. 异步等待用户反应,超时时间设为15秒
            reaction, user = await client.wait_for("reaction_add", timeout=timeout_seconds, check=check)
            
            # 5. 有人正确反应:立即删除按钮消息(可选,delete_after会自动删,这里提前删更及时)
            await button_msg.delete()
            
            # 6. 发送成功通知
            await target_channel.send(f"Button redeemed by {user.mention}")
            await notify_channel.send(f"**Button redeemed by {user.mention}**")
        
        except asyncio.TimeoutError:
            # 超时:消息已通过delete_after自动删除,无需额外操作
            pass

关键细节说明

  • 自动添加表情:通过await button_msg.add_reaction(green_emoji)直接给刚发送的消息添加指定表情,用户可直接点击反应。
  • 反应检测过滤:check函数确保只处理目标消息、正确表情的用户反应,排除机器人自身的操作,避免误判。
  • 异步等待机制:client.wait_for是异步方法,不会阻塞事件循环,机器人能正常接收其他事件,不会出现超时无法检测反应的问题。
  • 超时处理:捕获asyncio.TimeoutError,此时消息已通过delete_after参数自动删除,无需额外操作。

原代码冗余问题修正

  • 移除了冗余的全局变量:wait_for可直接返回反应和用户对象,无需用全局变量传递状态。
  • 表情获取更可靠:通过ID获取自定义表情比名字更准确,避免重名表情冲突。
  • 逻辑更简洁:将所有相关逻辑整合到命令触发流程中,无需拆分到多个事件函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:45:17