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

Discord.py按钮3分钟未点击无响应,超时参数配置求助

问题描述

按钮超过3分钟未点击就会提示「interaction failed after 3 min」,无法响应操作,已知和timeout参数有关,但不知道配置位置。

解决方案

Discord.py中discord.ui.View的默认超时时间为180秒(3分钟),修改超时规则只需在View类的初始化方法中给父类传入timeout参数:

  • 若要让按钮永久有效,设置timeout=None
  • 若要自定义超时时长,传入具体秒数(例如1小时设为timeout=3600)

另外注意:原代码中使用的time.sleep()是同步阻塞函数,会导致bot在休眠期间无法处理其他请求,必须替换为异步的asyncio.sleep()。

修改后的完整代码
import asyncio
import json
import discord

# Tickets
class Menu(discord.ui.View):
    def __init__(self):
        # 配置超时,这里设置为None即永久有效,可替换为具体秒数
        super().__init__(timeout=None)
        self.value = None

    @discord.ui.button(label="📥 Ticket", style=discord.ButtonStyle.grey)
    async def menu1(self, interaction: discord.Interaction, button: discord.ui.Button):
        with open("open_channels_user_id.json", "r") as f:
            data = json.load(f)
            user_id = data["user_id"]

            if user_id != interaction.user.id:
                admin_role = discord.utils.get(interaction.guild.roles, name="hulpje")
                category = discord.utils.get(interaction.guild.categories, name='Ticket')
                overwrites = {interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
                              interaction.guild.me: discord.PermissionOverwrite(read_messages=True),
                              interaction.user: discord.PermissionOverwrite(read_messages=True),
                              admin_role: discord.PermissionOverwrite(read_messages=True)}
                new_ticket = await interaction.guild.create_text_channel(f'Ticket- {interaction.user.name}', category=category, overwrites=overwrites)
                channel = interaction.guild.get_channel(new_ticket.id)
                embed = discord.Embed(title=f'Ticket- {interaction.user.name}', description="Goed dat je een ticket opent. \n Stuur alvast wat informatie zodat het makkelijker is voor het staff team.", color=0x004BFF)
                await channel.send(embed=embed)
                await interaction.response.send_message(f"Ticket is geopen met de naam: Ticket- {interaction.user.name}")

                data['user_id'] = interaction.user.id
                with open("open_channels_user_id.json", "w") as f:
                    json.dump(data, f)

                # 替换同步sleep为异步版本,避免阻塞bot
                await asyncio.sleep(3)
                await interaction.channel.purge(limit=1)

            else:
                await interaction.response.send_message("Je hebt al een ticket openstaan.")
                await asyncio.sleep(5)
                await interaction.channel.purge(limit=1)

async def menu(ctx):
    view = Menu()
    embed = discord.Embed(title="Ticket", description="Vragen, klachten of iets anders maak hier je Ticket aan en wordt zo snel mogelijk geholpen!", color=0x004BFF)
    await ctx.send(embed=embed, view=view)
额外提示

如果设置timeout=None,需要在bot启动时通过bot.add_view(Menu())注册该View,否则bot重启后已发送的按钮会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:01:07