【年末年始は積みゲーを消化したい！】PHP + Steam Web API で自分の積みゲーを把握する

本記事は、[サムザップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sumzap) の12/4の記事です。

# はじめに
はじめまして、サムザップの[北島](https://twitter.com/RyotoKitajima)です。
ゲーム会社で働いているだけあって、私はゲームが大好きです！
特にPCゲームが大好きなのですが、仕事が忙しい社会人はついつい積みゲーが増えがちですよね（ゲームを買っただけで満足してしまう...）。
今回は、自分のSteamの積みゲーを把握するプログラムを作ってみました。
年末年始のお休みが近いということで、休みに入ったら積みゲーを消化するぞ！！（えいえいおー！）

:::note info
__Steamとは__
Valve社が提供する、ゲーム販売やSNS機能などを備えたPCゲームのプラットフォームです。
https://store.steampowered.com/
:::

# PHPのローカル環境の準備

弊社では、サーバーサイドのプログラムは主にPHPを使っています。
慣れている言語ということで、今回はPHPを使いたいと思います。
まずは、ローカル環境でPHPが動く状態を作ります。

Mac で Homebrew がインストールされている場合、以下で簡単にPHPをインストールすることができます。

```
$ brew install php
```
実行後、インストールされたことを確認するためにPHPのバージョンを確認しましょう。
```
$ php -v
PHP 8.0.9 (cli) (built: Jul 29 2021 17:21:21) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.9, Copyright (c), by Zend Technologies
```
無事、最新バージョンがインストールされていることが確認できます。

# Web API キー の取得

Steam Web APIを使用するには、APIキーを取得する必要があります。

Steamにログインした状態で、以下のページにアクセスします。
https://steamcommunity.com/dev/apikey

好きなドメイン名を入力、利用規約に同意するチェックを入れ「登録」ボタンを押下します。
![Steam Web APIキーの登録_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539013/a03577c6-0b7b-c95b-9374-718ed6fa1cb7.png)
上手くいけば、APIキーが取得できます。
![Steam Web APIキーの登録_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539013/af3390f3-6815-9fd1-6364-4c89db4bb97d.png)

:::note warn
スパム対策で、5ドル以上課金したアカウントでないとAPIキーの登録はできないようです。
なので、今回用に新しく作ったアカウントなどでは失敗すると思うのでご注意ください。
:::

# Steam ID の取得

続いて、積みゲーの情報を取得したい Steam ID を準備します。
Steam ID は、Steamのプロフィールページを開き、開発者ツールを起動、ソースコード内を`g_steamID`で検索すると分かります。

# 作成したプログラム

APIキーと Steam ID が揃ったので、コードを書いていきます。
今回書いたコードは以下です。

```get_tsumige_info.php
<?php

$api_key = "【APIキー を記載】";
$steam_id = "【Steam ID を記載】";

// 所持しているゲームの情報を取得
$data = json_decode(file_get_contents("http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?" . http_build_query(array("key" => $api_key, "steamid" => $steam_id, "include_appinfo" => 1))), true);

// プレイ時間が60分以下のゲームを抽出
$result = array();
foreach($data["response"]["games"] as $row) {
    if($row["playtime_forever"] <= 60) {
        $result[] = array(
            "game_name" => $row["name"],
            "play_time" => sprintf('%d時間 %d分', $row['playtime_forever'] / 60, $row['playtime_forever'] % 60)
        );
    }
}

// 結果を表示
foreach($result as $row) {
    echo $row["game_name"] . ": " . $row["play_time"] . "\n";
}
echo "-------------------------------------------------------\n";
echo "積みゲーの数: " . count($result) . "\n";
```

`GetOwnedGames`を使ってそのSteamアカウントが所持しているゲームの情報を取得しています。

https://partner.steamgames.com/doc/webapi/IPlayerService#GetOwnedGames

今回は、プレイ時間が60分以下のものを積みゲーと定義することにしました。

# 結果

私のゲームの好みがバレバレでちょっと恥ずかしいですが、91本も積みゲーがある結果になりましたw
年末年始にお休みがあるとはいえ、時間が足りませんね！

明日（[アドベントカレンダー](https://qiita.com/advent-calendar/2022/sumzap) 12/5の記事）は @ohbashunsuke さんの記事になります、お楽しみに！！

```
$ php get_tsumige_info.php

Sid Meier's Civilization V: 0時間 2分
Super Meat Boy: 0時間 1分
The Witcher 2: Assassins of Kings Enhanced Edition: 0時間 0分
Superbrothers: Sword & Sworcery EP: 0時間 0分
Borderlands 2: 0時間 0分
LEGO® The Lord of the Rings™: 0時間 0分
GunZ 2: The Second Duel: 0時間 4分
Rogue Legacy: 0時間 0分
Legend of Dungeon: 0時間 8分
LEGO® The Hobbit™: 0時間 0分
Enter the Gungeon: 0時間 5分
Catacomb Kids: 0時間 6分
Lords Of The Fallen: 0時間 0分
Trine 3: The Artifacts of Power: 0時間 0分
Vagante: 0時間 22分
Borderlands: The Pre-Sequel: 0時間 0分
This War of Mine: 0時間 0分
FreeStyle 2: Street Basketball: 0時間 55分
Ori and the Blind Forest: 0時間 0分
Ori and the Blind Forest: Definitive Edition: 0時間 21分
Undertale: 0時間 0分
Borderlands 3: 0時間 0分
Batman™: Arkham Knight: 0時間 0分
Little Nightmares: 0時間 0分
Wallpaper Engine: 0時間 20分
Wizard of Legend: 0時間 22分
Tom Clancy's The Division: 0時間 16分
Tom Clancy's The Division PTS: 0時間 0分
GTFO: 0時間 8分
Evolve Stage 2: 0時間 0分
Celeste: 0時間 23分
For The King: 0時間 11分
Resident Evil 7 Biohazard: 0時間 0分
METAL GEAR SOLID V: THE PHANTOM PAIN: 0時間 0分
METAL GEAR SOLID V: GROUND ZEROES: 0時間 0分
Devil May Cry 5: 0時間 1分
The Surge: 0時間 0分
Hellpoint: 0時間 0分
Risk of Rain 2: 0時間 0分
PAYDAY 2: 0時間 9分
GRIS: 0時間 59分
Hellblade: Senua's Sacrifice: 0時間 12分
Hellblade: Senua's Sacrifice VR Edition: 0時間 0分
It Lurks Below: 0時間 0分
Tales of Arise: 0時間 0分
FINAL FANTASY XII THE ZODIAC AGE: 0時間 0分
Blasphemous: 0時間 0分
SCARLET NEXUS: 0時間 0分
Tom Clancy's Rainbow Six Siege - Test Server: 0時間 0分
Little Nightmares II: 0時間 0分
Noita: 0時間 3分
Death's Door: 0時間 46分
Death's Gambit: Afterlife: 0時間 8分
Metro Exodus: 0時間 21分
Metro Exodus Enhanced Edition: 0時間 0分
Bright Memory: 0時間 0分
One Step From Eden: 0時間 19分
Thronebreaker: The Witcher Tales: 0時間 14分
The Witcher: Enhanced Edition: 0時間 0分
Resident Evil 2 "1-Shot Demo": 0時間 27分
Foregone: 0時間 41分
West of Dead: 0時間 55分
A Plague Tale: Innocence: 0時間 0分
Dreamscaper: 0時間 29分
The Surge 2: 0時間 47分
RESIDENT EVIL RESISTANCE: 0時間 0分
Mortal Shell: 0時間 18分
Curse of the Dead Gods: 0時間 46分
SUPER ROBOT WARS V: 0時間 19分
Skul: The Hero Slayer: 0時間 11分
Trine 4: The Nightmare Prince: 0時間 0分
Apex Legends: 0時間 0分
CODE VEIN: 0時間 0分
Detroit: Become Human: 0時間 0分
Titanfall® 2: 0時間 0分
Rogue Legacy 2: 0時間 17分
Tails of Iron: 0時間 2分
GetsuFumaDen: Undying Moon: 0時間 17分
GetsuFumaDen: 0時間 0分
Thymesia: 0時間 19分
Across the Obelisk: 0時間 3分
Ghostrunner: 1時間 0分
V Rising: 0時間 0分
Titan Souls: 0時間 0分
Kenshi: 0時間 0分
Alina of the Arena: 0時間 15分
Ruined King: A League of Legends Story™: 0時間 27分
BIOHAZARD VILLAGE Z Version: 0時間 0分
Resident Evil Re:Verse: 0時間 0分
Little Noah: Scion of Paradise: 0時間 0分
FINAL FANTASY VII REMAKE INTERGRADE: 0時間 0分
-------------------------------------------------------
積みゲーの数: 91
```