Riot Games APIでLeague of Legendsの試合データを取得しよう

# League of Legendsとは

League of Legends(通称LoL)はRiot Gamesが開発・運営をしているオンラインゲームです。プレイヤーは５人１組でチームを組み、対戦相手の本拠地を破壊すれば勝ちというゲームです。[Twitch](https://www.twitch.tv/directory)の視聴者数を見ると大体いつも上位におり、今世界で一番人気のあるゲームと言えるでしょう。昨年、日本サーバーも開設され、日本でもプレイ人口が上がってきています。

LoLの試合結果やプレイヤー(このゲームではサモナーと呼ばれます)の情報は、Riot GamesがREST APIとして公開しており、LoLのアカウントを持っている人であれば、誰でも利用できます。

Riot Games APIを使ったWebサービスでは[OPGG](http://jp.op.gg/)などが有名ですね。各試合の結果や、チャンピオンごとの勝率などいろいろなデータを公開しているサービスです。

今回はアカウントの取得から、APIでデータを取得するまでの流れを一通り書いていきたいと思います。

# 実行環境

- Mac OS Sierra
 - バージョン 10.12.2
- Ruby
 - バージョン 2.3.3 

# APIを使う準備をする

Riot Games APIを利用するにはLoLのアカウントが必要になります。アカウントを持ってない方は、[公式サイト](http://jp.leagueoflegends.com/ja)から取得してください。特にこだわりがなければ日本サーバーのアカウントで問題ありません。

LoLのアカウントを持っている方は、[Riot Games API](https://developer.riotgames.com/)にアクセスして、サインインしましょう。

サインインしたらDEVELOPMENT API KEYを取得します。APIを取得するのにはこのKEYが必要になります。サインインした画面の「NEW API KEY」というボタンを押すとKEYが発行されます。

ここまでできれば準備は完了です!

# サモナー名からサモナーIDの情報を取得する

それではさっそくサーバーにリクエストを送り、データを取得してみましょう。なお、データはすべてJSON形式で提供されています。

まずは私のアカウント名である「himrox」のサモナーIDを取得します。このサモナーIDは、後ほど試合結果などのデータを取得するのに、使われます。

```ruby:summoner_id.rb
require 'net/http'
require 'uri'
require 'json'

API_KEY = 'XXXX-XXXXXXXX-XXXXX-XXXXX' #　先程取得したAPI　KEYです
name = "himrox"
region = "jp"
uri = URI.parse("https://jp.api.pvp.net/api/lol/#{region}/v1.4/summoner/by-name/#{name}?api_key=#{API_KEY}")
return_data = Net::HTTP.get(uri)
summoner_data = JSON.parse(return_data)
summoner_id = summoner_data[name]["id"]

puts summoner_data
# {"himrox"=>{"id"=>6180396, "name"=>"himrox", "profileIconId"=>1381, "summonerLevel"=>30, "revisionDate"=>1484446189000}}

puts summoner_id
# 6180396
```

なお、URIのエンドポイントは取得したいサモナーが登録しているサーバーになります。日本サーバーの場合だと「jp.api.pvp.net」ですね。別のサーバーのエンドポイントは[APIのドキュメント](https://developer.riotgames.com/docs/regional-endpoints)を御覧ください。

# サモナーIDからランク情報を取得する

次に先程取得したIDを使って、サモナーのランクを取得してみましょう。

ランクは強い順にChallenger, Master, Diamond, Platinum, Gold, Silver, Bronzeとなっています。さらにDiamond以下はⅠ〜Ⅴのティアに分かれており、数字が小さいほどランクが上になっています。

さて私のティアは…

```ruby:stats.rb
region = 'jp'
summoner_id = 6180396
uri = URI.parse("https://jp.api.pvp.net/api/lol/#{region}/v2.5/league/by-summoner/#{summoner_id}/entry?api_key=#{API_KEY}")
return_data = Net::HTTP.get(uri)
stats = JSON.parse(return_data)
tier = stats["#{summoner_id}"][0]["tier"]
division = stats["#{summoner_id}"][0]["entries"][0]["division"]

puts stats
# {"6180396"=>[{"name"=>"Sion's Shadows", "tier"=>"BRONZE", "queue"=>"RANKED_SOLO_5x5", "entries"=>[{"playerOrTeamId"=>"6180396", "playerOrTeamName"=>"himrox", "division"=>"II", "leaguePoints"=>78, "wins"=>64, "losses"=>59, "isHotStreak"=>false, "isVeteran"=>true, "isFreshBlood"=>false, "isInactive"=>false}]}]}

puts tier
# BRONZE

puts division
# II
```

ブロンズ2ですね。ちなみに2017年１月現在、ブロンズ2は上位79%だそうです。けっこう下の方だとわかりました。

# サモナーIDから直近10試合のデータを取得する

最後にサモナーIDから直近10試合のデータを取得してみましょう。

```ruby:recent.rb
region = 'jp'
summoner_id = 6180396
uri = URI.parse("https://jp.api.pvp.net/api/lol/#{region}/v1.3/game/by-summoner/#{summoner_id}/recent?api_key=#{API_KEY}")
return_data = Net::HTTP.get(uri)
recent = JSON.parse(return_data)

puts recent
```

```json:実行結果
{
  "summonerId": 6180396,
  "games": [
    {
      "gameId": 139044585,
      "invalid": false,
      "gameMode": "CLASSIC",
      "gameType": "MATCHED_GAME",
      "subType": "RANKED_SOLO_5x5",
      "mapId": 11,
      "teamId": 200,
      "championId": 90,
      "spell1": 3,
      "spell2": 4,
      "level": 30,
      "ipEarned": 67,
      "createDate": 1484446188866,
      "fellowPlayers": [
        {
          "summonerId": 7012829,
          "teamId": 200,
          "championId": 110
        },
        {
          "summonerId": 8530563,
          "teamId": 100,
          "championId": 86
        },
        {
          "summonerId": 7660184,
          "teamId": 100,
          "championId": 5
        },
        {
          "summonerId": 6960379,
          "teamId": 200,
          "championId": 107
        },
        {
          "summonerId": 6338712,
          "teamId": 100,
          "championId": 25
        },
        {
          "summonerId": 6612831,
          "teamId": 200,
          "championId": 122
        },
        {
          "summonerId": 7860194,
          "teamId": 100,
          "championId": 202
        },
        {
          "summonerId": 6174843,
          "teamId": 200,
          "championId": 30
        },
        {
          "summonerId": 6681145,
          "teamId": 100,
          "championId": 4
        }
      ],
      "stats": {
        "level": 15,
        "goldEarned": 9978,
        "numDeaths": 9,
        "minionsKilled": 26,
        "championsKilled": 2,
        "goldSpent": 9350,
        "totalDamageDealt": 36706,
        "totalDamageTaken": 23082,
        "team": 200,
        "win": false,
        "neutralMinionsKilled": 3,
        "largestMultiKill": 1,
        "physicalDamageDealtPlayer": 7919,
        "magicDamageDealtPlayer": 28787,
        "physicalDamageTaken": 11634,
        "magicDamageTaken": 10700,
        "timePlayed": 2211,
        "totalHeal": 1269,
        "totalUnitsHealed": 1,
        "assists": 8,
        "item0": 3020,
        "item1": 2301,
        "item2": 3116,
        "item3": 2055,
        "item4": 3136,
        "item5": 1026,
        "item6": 3364,
        "magicDamageDealtToChampions": 10894,
        "physicalDamageDealtToChampions": 2186,
        "totalDamageDealtToChampions": 13081,
        "trueDamageTaken": 747,
        "wardKilled": 6,
        "wardPlaced": 20,
        "neutralMinionsKilledYourJungle": 3,
        "totalTimeCrowdControlDealt": 812,
        "playerRole": 2,
        "playerPosition": 4,
        "visionWardsBought": 8
      }
    },
…以下省略
```

試合データは勝ち負けだけでなく、敵に与えたダメージ量や購入したアイテム、設置したワードの数などかなり細かいデータまで取得できることがわかります。

使用したチャンピオン名などは、static-dataなどから取得しなくてはなりませんが、それはまた次回に回したいと思います。

# さいごに

今回紹介したAPIはRiotが提供しているほんの一部に過ぎません。もっと詳しく知りたい方は[API Document](https://developer.riotgames.com/api/methods)を読んでみてください！このドキュメントはかなり親切で、パラメータなどを入力するとURIを発行してくれたり、実際にJSONデータを取得して表示もしてくれます！

次回は、チャンピオンやアイテムなどの静的なデータを取得するAPIを紹介したいと思います。