Discord.py下拉菜单选择后提示‘Interaction failed’问题求助
问题排查与修复方案
核心错误点
- 缺失必要导入:代码未导入
requests、logging,以及discord.ui下的Select和View类,运行时会触发NameError。 - Token存储错误:
discord.api_key不是discord.py的标准属性,应使用普通变量存储token后传入bot.run()。 - 无效事件监听:discord.py中不存在
on_select_option事件,组件交互需通过组件回调函数或自定义View类处理。 - 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
相关产品推荐
相关产品推荐

