TypeError: индексы списка должны быть целыми числами или срезами, а не str при попытке вернуть что-то из api - PullRequest
0 голосов
/ 05 мая 2020

Я кодирую бота Discord, который использует API Mojang и Hypixel. Я пытаюсь вернуть первую строку (только gameType и mode)

{"success":true,"games":[{"date":1588679703604,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Neon"},{"date":1588679671468,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Skyport"},{"date":1588679612412,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Arena"},{"date":1588679573171,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Spikerock Bay"},{"date":1588679530855,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Backwood"},{"date":1588679503914,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Spikerock Bay"},{"date":1588679453072,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Highset"},

Вот как я это делал:

def get_session(name):
    url1 = f"https://api.mojang.com/users/profiles/minecraft/{name}"

    res = requests.get(url1)
    data = res.json()
    if data["id"] is None:
        return None
    returnUuid = (data["id"])

    url2 = f"https://api.hypixel.net/recentGames?key={API_KEY}&uuid=" + returnUuid

    res = requests.get(url2)
    data = res.json()
    if data["games"] is None:
        return None
    returnGametype = (data["games"]["gameType"])
    returnGamemode = (data["games"]["mode"])

Это выдает мне ошибку, Command Raised an exception: TypeError: list indices must be integers or slices, not str.

Я предполагаю, что это как-то связано с наличием нескольких строк. Я не знаю, что делать.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Как вы заметили, это как-то связано с несколькими строками.

{"success":true,"games":[
{"date":1588679703604,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Neon"},
{"date":1588679671468,"gameType":"DUELS","mode":"CLASSIC_DUEL","map":"Skyport"}...]

Конечная точка возвращает json, что для ключа 'games' имеет массив / несколько значений. Поэтому, если вы хотите получить значение 'gameType' и 'mode' для первого элемента в массиве, вы должны написать:

 returnGametype = (data["games"][0]["gameType"])
 returnGamemode = (data["games"][0]["mode"])
0 голосов
/ 05 мая 2020

Словари вложены в список. Это причина ошибки индекса (поскольку индексы списка не могут быть строкой). Если вы хотите использовать первый результат в списке "игр", используйте первый индекс (0):

game_type = data["games"][0]["gameType"]
game_mode = data["games"][0]["mode"]
...