"List of indices must be integers, not str" 使用 aiohttp 获取 API 图像时

"List of indices must be integers, not str" While getting an API image using aiohttp

我正在制作一个 discord 机器人,用于发送带有从 API 获取的图像的嵌入。我有一个给狗的,它很管用。狗一的代码:

if message.content.lower().startswith("!dog"):
    async with aiohttp.ClientSession() as session:
       request = await session.get('https://some-random-api.ml/img/dog') # Make a request
       dogjson = await request.json() # Convert it to a JSON dictionary
    dogembed = discord.Embed(title="Doggy!", color=discord.Color.blue()) 
    dogembed.set_image(url=dogjson['link'])
    

await message.channel.send(embed=dogembed)

这很完美,而且始终如一。但是,当我尝试使用“https://api.thecatapi.com/v1/images/search”对猫图像做同样的事情时,我得到了这个错误。

这是我的猫代码:

if message.content.lower().startswith("!cat"):
    async with aiohttp.ClientSession() as session:
       request = await session.get('https://api.thecatapi.com/v1/images/search') # Make a request
       catjson = await request.json() # Convert it to a JSON dictionary
    Catembed = discord.Embed(title="Kitty!", color=discord.Color.blue()) 
    Catembed.set_image(url=catjson['link'])
    
    await message.channel.send(embed=Catembed)

请帮助我,我是 python 和 API 的初学者。

如果您查看 API 调用的结果,您会发现它是 list,而不是 dictionary,正如您的错误所暗示的那样。

[
  {
    "breeds": [],
    "id": "992",
    "url": "https://cdn2.thecatapi.com/images/992.jpg",
    "width": 560,
    "height": 368
  }
]

这意味着您不能catjson['link'],但您首先必须从列表中取出第一个元素,然后然后访问该字段。

catjson[0]['link']

此外,正如您从我上面粘贴的代码片段中看到的那样,link 在 API 响应中不作为字段存在。您正在寻找 url.

catjson[0]['url']

为了将来参考,在尝试使用它之前以及调试时查看 API 的输出(在您的浏览器中或通过 printing 结果)永远不会有坏处.如果您收到一个字段不存在的错误,请查看哪些字段 do 存在。

它对狗 API 有效的原因是因为反应看起来完全不同,这在使用两个完全不同的 API 时是意料之中的。