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

如何在discord.py中实现特定用户特定消息的指定反应触发逻辑?

我来帮你搞定这个需求!在discord.py里实现这个功能,核心是把命令处理和反应监听事件结合起来,同时精准匹配触发条件——只有提交建议的用户对那条确认消息添加指定表情时,才执行后续的发送操作。下面是具体的实现思路和可直接复用的代码:

实现步骤

1. 基础配置与命令初始化

首先要确保机器人开启了必要的权限意图(intents),然后编写suggest命令,发送确认消息并临时存储关键信息(比如提交用户ID、建议内容、确认消息ID),方便后续反应事件匹配。

import discord
from discord.ext import commands

# 开启必要的意图:消息内容、反应监听
intents = discord.Intents.default()
intents.message_content = True
intents.reactions = True

# 初始化机器人,替换成你的命令前缀
bot = commands.Bot(command_prefix="!", intents=intents)

# 临时存储待确认的建议:键为确认消息ID,值为用户ID和建议内容
pending_suggestions = {}
# 预设的确认表情(可以换成你想要的表情)
CONFIRM_EMOJI = "✅"
# 替换成你指定的建议接收频道ID
SUGGESTION_CHANNEL_ID = 123456789012345678

@bot.command(name="suggest")
async def submit_suggestion(ctx, *, suggestion_content: str):
    # 发送确认消息给用户
    confirm_message = await ctx.send(
        f"你确定要提交这条建议吗?\n> {suggestion_content}\n添加{CONFIRM_EMOJI}表情完成提交"
    )
    # 自动添加确认表情,方便用户点击
    await confirm_message.add_reaction(CONFIRM_EMOJI)
    # 把关键信息存入临时字典
    pending_suggestions[confirm_message.id] = {
        "user_id": ctx.author.id,
        "suggestion": suggestion_content
    }

2. 监听反应添加事件,触发提交逻辑

接下来编写全局的反应监听事件,过滤出符合条件的反应(特定消息、特定用户、特定表情),然后执行发送建议到指定频道的操作。

@bot.event
async def on_reaction_add(reaction, user):
    # 忽略机器人自己的反应,避免死循环
    if user.bot:
        return
    
    # 检查当前反应的消息是否在待确认列表中
    message_id = reaction.message.id
    if message_id not in pending_suggestions:
        return
    
    # 获取对应的建议数据
    suggestion_data = pending_suggestions[message_id]
    # 验证:必须是提交建议的用户,且用的是预设确认表情
    if user.id == suggestion_data["user_id"] and str(reaction.emoji) == CONFIRM_EMOJI:
        # 获取指定的建议接收频道
        target_channel = bot.get_channel(SUGGESTION_CHANNEL_ID)
        if not target_channel:
            await reaction.message.channel.send("错误:无法找到指定的建议接收频道!")
            del pending_suggestions[message_id]
            return
        
        # 用Embed格式发送建议,更美观
        embed = discord.Embed(
            title="新用户建议",
            description=suggestion_data["suggestion"],
            color=discord.Color.blue()
        )
        embed.set_footer(text=f"提交者:{user.name}#{user.discriminator}")
        await target_channel.send(embed=embed)
        
        # 给用户发送提交成功的反馈
        await reaction.message.edit(
            content=f"你的建议已成功提交!\n> {suggestion_data['suggestion']}"
        )
        # 删除临时数据,避免重复触发
        del pending_suggestions[message_id]
额外注意事项
  • 记得把代码里的command_prefix、SUGGESTION_CHANNEL_ID替换成你自己的实际值
  • 机器人需要在服务器中拥有添加反应、发送消息到指定频道的权限
  • 如果使用discord.py v1.x版本,intents的配置方式会略有不同,但核心逻辑一致
  • 可以考虑给pending_suggestions添加过期清理逻辑(比如用定时任务删除24小时未处理的记录),避免内存占用过高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:37:40