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

Discord.py下拉菜单选择后提示‘Interaction failed’问题求助

问题排查与修复方案

核心错误点

  1. 缺失必要导入:代码未导入requests、logging,以及discord.ui下的Select和View类,运行时会触发NameError。
  2. Token存储错误:discord.api_key不是discord.py的标准属性,应使用普通变量存储token后传入bot.run()。
  3. 无效事件监听:discord.py中不存在on_select_option事件,组件交互需通过组件回调函数或自定义View类处理。
  4. View超时问题:默认View会在15分钟后超时,超时后用户交互会失败,需设置timeout=None禁用超时。

修正后的完整代码

import discord
from discord import commands
from discord.ui import Select, View
import requests
import logging

intents = discord.Intents.default()
intents.message_content = True

# 正确存储token
token = open("token.txt", "r").read().strip("\n")

bot = commands.Bot(command_prefix="!", intents=intents)

xxx_WIKIPEDIA_API_URL = "xxx"

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s]: %(message)s",
    handlers=[
        logging.StreamHandler(),  
        logging.FileHandler("bot.log")  
    ]
)

logging.info("Infó üzenet")
logging.error("Hiba üzenet")

@bot.event
async def on_ready():
    print(f"{bot.user.name} bejelentkezett")

# 为Select组件定义回调函数
async def select_callback(interaction):
    selected_option = interaction.values[0]
    logging.info(f"Selected option: {selected_option}")
    # 替换为实际维基百科域名
    link = f"https://xxx.wikipedia.org/wiki/{selected_option.replace(' ', '_')}"
    embed = discord.Embed(title="Wikipédia Link", color=0x00FF00)
    embed.description = link
    # 正确响应交互
    await interaction.response.send_message(embed=embed)

@bot.command(name="wiki")
async def wikipedia(ctx, *args):
    search_query = " ".join(args)
    params = {
        "action": "opensearch",
        "format": "json",
        "search": search_query,
        "limit": 5,
    }
    response = requests.get(xxx_WIKIPEDIA_API_URL, params=params)
    
    if response.status_code == 200:
        api_data = response.json()
        
        if len(api_data) >= 4 and len(api_data[1]) > 0:
            titles = api_data[1]

            embed = discord.Embed(title=f"Keresés eredménye: {search_query}", color=0x00FF00)
            embed.description = "Válassz egy elemet a legördülő menüből!"

            options = [discord.SelectOption(label=title) for title in titles]
            select = Select(
                placeholder="Válassz egy elemet",
                options=options,
                custom_id="wikipedia_select",
            )
            # 绑定回调函数到Select组件
            select.callback = select_callback

            # 设置View永不超时
            view = View(timeout=None)
            view.add_item(select)

            message = await ctx.send(embed=embed, view=view)
        else:
            await ctx.send('Nincs találat a xxx Wikipédián.')
    else:
        logging.error(f"Hiba: HTTP státuszkód {response.status_code}")
        await ctx.send("Hiba történt az API kéréskor.")

bot.run(token)

额外说明

  • 需将xxx_WIKIPEDIA_API_URL替换为实际维基百科API地址(例如匈牙利语维基为https://hu.wikipedia.org/w/api.php)
  • 安装依赖包:pip install discord.py requests
  • 若需持久化组件(重启Bot后仍能响应旧消息交互),可使用bot.add_view()注册View,此例为命令生成的临时组件,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:14