Discord机器人catto命令报错:'File'对象无'to_dict'属性问题排查
报错产生原因
核心错误根源有两处:
- 传参类型不匹配:
discord.abc.Messageable.send()方法的embed参数仅接收discord.Embed类型的对象,你在else分支中直接将discord.File类型的本地文件对象传给了embed参数,discord库处理embed时会自动调用对象的to_dict()方法做格式转换,但File类没有该方法,直接触发AttributeError。 - 原有随机逻辑完全失效:你定义了
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
相关产品推荐
相关产品推荐

