FortniteAPIを使って対戦履歴を取得する

fortnite-Victory Royale

Fortniteおもしろいですよね。
筆者もハマっています。
下手ですが。


自分の対戦履歴(プレイ時間やキル数、など)などを知りたいなと思い、調べてみると「Fortnite Tracker」というサイトで調べることができます。


こういうサイト作ってみたいなと思い、もうちょっと調べてみるとAPIが準備されているみたいですね。
でも、このAPIのいい感じの日本語ドキュメントが見つからず。。。


という訳で、自分なりにAPIの処理結果を解析してみたので、その結果を紹介していきます


環境情報


使用するAPIは、Rakuten Rapid APIで公開されているAPIを使用します。
Epic(Fortniteの運営会社)が公開しているAPIをラップしている形ですかね。
使いやすいです。


今回は、上記のAPIをPHPから呼び出して、処理結果をWEBページに表示する形にします。


  • 言語:PHP5.5.35
  • API:Rakuten Rapid API/Fortnite-API

Rakuten Rapid API は従量課金制ですが、お試しで使う分には課金されるまではトラフィックは使わないと思います。


ステータス取得のAPI実行


APIの実行サンプルを紹介します。


今回はcurlを使ってAPIを実行しています。
キー情報(x-rapidapi-key)は、Rakuten Rapid APIで取得したキー情報を使用します。


Fortnite APIは、「Status」「Others」「PVE」の3つがありますが、戦歴を取得できるのは「Status」のようです。
「Status」APIをcurlで実行して、取得した結果をJSONデコードします。


$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://fortnite-api.p.rapidapi.com/stats/" . $_POST['__nickname'],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => array(
        "x-rapidapi-host: fortnite-api.p.rapidapi.com",
        "x-rapidapi-key: '※APIのキー"
    ),
));
$response = curl_exec($curl);

// 実行失敗時はエラー表示
$err = curl_error($curl);
curl_close($curl);
if ($err) {
    echo "cURL Error #:" . $err;
} 

// JSONの処理結果をデコード
$resDecode = json_decode($response, true);

ソロ結果


ソロ結果を表示するWEB画面を作りました。

ニックネームを入力して「表示する」ボタンを押下すると、ニックネームユーザの戦歴が画面上に表示されます。


以下に、API実行結果の解析方法を紹介していきます。


ソロ結果の画面表示


「Fortnite Tracker」のソロ結果表示画面は以下になります。
吹き出しでコメントを入れている数値が、APIで取得できているはず、という事です。


FortniteAPIの実行結果

ソロ結果のAPI取得


FortniteAPIの実行結果に対する日本語マニュアルがみつからず、筆者が独自で解析した結果をまとめます。


まず、ソロ結果は”defaultsolo”キーに格納されているようです。

ソロ結果の格納場所
ソロ結果の各値

  • マッチ数

‘matchNum’キーの値。


  • 勝利数(ビクロイ)

‘winrate’キーの値。


  • キル数

‘kills’キーの値。


  • 勝率(ビクロイ率)

‘winrate’キーの値。


  • 1日あたりのキル数

‘kills’キーの値 / ’matchNum’キーの値。


  • TOP10の入賞数

‘placetop10’キーの値。


  • TOP25の入賞数

‘placetop25’キーの値。


  • 総プレイ時間

‘minutesplayed’キーの値。
値は分なので、日と時間にするには計算が必要。


  • 1マッチの平均時間

‘minutesplayed’キーの値 / ’matchNum’キーの値


  • 1マッチの平均キル数

‘kills’キーの値 /’matchNum’キーの値


  • 1分あたりのの平均キル数

‘kills’キーの値 /’mminutesplayed’キーの値


  • 1マッチの平均スコア数

‘score’キーの値 /’matchNum’キーの値


  • 1分あたりのの平均スコア数

‘score’キーの値 /’minutesplayed’キーの値


  • 総スコア数

‘score’キーの値。



サジェストAPIを使って、各サービスのサジェストワードを取得する

JavaScript

Googleを始めとした検索システムにおいて、検索ワードのテキストボックスにキーワードを入力すると候補文字列が表示されます。
これを「サジェスト」と呼び、日本語訳では「予測変換」になります。


このサジェスト文字列は、各サービスからAPIで提供されており、個別で実行可能になります。


今回は、各サービス毎のサジェストAPIの実行方法と、取得結果について紹介していきます。


環境情報


PHPでAPIを実行して、取得結果の表示をおこないます。


  • PHP 5.5.35

APIのURL


各APIのURLは以下になります。
取得形式はXMLだったらJSONだったりするのですが、できるだけ様々なパターンを試してみたいので、両方のパターンを実施してみます。


サービス 取得形式 URL
Google XML http://www.google.com/complete/search?hl=en&output=toolbar&q=keyword
Yahoo XML http://ff.search.yahoo.com/gossip?output=xml&command=keyword
Bing JSON https://api.bing.com/osjson.aspx?market=ja-JP&query=keyword
Youtube JSON http://clients1.google.com/complete/search?hl=en&ds=yt&client=firefox&q=keyword
Amazon JSON http://completion.amazon.co.jp/search/complete?search-alias=aps&mkt=6&q=keyword
wikipedia JSON https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=keyword

※「keyword」が、予測変換したい文字列になります。


各APIのパラメータ詳細については、各サービスの正式ドキュメントを参照ください。


実行プログラムと実行結果


実行プログラムと実行結果を紹介していきます。
サービスによっては、APIの返り値には予測変換以外の属性情報が格納されている様なのですが、今回はあくまで予測変換文字列のみを抽出します。


なので、各プログラムで予測変換文字列以外は除外しています。


Google


一番メジャーな(気がする)Googleのサンプルコードです。
XMLで結果を取得して表示するプログラムになります。

try {
    $searchWord = "wordPress";
    $url = "http://www.google.com/complete/search?hl=en&output=toolbar&q=" . $searchWord;
    $result = simplexml_load_file($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    foreach ($result->CompleteSuggestion as $item) {
        echo "suggestWord=" . 
            $item->suggestion->attributes()->data . "
"; } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpress
suggestWord=wordpress login
suggestWord=wordpress download
suggestWord=wordpress themes
suggestWord=wordpress tutorial
suggestWord=wordpress plugin
suggestWord=wordpress hosting
suggestWord=wordpress php
suggestWord=wordpress api
suggestWord=wordpress free

Yahoo


YahooもGoogleと同じようにXMLでの結果取得が可能です。
XMLの構造がYahooとは異なるので、微妙にコーディングが異なります。

try {
    $searchWord = "wordPress";
    $url = "http://ff.search.yahoo.com/gossip?output=xml&command=" . $searchWord;
    $result = simplexml_load_file($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    foreach ($result as $item) {
        echo "suggestWord=" . 
            $item->attributes()->k . "
"; } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpress.com
suggestWord=wordpress login
suggestWord=wordpress.org
suggestWord=wordpress.com login
suggestWord=wordpress download
suggestWord=wordpress themes
suggestWord=www.wordpress.com login
suggestWord=wordpress login wp-admin
suggestWord=wordpress.org download
suggestWord=wordpress templates

Bing


BingからJSON形式で取得します。
XMLとはプログラムは異なりますが、基本的な構造は変わりません。


また、取得結果の配列は2段階になっているので、結果の配列構造も意識したプログラムとなります。

try {
    $searchWord = "wordPress";
    $url = "https://api.bing.com/osjson.aspx?market=ja-JP&query=" . $searchWord;
    $result = file_get_contents($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    $result = json_decode($result, true);
    for ($lc = 0; $lc < count($result); $lc++) {
        if (is_array($result[$lc])) {
            $searchWord = $result[$lc];
            for ($slc = 0; 
                $slc < count($searchWord); $slc++) {
                echo "suggestWord=" . 
                    $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpress
suggestWord=wordpress ログイン
suggestWord=wordpress 使い方
suggestWord=wordpressとは
suggestWord=wordpress インストール
suggestWord=wordpress テーマ
suggestWord=wordpress ログインできない
suggestWord=wordpress テンプレート
suggestWord=wordpress log in

Youtube


YoutubeはBingと同じプログラムで結果を取得できます。
APIのURLが違うだけです。


結果は以下になります。


実行結果

suggestWord=wordpress
suggestWord=wordpress tutorial
suggestWord=wordpress 使い方
suggestWord=wordpress website
suggestWord=wordpress blog
suggestWord=wordpress theme
suggestWord=wordpress speed optimization
suggestWord=wordpress plugins
suggestWord=wordpress マナブ
suggestWord=wordpress php

Amazon


Amazonは、BingとYoutubeと基本的に同様なのですが、結果配列の3階層目にも情報が格納されているようです。
サジェストワードは2階層目なので、3階層目を除外する制御を入れています。

try {
    $searchWord = "wordPress";
    $url = "http://completion.amazon.co.jp/search/complete?search-alias=aps&mkt=6&q=" . $searchWord;
    $result = file_get_contents($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    $result = json_decode($result, true);
    for ($lc = 0; $lc < count($result); $lc++) {
        if (is_array($result[$lc])) {
            $searchWord = $result[$lc];
            for ($slc = 0; 
                $slc < count($searchWord); $slc++) {
                if (is_array($searchWord[$slc])) {
                    continue;
                }
                echo "suggestWord=" . 
                    $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpressの教科書
suggestWord=wordpress
suggestWord=wordpress 本
suggestWord=wordpress php
suggestWord=wordpress ブログ
suggestWord=wordpress カスタマイズ
suggestWord=wordpressデザインレシピ集
suggestWord=wordpress 仕事の現場でサッと使える デザイン教科書
suggestWord=wordpress デザイン
suggestWord=wordpress レッスンブック

wikipedia


wikipediaは、他サービスとちょっと異なります。
実行プログラムは他のJSON形式と同一なのですが、結果にURLが格納されています。

※親切ですね


以下のサンプルプログラムでは、他結果との違いが分かりやすいように、キーワードを「wordPress」ではなく「japan」(結果がたくさん返ってくる)にしています。
また、空欄の結果文字列は除外しています。

try {
    $searchWord = "japan";
    $url = "https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=" . $searchWord;
    $result = file_get_contents($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    $result = json_decode($result, true);
    for ($lc = 0; $lc < count($result); $lc++) {
        if (is_array($result[$lc])) {
            $searchWord = $result[$lc];
            for ($slc = 0; 
                $slc < count($searchWord); $slc++) {
                if (is_array($searchWord[$slc])) {
                    continue;
                }
                if (strlen($searchWord[$slc]) == 0) {
                    continue;
                }
                echo "suggestWord=" . 
                    $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=Japan
suggestWord=JAPAN COUNTDOWN
suggestWord=JAPAN FM LEAGUE
suggestWord=Japan Expo
suggestWord=JAPAN (アルバム)
suggestWord=JAPANサッカーカレッジ
suggestWord=JAPAN JAM
suggestWord=JAPANNEXT
suggestWord=JAPANARIZM
suggestWord=Japan Skeptics
suggestWord=https://ja.wikipedia.org/wiki/Japan
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_COUNTDOWN
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_FM_LEAGUE
suggestWord=https://ja.wikipedia.org/wiki/Japan_Expo
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_(%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0)
suggestWord=https://ja.wikipedia.org/wiki/JAPAN%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E3%82%AB%E3%83%AC%E3%83%83%E3%82%B8
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_JAM
suggestWord=https://ja.wikipedia.org/wiki/JAPANNEXT
suggestWord=https://ja.wikipedia.org/wiki/JAPANARIZM
suggestWord=https://ja.wikipedia.org/wiki/Japan_Skeptics