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

Python开发Discord工单机器人遇AttributeError问题求助

问题解决:Discord机器人出现AttributeError: 'Interaction' object has no attribute 'selected_options'

错误原因分析

你遇到的错误源于代码里的变量名拼写混乱和错误的对象属性调用逻辑:

  • 定义的数组是needs和respons,但代码里误用了neededs和respon,导致变量引用错误;
  • 你之前修改代码时可能误将select.selected_options写成了interaction.selected_options,而Interaction对象本身并没有selected_options属性,这直接触发了报错;
  • 选择器设置了min_values=1和max_values=1,完全不需要循环遍历选中项,直接取单个选中项即可。

修正后的完整代码

import discord
from discord.ext import commands
import bottoken  # 存储机器人令牌的自定义文件
from keep_alive import keep_alive  # 保持机器人在线的自定义文件

BotIntents = discord.Intents.all()  # 测试用全权限意图,正式环境建议按需开启
Bot = commands.Bot(command_prefix="#", intents=BotIntents)

# 统一变量命名,替换为你的实际内容
needs = ["选项1", "选项2", "选项3", "选项4"]
responses = ["回复内容1", "回复内容2", "回复内容3", "回复内容4"]

class support_select(discord.ui.View):
    @discord.ui.select(
        placeholder="إختيار الدعم التلقائي",
        min_values=1,
        max_values=1,
        options=[
            discord.SelectOption(label=needs[0], description=""),
            discord.SelectOption(label=needs[1], description=""),
            discord.SelectOption(label=needs[2], description=""),
            discord.SelectOption(label=needs[3], description="")
        ]
    )
    async def select_callback(self, select, interaction):
        # 因max_values=1,直接取第一个选中项的标签
        selected_label = select.selected_options[0].label
        
        # 匹配选项并发送对应回复
        if selected_label == needs[0]:
            await interaction.response.send_message(
                f"# {selected_label}\n\n{responses[0]}\n\nSport Speed Support",
                ephemeral=True
            )
        elif selected_label == needs[1]:
            await interaction.response.send_message(
                f"# {selected_label}\n\n{responses[1]}\n\nSport Speed Support",
                ephemeral=True
            )
        elif selected_label == needs[2]:
            await interaction.response.send_message(
                f"# {selected_label}\n\n{responses[2]}\n\nSport Speed Support",
                ephemeral=True
            )
        elif selected_label == needs[3]:
            await interaction.response.send_message(
                f"# خريطة السيرفر\n\n{responses[3]}\n\nSport Speed Support",
                ephemeral=True
            )

@Bot.event
async def on_ready():
    print("机器人 {0.user}({0.user.id}) 已上线并准备就绪...".format(Bot))

@Bot.command(name='ts')
async def ts(ctx):
    if ctx.author == Bot.user:
        return
    await ctx.send(view=support_select())

keep_alive()
Bot.run(bottoken.ToKeN)

关键修正点

  1. 统一变量名:将neededs修正为needs,respon修正为responses(保持与定义的变量名一致);
  2. 简化选中项获取:利用选择器max_values=1的设置,直接取select.selected_options[0].label,无需循环;
  3. 纠正属性调用对象:确保始终通过select对象访问selected_options,而非interaction对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:05:32