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は、後ほど試合結果などのデータを取得するのに、使われます。
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以下はⅠ〜Ⅴのティアに分かれており、数字が小さいほどランクが上になっています。
さて私のティアは…
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試合のデータを取得してみましょう。
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を紹介したいと思います。