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

Discord开发中如何将用户的消息反应保存为变量

实现方法

完全可以实现,你现有代码的核心问题是on_message内定义的msg是局部变量,和全局声明的msg没有关联,导致on_reaction_add里的消息匹配逻辑永远不会触发,且没有单独存储用户反应的变量。

推荐修改方案

用内置的wait_for方法监听单次反应输入更简洁,不需要额外单独写全局的on_reaction_add事件,修改后完整代码如下:

import discord

client = discord.Client()
# 用来存储用户选择的反应的全局变量,后续可以直接调用
user_selected_reaction = None

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    global user_selected_reaction
    if message.author == client.user:
        return
    # 发送问题消息并添加反应
    msg = await message.channel.send("**Question 1?**")
    reactions = ['1️⃣','2️⃣','3️⃣','4️⃣']
    for emoji in reactions: 
        await msg.add_reaction(emoji)
    
    # 定义反应检查规则:排除机器人自己的反应,反应是指定的四个,且反应绑定的消息是刚发送的问题消息
    def check(reaction, user):
        return user != client.user and str(reaction.emoji) in reactions and reaction.message.id == msg.id
    
    try:
        # 等待用户反应,这里可以设置timeout参数,比如timeout=30就是30秒没输入就超时
        reaction, user = await client.wait_for('reaction_add', check=check)
        # 把用户选择的第一个反应赋值给全局变量
        user_selected_reaction = str(reaction.emoji)
        # 测试输出,可以删掉
        await message.channel.send(f"你选择的反应是:{user_selected_reaction}")
        
        # 如果需要支持后续用户改选覆盖变量值,去掉下面的return,再加个循环持续监听即可
        return
    except:
        # 超时的处理逻辑,可以自己加
        await message.channel.send("等待反应超时")

client.run("你的token")

逻辑说明

  • 你后续需要调用用户选择的反应时,直接取全局变量user_selected_reaction的值即可
  • 如果需要支持用户后续选择其他反应覆盖之前的结果,只需要持续监听符合check规则的reaction_add事件,每次触发时更新user_selected_reaction的值即可
  • 如果需要区分不同用户的反应,把存储变量改成字典类型,以用户ID为key存储对应反应即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 06:54:07