Python开发Discord斜杠命令:如何限制仅输入15位DeleteHash?
问题修复:Discord斜杠命令校验Imgur DeleteHash长度报错
错误原因
你代码中的while循环逻辑错误:当输入长度不符合要求时,你把borrar_imagen赋值为ctx.send()的返回值(一个SlashMessage对象),而非用户重新输入的字符串。导致下一次循环执行len(borrar_imagen)时,抛出TypeError: object of type 'SlashMessage' has no len()。
修复方案
方案1:直接校验参数,不符合则终止命令
如果不需要用户重新输入,直接校验参数长度,不符合就提示后结束命令:
async def borrar1(ctx:SlashContext, borrar_imagen:str): # 先校验长度 if len(borrar_imagen) != 15: await ctx.send("Sólo se permiten IDs de 15 dígitos", hidden=True) return # 后续API请求逻辑 url = f"https://api.imgur.com/3/image/{borrar_imagen}" payload={} files={} headers = { 'Authorization': "Bearer "} response = requests.request("DELETE", url, headers=headers, data=payload, files=files) # 优化Embed使用,避免重复创建 if response.json()["status"] == 200: embed = discord.Embed(title="", description="Imagen borrada con exito!", color=0x00ff11) await ctx.send(embed=embed, hidden=True) elif response.json()["status"] == 400: embed = discord.Embed(title="", description="No está permitido paginas webs", color=0xff0019) await ctx.send(embed=embed, hidden=True) elif response.json()["status"] == 403: embed = discord.Embed(title="", description="Error!", color=0xff0019) await ctx.send(embed=embed, hidden=True)
方案2:允许用户重新输入正确ID
如果需要用户在同一个会话中重新输入,使用bot.wait_for监听用户消息:
# 顶部需要导入asyncio import asyncio async def borrar1(ctx:SlashContext, borrar_imagen:str): # 循环校验长度 while len(borrar_imagen) != 15: await ctx.send("Sólo 15 dígitos, por favor ingresa el ID correcto", hidden=True) # 定义校验条件:仅接收命令发起者在同一频道的消息 def check(m): return m.author == ctx.author and m.channel == ctx.channel try: # 等待用户输入,超时60秒可自行调整 msg = await bot.wait_for('message', check=check, timeout=60.0) borrar_imagen = msg.content.strip() except asyncio.TimeoutError: await ctx.send("Tiempo agotado, por favor vuelve a ejecutar el comando", hidden=True) return # 后续API请求逻辑同方案1 url = f"https://api.imgur.com/3/image/{borrar_imagen}" payload={} files={} headers = { 'Authorization': "Bearer "} response = requests.request("DELETE", url, headers=headers, data=payload, files=files) if response.json()["status"] == 200: embed = discord.Embed(title="", description="Imagen borrada con exito!", color=0x00ff11) await ctx.send(embed=embed, hidden=True) elif response.json()["status"] == 400: embed = discord.Embed(title="", description="No está permitido paginas webs", color=0xff0019) await ctx.send(embed=embed, hidden=True) elif response.json()["status"] == 403: embed = discord.Embed(title="", description="Error!", color=0xff0019) await ctx.send(embed=embed, hidden=True)
额外优化建议
- 重复创建相同结构的Embed会增加冗余,建议统一逻辑复用
- 调用
response.json()前先判断response.ok,避免API请求失败时解析JSON报错 discord-slash库已停止维护,建议迁移到官方discord.py2.0+自带的斜杠命令功能
内容的提问来源于stack exchange,提问作者silva
相关产品推荐
相关产品推荐

