【PUBG】PUBG APIを使用してPythonで簡単にスクリムのスタッツを取得する方法を解説

今回はPUBG APIを用いてプレイヤーのスタッツを計算する方法について解説していきます.大会やスクリムの得点計算が簡単になるかと思いますのでみなさんも是非活用してみてください.今回使用するのはpubg-pythonというライブラリになります.このライブラリを使用してプレイヤーのスクリムでのキル数などを計算してみましょう.

はじめに

それは2018年のPWIでのことでした.それまでPUBGはVtuberの叶くんの放送くらいしかみてなかったのですが,その叶くんとよくPUBGをプレイしていたZoo gamingの皆さんの出てる試合を見てみようとyoutubeを開きました.そしてZoo gamingの皆さんがあの大舞台でドン勝をとった瞬間に競技PUBGにどっぷりハマってしまいました.というわけで最近の趣味はスクリムを見たり配信を見たりすることになっています.そんな中自分でもPUBGのスタッツ計算とかやってみたいなーと思ってPythonでPUBG APIを使用する方法について調べてみました.そして今回は簡単にPUBG APIを使用したデータの取得方法について解説していきたいと思います.

pubg-pythonを用いたデータの取得

これは有志の方が開発してくださったPUBG APIのPythonでのラッパーとなります.平たくいうとこれを使用することで簡単にPUBG APIの操作が可能となります.
また,今回の記事ではPUBG APIにてアカウントを作成して自身のAPI Keyを取得していることを前提としているのでまだアカウントを作成していない方はこの記事からアカウントを作成してみてください.

【簡単】PUBGでスクリムのスタッツ計算をするためのPUBG API登録方法

まず,以下のコードが特定のプレイヤーネームの方のカスタムマッチでの戦績を取得するコードとなります.今回は現在Crest Gaming Xanaduに所属しているRuytvさんのカスタムマッチでの戦績について取得してみましょう.

from pubg_python import PUBG, Shard, Filter

api = PUBG('self_api_key', Shard.PC_KRJP)

players = api.players().filter(player_names=['Ruytv'])

for player in players:
    for match in player.matches:
        match_data = api.matches().get(match.id)
        if match_data.game_mode == "esports-squad-fpp" and match_data.is_custom_match:
            print("---------------------------------------")
            print("Match Date : ", match_data.created_at)
            print("Map Name : ", match_data.map_name)
            for roster in match_data.rosters:
                for participant in roster.participants:
                    if participant.name == "Ruytv":
                        print("Player Name : ", participant.name)         # player name
                        print("Damage : ", participant.damage_dealt)      # damage
                        print("Assist : ", participant.assists)           # assist
                        print("Knock : ", participant.dbnos)              # Down But Not Out = knocks
                        print("Kill : ", participant.kills)               # kill
                        print("Survive : ", participant.time_survived)    # survive
これを実行した結果が以下になります.(3月28日時点)
---------------------------------------
Match Date :  2020-03-26T14:28:46Z
Map Name :  Baltic_Main
Player Name :  Ruytv
Damage :  18.449999
Assist :  0
Knock :  0
Kill :  0
Survive :  932.996
---------------------------------------
Match Date :  2020-03-26T13:52:23Z
Map Name :  Baltic_Main
Player Name :  Ruytv
Damage :  791.8879
Assist :  2
Knock :  2
Kill :  3
Survive :  1711.337
---------------------------------------
Match Date :  2020-03-26T13:20:26Z
Map Name :  Savage_Main
Player Name :  Ruytv
Damage :  0
Assist :  0
Knock :  0
Kill :  0
Survive :  890.719
---------------------------------------
Match Date :  2020-03-26T11:50:53Z
Map Name :  Desert_Main
Player Name :  Ruytv
Damage :  69.60826
Assist :  0
Knock :  0
Kill :  0
Survive :  593.008
---------------------------------------
Match Date :  2020-03-24T14:11:43Z
Map Name :  Baltic_Main
Player Name :  Ruytv
Damage :  0
Assist :  0
Knock :  0
Kill :  0
Survive :  705.594
---------------------------------------
Match Date :  2020-03-24T13:34:40Z
Map Name :  Baltic_Main
Player Name :  Ruytv
Damage :  57.550495
Assist :  0
Knock :  0
Kill :  0
Survive :  635.221
---------------------------------------
Match Date :  2020-03-24T13:04:39Z
Map Name :  Savage_Main
Player Name :  Ruytv
Damage :  171
Assist :  0
Knock :  2
Kill :  1
Survive :  715.332
---------------------------------------
Match Date :  2020-03-24T12:27:02Z
Map Name :  Desert_Main
Player Name :  Ruytv
Damage :  18.449999
Assist :  0
Knock :  0
Kill :  0
Survive :  262.942
---------------------------------------
Match Date :  2020-03-24T11:47:45Z
Map Name :  Desert_Main
Player Name :  Ruytv
Damage :  184.53076
Assist :  0
Knock :  1
Kill :  1
Survive :  1099.666
このような感じでプレイヤーの戦績を取得することができました.今回はスタッツ計算においてよく使用するであろうダメージ,アシスト数,ノック数,キル数,生存時間(sec )を取得してみました.それではコードの解説をしていきましょう.

APIの宣言

まずはapiを使用する際の宣言部分についてみていきましょう.
from pubg_python import PUBG, Shard, Filter

api = PUBG('self_api_key', Shard.PC_KRJP)
まずはライブラリのimportを最初の文にて行っています.次に使用するapiの設定ですがこの self_api_key の部分を自身のAPI Keyに設定してください.また,このShardの部分はよくわかりませんが一応KRJPにしておきました.一応取得できているので大丈夫なんじゃないかなという.

データ取得について

それでは一気にコードの中核となる部分を説明していきましょう.
players = api.players().filter(player_names=['Ruytv'])

for player in players:
    for match in player.matches:
        match_data = api.matches().get(match.id)
        if match_data.game_mode == "esports-squad-fpp" and match_data.is_custom_match:
            print("---------------------------------------")
            print("Match Date : ", match_data.created_at)
            print("Map Name : ", match_data.map_name)
            for roster in match_data.rosters:
                for participant in roster.participants:
                    if participant.name == "Ruytv":
                        print("Player Name : ", participant.name)         # player name
                        print("Damage : ", participant.damage_dealt)      # damage
                        print("Assist : ", participant.assists)           # assist
                        print("Knock : ", participant.dbnos)              # Down But Not Out = knocks
                        print("Kill : ", participant.kills)               # kill
                        print("Survive : ", participant.time_survived)    # survive
まず players という変数には player_names でフィルターをかけたプレイヤー名に対応するオブジェクトが入るようになっています.このplayer_names の部分に他のプレイヤーを入れることで検索するプレイヤーを増やすことができます.ただし,私の書いたプログラムでは例えばRuytvさんが出た試合に参加していた他のプレイヤー全員に対してもやろうとすれば操作することが可能ですのでスクリムでのスタッツ計算の時などはそのスクリムに参加していた一人だけを入れればいいのではないかと思います.
そしてこの players という変数で最初のforループを作成しています.さらにこの players から matches という値を取得できます.この matches には文字通りプレイヤーが参加してきた試合が入っているわけですが全ての試合を取得できるわけではなく私の場合は直近70試合ほどが取得できました.
この matches から実際に試合情報を抜き出して match_data 変数を作成します.この match_datarosters という値があるためスクリムの場合はスクリムに参加していた一人を指定すればそのマッチに参加していた全員に対してスタッツの取得が行えます. rostersというのがマッチに参加していたプレイヤー全員を格納しているわけですね.
そして roster の中の participants という値から実際にプレイヤーのスタッツなどにアクセスすることができます.
そして最後にスタッツの取得ですね。スタッツはこの participants の中の値にアクセスすることで取得できます。基本的に一般的なスタッツ計算のときに使用する値は上記のコードに示しています。
また、詳細な説明は下記にてそれぞれ記しています。

プレイヤーネームの取得

participants の中をfor文で順番に呼び出していく際のとある値を participant としたときに participant.name でプレイヤーネームを取り出すことができます。

ダメージの取得

participants の中をfor文で順番に呼び出していく際のとある値を participant としたときに participant.damage_dealt でプレイヤーが与えたダメージを取り出すことができます。dealtという単語がついているのはおそらくプレイヤーが受けたダメージなどと区別するためかと思われます。

アシストの取得

participants の中をfor文で順番に呼び出していく際のとある値を participant としたときに participant.assists でアシスト数を取り出すことができます。

ノックの取得

participants の中をfor文で順番に呼び出していく際のとある値を participant としたときに participant.dbnos でノック数を取り出すことができます。このdbnosという値についてですがこれはDown But Not Outsという単語の略となります。意味はダウンしたけどなくなっていないという意味です。これがいわゆるノックという概念になっていますね。なぜこんな名前なのかはちょっと疑問ですがこれでノック数がが取得できます。

キルの取得

participants の中をfor文で順番に呼び出していく際のとある値を participant としたときに participant.kills でキル数を取り出すことができます。

生存時間の取得

participants の中をfor文で順番に呼び出していく際のとある値を participant としたときに participant.time_survived で生存時間(sec)を取り出すことができます。

さいごに

今回はPythonからPUBG APIを経由してプレイヤーのスタッツを取得する方法について解説しました。次回は実際にスタッツを計算してあるスクリムでの各スタッツTop10のプレイヤーを表示するなどの作業を行なっていきたいと思います。

0 件のコメント :

コメントを投稿