LoginSignup
50
39

More than 5 years have passed since last update.

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

Posted at

League of Legendsとは

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

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

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

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

実行環境

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

APIを使う準備をする

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

LoLのアカウントを持っている方は、Riot Games APIにアクセスして、サインインしましょう。

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

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

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

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

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

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のドキュメントを御覧ください。

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

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

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

さて私のティアは…

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年1月現在、ブロンズ2は上位79%だそうです。けっこう下の方だとわかりました。

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

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

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
実行結果
{
  "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を読んでみてください!このドキュメントはかなり親切で、パラメータなどを入力するとURIを発行してくれたり、実際にJSONデータを取得して表示もしてくれます!

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

50
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
39