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

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.py 2.0+自带的斜杠命令功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:30:41