foxxtrott

難しいことは分かりません

Riot Games APIでchampionIdからチャンピオン名を取得する

実行環境などはRiot Games APIをPythonで叩く - foxxtrottを参照。

つまづき

RiotWatcherのmatchやspectateで試合情報を取得する際、プレイヤーがどのチャンピオンをピックしたかという情報は、266や103といった、championIdとして取得される。
しかしchampionIdのままでは、人間が見てどのチャンピオンを指すのか分からない。そこでこのchampionIdをチャンピオン名に変換したい。

Data Dragonのチャンピオン情報のデータ構造メモ - foxxtrottで述べたように、Data Dragonの全チャンピオン情報は、各チャンピオン名をkey、チャンピオンデータをvalueに持つ階層dictになっている。
すなわち、チャンピオン名からチャンピオンデータ中のchampionIdを取得することは容易であり、例えば

#LoLバージョンの取得
region = 'jp1'
versions = rw.data_dragon.versions_for_region(region)

#Data Dragonからチャンピオン情報を取得
champions_data = rw.data_dragon.champions(versions['v'])

#AatroxのIDを取得表示
Aatrox_ID = champions_data['data']['Aatrox']['key']
print(Aatrox_ID)


実行結果

266

などで大丈夫だが、逆にchampionIdからチャンピオン名を取得するにはひと手間必要というわけである。

どうすんの

先述のchampions_dataを取得した上で、この関数を定義して使おう。

# championId(str)→チャンピオン名(str)
def championId_to_championName(championId):
    for name, dic in champions_data['data'].items():
        if dic['key'] == championId:
            return dic['name']


毎回for文が回るのが嫌な人は、↓の辞書をコードにコピペしちゃおう。

{'266': 'Aatrox', '103': 'Ahri', '84': 'Akali', '12': 'Alistar', '32': 'Amumu', '34': 'Anivia', '1': 'Annie', '22': 'Ashe', '136': 'Aurelion Sol', '268': 'Azir', '432': 'Bard', '53': 'Blitzcrank', '63': 'Brand', '201': 'Braum', '51': 'Caitlyn', '164': 'Camille', '69': 'Cassiopeia', '31': "Cho'Gath", '42': 'Corki', '122': 'Darius', '131': 'Diana', '119': 'Draven', '36': 'Dr. Mundo', '245': 'Ekko', '60': 'Elise', '28': 'Evelynn', '81': 'Ezreal', '9': 'Fiddlesticks', '114': 'Fiora', '105': 'Fizz', '3': 'Galio', '41': 'Gangplank', '86': 'Garen', '150': 'Gnar', '79': 'Gragas', '104': 'Graves', '120': 'Hecarim', '74': 'Heimerdinger', '420': 'Illaoi', '39': 'Irelia', '427': 'Ivern', '40': 'Janna', '59': 'Jarvan IV', '24': 'Jax', '126': 'Jayce', '202': 'Jhin', '222': 'Jinx', '145': "Kai'Sa", '429': 'Kalista', '43': 'Karma', '30': 'Karthus', '38': 'Kassadin', '55': 'Katarina', '10': 'Kayle', '141': 'Kayn', '85': 'Kennen', '121': "Kha'Zix", '203': 'Kindred', '240': 'Kled', '96': "Kog'Maw", '7': 'LeBlanc', '64': 'Lee Sin', '89': 'Leona', '127': 'Lissandra', '236': 'Lucian', '117': 'Lulu', '99': 'Lux', '54': 'Malphite', '90': 'Malzahar', '57': 'Maokai', '11': 'Master Yi', '21': 'Miss Fortune', '62': 'Wukong', '82': 'Mordekaiser', '25': 'Morgana', '267': 'Nami', '75': 'Nasus', '111': 'Nautilus', '518': 'Neeko', '76': 'Nidalee', '56': 'Nocturne', '20': 'Nunu & Willump', '2': 'Olaf', '61': 'Orianna', '516': 'Ornn', '80': 'Pantheon', '78': 'Poppy', '555': 'Pyke', '133': 'Quinn', '497': 'Rakan', '33': 'Rammus', '421': "Rek'Sai", '58': 'Renekton', '107': 'Rengar', '92': 'Riven', '68': 'Rumble', '13': 'Ryze', '113': 'Sejuani', '35': 'Shaco', '98': 'Shen', '102': 'Shyvana', '27': 'Singed', '14': 'Sion', '15': 'Sivir', '72': 'Skarner', '37': 'Sona', '16': 'Soraka', '50': 'Swain', '517': 'Sylas', '134': 'Syndra', '223': 'Tahm Kench', '163': 'Taliyah', '91': 'Talon', '44': 'Taric', '17': 'Teemo', '412': 'Thresh', '18': 'Tristana', '48': 'Trundle', '23': 'Tryndamere', '4': 'Twisted Fate', '29': 'Twitch', '77': 'Udyr', '6': 'Urgot', '110': 'Varus', '67': 'Vayne', '45': 'Veigar', '161': "Vel'Koz", '254': 'Vi', '112': 'Viktor', '8': 'Vladimir', '106': 'Volibear', '19': 'Warwick', '498': 'Xayah', '101': 'Xerath', '5': 'Xin Zhao', '157': 'Yasuo', '83': 'Yorick', '154': 'Zac', '238': 'Zed', '115': 'Ziggs', '26': 'Zilean', '142': 'Zoe', '143': 'Zyra'}

おまけ

さっきの辞書を作ってtxtへ出力/txtから読み込みするプログラム

# 'championID':'championName'のdictをtxtへ出力
dict_champion_id_to_name = {}
for key, value in champions_data['data'].items():
    for i in range(999):
        if value['key'] == str(i):
            dict_champion_id_to_name[value['key']] = value['name']
f = open('dict_champion_id_to_name.txt', 'w')
for key, value in dict_champion_id_to_name.items():
    f.write(f'{key}:{value}\n')
f.close()
#'championID':'championName'のdictをtxtから読み込み
dict_champion_id_to_name = {}
f = open("dict_champion_id_to_name.txt",'r')
for line in f:
    line = line.rstrip('\n')
    fields = line.split(':')
    dict_champion_id_to_name[fields[0]] = fields[1]
f.close()

目から血が出そうなソースコードだ……