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

Discord机器人catto命令报错:'File'对象无'to_dict'属性问题排查

报错产生原因

核心错误根源有两处:

  1. 传参类型不匹配:discord.abc.Messageable.send()方法的embed参数仅接收discord.Embed类型的对象,你在else分支中直接将discord.File类型的本地文件对象传给了embed参数,discord库处理embed时会自动调用对象的to_dict()方法做格式转换,但File类没有该方法,直接触发AttributeError。
  2. 原有随机逻辑完全失效:你定义了choice = ["1","2"]后没有存储random.choice(choice)的返回值,直接拿完整列表和数字1做相等判断,该条件永远返回False,代码100%进入else分支,同时列表内的元素是字符串类型,即使存储了随机结果,和数字1对比也永远不成立。
修复方案

按以下步骤调整代码即可:

  • 先存储随机选择的结果,调整判断逻辑的类型匹配
  • 本地文件需要先挂载到Embed对象中,不能直接作为embed参数传递:创建Embed后通过attachment://<文件名>的格式关联本地文件,发送时同时传入file参数和embed参数

修正后的完整代码如下:

@bot.command()
async def catto(ctx):
    # 修正随机选择逻辑,存储结果
    choice_val = random.choice([1,2])
    print(choice_val)
    if choice_val == 1:
        r = requests.get("APILINK").json()
        cat_embed = discord.Embed()
        cat_embed.set_image(url=r["url"])
        await ctx.send(embed=cat_embed)
    else:
        # 随机选一个本地文件
        selected_file = random.choice([
            discord.File("FILEPATH1"), # 替换为第一张本地图的实际路径
            discord.File("FILEPATH2")  # 替换为第二张本地图的实际路径
        ])
        # 创建Embed关联本地文件
        cat_embed = discord.Embed()
        # 这里的文件名要和你File对象加载的文件名完全一致
        cat_embed.set_image(url=f"attachment://{selected_file.filename}")
        # 发送时同时传file和embed参数
        await ctx.send(file=selected_file, embed=cat_embed)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:48:04