PythonでRiotGamesAPIを叩いて遊ぶ 前半

  • 2
    いいね
  • 1
    コメント

この記事は、kstmアドベントカレンダーの記事として書かれました

Riot Games APIについて

オンラインゲーム「リーグ・オブ・レジェンド」(通称LoL)の運営会社であるRiot Gamesが提供するAPI
このAPIを使うと,個々人やチームの戦績やらなんやらがJSON形式で引っ張ってこれるので今回はこれを叩いて遊んでみようと思います.

目標

ランク戦の戦績データを使って"なんかカッコイイ"プロフィール画像(Twitterのヘッダー画像みたいな)が作れたら良いなぁ.

  • 実行環境
    • Windows 10
    • Python 3.5 (Anaconda)

APIの呼び出し方

条件:Riot Gamesが運営しているサーバのLoLアカウントを持っている
https://developer.riotgames.com/
API DOCUMENTATION -> FULL API REFERENCE に飛ぶと色んなAPIがあって任意の引数を与えてやるとJSONを返してくれます.
叩く場合には個々のアカウントに割り振られているAPIキーが必要なのでダッシュボードで確認しましょう.

実際に叩いてみる

使用したライブラリ

lib.py
import urllib.request as urllib2
import json

urllib2をそのままimportしたらハマったので調べてみるとpython3ではurllib.requestを使えば同様の機能が得られるらしいのでこれをurllib2としてimportします

まずはサモナーID取得から

getSummID.py
SUM_NAME = "sumname" #サモナーネーム 好きなのに変えてね
SUMMONER_V14 = "https://jp.api.pvp.net/api/lol/jp/v1.4/summoner/by-name/"
API_KEY = "api_key=XXXXXXXXXXXXXXXX" #自分のAPIキーに変えてね
try:
    s = urllib2.urlopen(SUMMONER_V14 + SUM_NAME + '?' + API_KEY)
    summ = json.loads(s.read().decode('utf-8'))
    SUM_ID = summ[SUM_NAME.lower()]["id"]
    print(SUM_ID)
finally:
    s.close()

ここで使うAPIはsummoner-v1.4 実際に取得してみると,小文字サモナーネーム型のオブジェクトを返してきます.このオブジェクトにはサモナーIDやプロフィールアイコンIDなどが格納されています.戦績データを取得するためにはサモナーIDが必要なのでroot[SUM_NAME.lower()]["id"]のようにしてidにアクセスして取得してみます.
私のサモナーネームを使用した場合は6300501が表示できたら成功です.

このサモナーIDというのが非常に大切で,戦績などプレイヤーに結び付けられているデータを取得するにはこのIDを使うことになります.

ランク戦の戦績を取得してみよう

ここで使うAPIはstats-v1.3 このAPIはマッチ1つ1つのデータが取得できるわけではなく,チャンピオンごとのデータを取得することが出来ます.ではチャンピオンごとの戦績を一覧にして表示してみましょう.

getRankedStats.py
try:
    r = urllib2.urlopen(RANKED_STATS_V13 + '?' + SEASON + '&' +API_KEY)
    ranked = json.loads(r.read().decode('utf-8'))
    champions = ranked['champions']
    for champion in champions:
        stats = champion["stats"]
        print("チャンピオンid:" + str(champion["id"]) + "の戦績は" + str(stats["totalSessionsWon"]) + "勝" + str(stats["totalSessionsLost"]) + "敗です")
finally:
    r.close()

取得してみると,summonerIDmodifyDatachampionsリストを取得することが出来ます.前述の通り,このAPIはチャンピオンごとの戦績を取得することが出来,そのデータはchampionsリスト内のstatsオブジェクトに格納されています.なので,for文使って個々の勝敗回数を取得して表示してみると以下のようになります.

チャンピオンid:42の戦績は1勝1敗です
チャンピオンid:3の戦績は0勝1敗です
チャンピオンid:4の戦績は1勝6敗です
...
チャンピオンid:0の戦績は22勝28敗です

このチャンピオンidはそれぞれのチャンピオンに割り振られているidで,次回説明するstatic-dataと紐付けさせることによってチャンピオン名も取得することが出来ます.
ちなみにこのチャンピオンid:0は,全てのチャンピオンの戦績の合計データです.

長くなりそうなので今回はここまで 後半に続く(続きたい)