Discord.py实现带超时限制的embed消息创建命令运行失败问题
Discord.py embed创建命令超时功能修复方案
存在的问题
你的代码无法正常运行超时功能的核心原因如下:
- 未导入
asyncio模块,无法识别asyncio.TimeoutError异常类型 - 异常捕获语法错误:
except asyncio.TimeoutError(*title):是非法写法,异常捕获时不需要传入额外参数 - try/except结构不完整,仅尝试处理了第一次输入的超时,后续两次用户输入的超时逻辑完全没有做异常捕获
- 首次标题输入的超时时间仅设置为2秒,普通用户根本无法在2秒内完成输入,极易直接触发超时
- 你提供的代码片段中
client.command装饰器前缺少@符号,若实际代码也存在该问题会导致命令无法注册,如果你注释超时相关代码后可正常运行,大概率是粘贴时的遗漏
修复后完整代码
# 首先确认你已经导入了必要模块 import discord from discord.ext import commands import asyncio # 必须导入asyncio才能捕获超时异常 client = commands.Bot(command_prefix="你自己的前缀", intents=discord.Intents.all()) # 请自行替换前缀、配置好intents @client.command(aliases=["createEmbed", "embedCreate"]) # 补上缺失的@装饰器 async def embed(ctx): Questions = ["Titulo?", "Cor? (Hex sem #)", "Descrição?"] Responses = [] def check(m): return m.author == ctx.author and m.channel == ctx.channel try: # 第一次输入:标题,超时时间改为20秒足够用户输入 await ctx.send(Questions[0]) title = await client.wait_for('message', timeout=20.0, check=check) Responses.append(title.content) # 第二次输入:颜色 await ctx.send(Questions[1]) cor = await client.wait_for('message', timeout=25.0, check=check) Responses.append(cor.content) # 第三次输入:描述 await ctx.send(Questions[2]) descrição = await client.wait_for('message', timeout=25.0, check=check) Responses.append(descrição.content) except asyncio.TimeoutError: # 修正异常捕获语法 await ctx.send("Demorou muito") return # 新增十六进制格式校验,避免用户输入非法值导致报错 try: corHex = int(Responses[1], 16) except ValueError: await ctx.send("输入的十六进制颜色不合法,请重新运行命令") return embedVar = discord.Embed(title=Responses[0], description=Responses[2], color=corHex) await ctx.send(embed=embedVar)
额外注意事项
- 请确保你已经开启了消息内容意图(Message Content Intent),在Discord开发者面板的机器人设置中开启,同时代码中初始化Bot时正确配置了intents,否则
wait_for无法正常捕获用户发送的消息 - 如果需要给每一步输入单独做不同的超时提示,可以把每一次
wait_for都单独套一层try/except结构,当前的写法是任意一步超时都统一触发超时提示
内容的提问来源于stack exchange,提问作者Twoguini
相关产品推荐
相关产品推荐

