4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Riot APIを使ってLeague of Ledgedsの直近の使用チャンピオンを集計する

Posted at

###League of Legendsとは
League of Legends(LoL)はRiot Gamesが開発したMOBAと呼ばれる5人対5人で戦うオンラインゲームです。
今回はRiot Gamesが提供しているRiot APIを使い、試合の情報を少し集計してみました。
今回は1プレイヤー(LoLではサモナーと呼びます)が直近の100試合で使用したチャンピオン(キャラクター)の回数を集計したいと思います。
###環境

  • Windows10
  • python 3.6.2
  • vscode 1.30.1

###Riotwatcherについて
APIキーの用意等は割愛しますので他の方の投稿を参照していただけたらと思います。
APIキーだけ使って直接データを貰うこともできますがJSON形式で結構面倒だったりしているので、ここではpythonモジュールのriotwatcherを使いました。
https://riot-watcher.readthedocs.io/en/latest/index.html
###モジュールのインポート
各種データを取得するためのriotwatcher,一部のデータを処理するためのjson,あと出力を見やすくするためにpprintをインポートしました。

lol.py
from riotwatcher import RiotWatcher
import json
from pprint import pprint 

###チャンピオンのデータを集計する辞書を作る
試合のデータに含まれる使用したチャンピオンのデータはIDで渡されるのでそれを名前と対応付けて、さらに回数を数えるための辞書を作っておきます。ここではキーをID,値を名前と回数のリストとしました。
名前の対応付けには公式から提供されているチャンピオンの静的データのファイルを使います。これは以下のURLから取得できます。
http://ddragon.leagueoflegends.com/cdn/8.24.1/data/en_US/champion.json
なお、新しいチャンピオンが追加されている場合があるので、URLの8.24の部分は適宜最新パッチの数値とする必要があります。

lol.py
champion_count = {} #{ID:["チャンピオンの名前",回数]
with open('champion.json',encoding="utf-8") as f:
    df = json.load(f)
for i in df["data"]:
    champion_count[int(df["data"][i]["key"])] = [df["data"][i]["name"],0]

###データを取得する
今回は韓国サーバーのサモナー「Hide on Bush」さんの直近の100試合のIDを取得し、同サーバーの該当する試合のIDより詳細な情報を個別に取得することにしました。
regionにはデータを取得したいサーバを指定します。日本サーバーなら"jp1",韓国なら"kr"とします。
watcher.match.matchlist_by_accountからは本当はもっとたくさん情報がありますがそれはまた別の機会にしようと思います。

lol.py
watcher = RiotWatcher("{APIキー}")
region = "kr"
name = "Hide on bush"
summoner = watcher.summoner.by_name(region, name)
#プレイヤーのIDやレベルなどの概要を取得して出力

recentmatchlists = watcher.match.matchlist_by_account(region,summoner["accountId"],queue=[420])
#IDを指定したサモナーの直近の100試合のデータを取得
#queue=[420]と指定することでソロキューのみに限定
for j in recentmatchlists['matches']:
    id = j["gameId"]
    championid = j["champion"] 
    #試合のデータからparticipantsのどれにあたるか特定するのにも使う。
    #ソロキューではチャンピオンは他のプレイヤーと被らないのでこれで良い
    champion_count[championid][1] +=1
    match = watcher.match.by_id(region,id) 
for j in champion_count:
    if champion_count[j][1] > 0: #一回以上使用したチャンピオンの回数を出力
        pprint(champion_count[j])
 

###出力

['Aatrox', 10]
['Akali', 11]
['Azir', 1]
['Caitlyn', 1]
['Camille', 3]
['Cassiopeia', 3]
['Ezreal', 1]
['Fizz', 2]
['Galio', 1]
['Gnar', 1]
['Irelia', 9]
['Jayce', 2]
['LeBlanc', 13]
['Lee Sin', 2]
['Leona', 1]
['Lissandra', 6]
['Lulu', 1]
['Neeko', 3]
['Pyke', 1]
['Rakan', 1]
['Rumble', 1]
['Ryze', 2]
['Sion', 1]
['Taliyah', 1]
['Talon', 2]
['Thresh', 1]
['Urgot', 7]
['Viktor', 1]
['Vladimir', 2]
['Xayah', 1]
['Xin Zhao', 2]
['Yasuo', 2]
['Zoe', 4]

###感想
本当は全サモナーの全試合のデータが欲しかったが、試合のデータを取得するには試合のIDを参照する必要があり、また試合のIDは個人のIDから取ってくる形になっているため、全ての試合のデータを取ってくるのは面倒そう。簡単にはできなさそうでした。
ただし、今回はまだ使っていないが、上位のレート帯に関しては何かしらとれるかもしれないです。
次は試合に関する他の情報も使って機械学習をしたいとおもいます。
###参考文献
League of Legendsの試合データから勝敗を判別する機械学習①
Riot Games APIでLeague of Legendsの試合データを取得しよう

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?