Aikの技術日記

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

SteamAPIについてまとめてみた Part2

はじめに

こんにちは、筆者です。

前回の記事にて、Steam APIの概要や、野良で叩けるSteam Web APIの一部についてまとめてみました。
今回は前回に引き続き、下記のSteam Web APIについてまとめていきます:

  • ISteamRemoteStorage: Steamコミュニティへ投稿されたコンテンツの情報を取得できるAPI
  • ISteamUserStats: Steam登録ユーザーの情報を取得できる
  • ISteamWebAPIUtil: Steamworks Web APIサーバー自身の情報を取得できる

それではいきましょう。

ISteamRemoteStorage

Steamコミュニティへ投稿されたコンテンツの情報を取得できるAPIです。

GetPublishedFileDetails: コミュニティへ投稿されたコンテンツ情報を取得

こちらはコミュニティに投稿された様々な情報を取得可能です。
具体的には、下記のフォーマットのURLで遷移可能なコンテンツの情報を取得できます。
https://steamcommunity.com/sharedfiles/filedetails/?id=[コンテンツの固有ID]

このAPIからは下記のコンテンツを取得可能です:
(筆者が確認した感じこれらのコンテンツは取得できました。他にも取得できるものはあるかもしれません)

実はこれらのコンテンツのURLには、どれもsharedfilesというものがくっ付いております。
Steamシステム上では、これらコンテンツはどれもsharedfilesというカテゴリに属するのでしょう。

もし今後Steamで新しいカテゴリが出来たとして、そのコンテンツのURLにsharedfilesがくっ付いていたら恐らくこのAPIでデータを取得可能かと。

ちなみに、本APIでは「コンテンツのタイトル」や「コンテンツへのURL」「サムネイルデータ」などの概要を示すデータしか取れません。
例えば「ワークショップアイテム」の「MODデータ本体」や、「ガイド」の「本文」情報が取れるわけではないので悪しからず。

※「全てのコンテンツが共通で持っているデータ」を取得できる、というイメージを持つと分かりやすいかも。
「ワークショップアイテム」の「MODデータ本体」や、「ガイド」の「本文」情報はそのコンテンツグループ固有の情報ですしね。

また、本APIはPOSTリクエストのものですので…。
これまでの様に、ブラウザのURLを直叩きしてデータ取得するのはできません。

リクエストを投げたいときは、Terminalより下記の様なコマンドを投げると取れますので参考に。
publishedfileidsが指す値を任意のものに変更してご利用ください。
※なお下記のリクエストで取れるデータは私が作成したMODになってます、悪しからず。

curl -i -X POST \
   -H "Content-Type:application/x-www-form-urlencoded" \
   -d "itemcount=2" \
   -d "publishedfileids[0]=2224118463" \
   -d "publishedfileids[1]=2203211070" \
 'https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1/?format=json'

リクエストパラメータの注意点として、itemcountの値はpublishedfileidsの配列長と同じにした方がいいと思います。
というのも、itemcountの値がpublishedfileidsの配列長より少ない数値だと、指定したIDのコンテンツを取得できないのでね…。
(なんでこのパラメータが必須パラメータなのか謎です…。)

レスポンス結果はこんな感じです。
※「スクリーンショット」や「動画」など、異なるカテゴリの投稿であっても返却値は同一です。
※公式Docsに説明がないこともあり、よくわからない返却値が多々ありました…ご了承をば。

{
  "response": {
    "result": [取得件数],
    "resultcount": [取得件数],
    "publishedfiledetails": [
      {
        "publishedfileid": [取得したコンテンツのID],
        "result": [謎値, 1が格納されるのを確認済み],
        "creator": [作成者のSteamId ※数値で返却],
        "creator_app_id": [作成対象のアプリ ※appidと同一値],
        "consumer_app_id": [謎値, ※appidと同一値],
        "filename": [スクリーンショット、画像、ガイドであれば画像ファイル名が格納],
        "file_size": [画像ファイルのサイズ ※数値で返却],
        "file_url": [画像ファイルのURLリンク],
        "hcontent_file": [謎値, 数値で返却],
        "preview_url": [プレビュー画像のURLリンク ※動画は空文字が格納],
        "hcontent_preview": [謎値, 数値で返却],
        "title": [コンテンツのタイトル],
        "description": [コンテンツの説明欄],
        "time_created": [コンテンツ作成日(unixタイムスタンプ形式)],
        "time_updated": [コンテンツ更新日(unixタイムスタンプ形式)],
        "visibility": [謎値, 0が格納されるのを確認済み],
        "banned": [(恐らく)BANされているかどうか, 0=BANされていない?],,
        "ban_reason": [(恐らく)BANされた理由],
        "subscriptions": [サブスクライブ数, ワークショップアイテム以外には0が格納],
        "favorited": [お気に入り数],
        "lifetime_subscriptions": [謎値, サブスクライブ数と関連性ありそう],
        "lifetime_favorited": [謎値, お気に入り数と関連性ありそう],
        "views": [ユニーク訪問者数],
        "tags": [{ "tag": [タグ情報] }]
      }
    ]
  }
}

なお、コンテンツのカテゴリによっては「値が入ってなかったり」しますので御留意を。

APIだけでだいぶ長くなっちゃいましたね…。

説明の締めに、最後に本APIの参考文献を乗っけておきます。
公式Docsに参考情報がほとんどなく…下記のGithub Issueは大変参考になりました!
この場を借りてお礼をば…。

github.com

GetCollectionDetails: コミュニティへ投稿されたコンテンツ情報を取得(簡易版)

こちらもGetPublishedFileDetailsと同様、コミュニティへのコンテンツ情報を取得できるAPIです。
ただ、GetPublishedFileDetailsよりも取得できる情報は遥かに少ないです…。

また、本APIGetPublishedFileDetailsに続きPOSTリクエストのものですので…。
リクエストを投げたいときは、下記のコマンドを参考に。
publishedfileidsが指す値を任意のものに変更してご利用ください。
※なおこちらも取れるデータは私が作成したMODになってます、悪しからず。

curl -i -X POST \
   -H "Content-Type:application/x-www-form-urlencoded" \
   -d "collectioncount=2" \
   -d "publishedfileids[0]=2224118463" \
   -d "publishedfileids[1]=2203211070" \
 'https://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v1/?format=json'

レスポンス結果はこんな感じ:

{
  "response": {
    "result": [謎値, 1が格納されるのを確認済み],
    "resultcount": [取得件数],
    "collectiondetails": [{
      "publishedfileid": [取得したコンテンツID],
      "result": [謎値, 9が格納されるのを確認済み]
    }]
  }
}

…正直resultが示す値がなんなのかわからないと、使う意味がない気もしますね…。
また、私は確認できなかったのですがcollectiondetailschildrenという属性値がつくものもあるらしいです。
詳しくはこちらを: garrys mod - Steam Web API GetCollectionDetails not working - Stack Overflow

なお、GetPublishedFileDetailsと同様、リクエストパラメータの注意点として…。
collectioncountの値はpublishedfileidsの配列長と同じにした方がいいと思います。
(これもなんでこのパラメータが必須パラメータなのか謎ですね…。)

ISteamUserStats

ユーザーの情報へのアクセスに使用します。

GetGlobalAchievementPercentagesForApp: 実績取得比率を取得

これは指定されたアプリの「実績取得比率」を取得できるものです。結構面白いAPIですね。

…まぁ同一の情報はSteamから見れるんですけどね。
https://steamcommunity.com/stats/[appid]/achievementsのURLに飛んだら見ることができます。

レスポンス結果はこんな感じ:

{
  "achievementpercentages": {
    "achievements": [
      { "name": [実績名], "percent": [実績を獲得したユーザー/そのゲームをプレイした全ユーザー] }
    ]
  }
}

実績名には恐らく裏側での管理IDが入っており、PUBGでこのAPIを叩くと実績名にはACHIVE018といった簡素な名前が入ってました。
まぁ多言語対応の都合上、実績名に「Steam上で表示している名前」を入れるわけにもいかないでしょうしね…妥当な判断です。

ちなみに管理IDがどれを指すのかは、Steamdbを見てみるとわかります。
https://steamdb.info/app/[appid]/stats/で分かりますので、ここと照らし合わせながら見る感じになるかなと。

ちなみに、Library of Ruinaの様な「実績が設定されてない」アプリだと空データが返ってきます。

GetGlobalStatsForGame: グローバル統計データを取得

  • URL[GET] https://api.steampowered.com/ISteamUserStats/GetGlobalStatsForGame/v1/
  • 必須パラメータ:
    • appid[uint32]: 情報を取得したいアプリID。※後述するグローバル統計が有効になっているアプリのみ可
    • count[uint32]: データを取得する統計数
    • name[0][string]: データを取得する統計名
  • オプションパラメータ:
    • startdate[uint32]: データの測定開始日を指定(unixタイムスタンプ)
    • enddate[uint32]: データの測定開始日を指定(unixタイムスタンプ)

先に申し上げますと、このAPIはエンドユーザー向けのAPIではないかなと思います。
このAPIを本当に活用したいのであれば、非常に労力がかかる作業が要求されるかと思います…あらかじめご認識をば。

このAPIの説明をするには、Steamworksの概念の1つ「統計データ」の知識が必要ですので…軽く説明をば。
※公式Docsに書いている知識を噛み砕いて記したものです。詳細は公式Docsを参照に。

「統計データ」というのは、Steamアプリをプレイするユーザーの「プレイ時間」や「プレイ中の死亡回数」など、細やかな情報が登録できるものです。
その細やかさから、「ゲームの内部データの追跡」にも使用することが可能です。

これを使うことで例えば、「複数台のコンピュータを使用する1人のユーザの、すべてのセッションにわたるゲームプレイのデータを収集して、実績を付与する」といったこともできます。
どちらかというと「ゲームを開発する」側が参考にする情報、といった感じでしょうか。

ちなみに統計データを取得するにはそれなりに設定しなければならない事がありそうです…。
統計データを取得するには「統計名」や「統計データの型」「どういった時にその統計データが更新されるか」などなど実に様々なことを設定する必要があるそうで…。
詳細は公式Docsを参照に。

そして、本APIは「グローバル統計データ」という「各ユーザーごとの情報」ではなく「全ユーザーを統合して見た」情報を取得できるAPI…の一部です。
このAPIと、野良では叩けないAPIを駆使すれば、例えば「そのゲームの全ユーザーのプレイ時間総数」や「全ユーザーの合計死亡数」といった情報を集計することも可能…っぽいです。

ただし、これらの情報を得るには事前に「そのアプリにどんな統計データが登録されているのか」を知る必要があります。
(GETパラメータ内部のname[0]の値を指定するためですね)

こちらの情報については、Steamdbに載ってはいそうなのですが…。
https://steamdb.info/app/[appid]/stats/から閲覧可能です

よしんばその統計データ名がわかったとしても、「それがグローバル統計データに対応しているかどうか」は別問題である様です。
これがこのAPIを野良で叩きにくくしている原因です。

もし対象の統計データ名がグローバル統計非対応のものだと、下記の様なレスポンスが返ってきます…:

{
  "response": {
    "result": 8,
    "error": "Stat 'total_wins' is not an aggregated stat"
  }
}

もしそのアプリ開発者ではない、エンドユーザーからAPIを叩こうとしたら「Steamdb上に掲載されている統計データ名を」「かたっぱしから叩いてみて」「データが取れたらラッキー」 …的な感じになるかと…。

そんなわけで、本APIのレスポンス形式は調査できませんでした…。
一応Web上に参考情報となり得る記事がありましたので、その記事のURLだけ貼っておきます:
WebAPI/GetGlobalStatsForGame - Official TF2 Wiki | Official Team Fortress Wiki

GetNumberOfCurrentPlayers: アクティブプレイヤー数を表示

こちらは指定したアプリの「現時点でのプレイ人数」を取得するものです。
ただし、Steamに接続していない状態でプレイしている人はカウントされません。
(Steam側で検知できないからですね)

オフラインで完結できちゃうゲームについては、あまり当てにならない値が返ってくるかもですね。
逆にオンライン対戦が前提のゲームであれば、かなり信頼ある値が取れそうです。

レスポンス結果はこんな感じ:

{
  "response": {
    "player_count": [現時点でのプレイ人数],
    "result": [謎値, 1が格納されることを確認済み]
  }
}

ISteamWebAPIUtil

このAPIカテゴリでは、「Steamworks Web API」そのものに関する情報を取得できます。
現時点でサポートされているAPIのリストも返してくれる様ですが、野良では叩けません…。

代わりに野良では下記のAPIが叩けます。

GetServerInfo: APIサーバーの情報取得

「Steamworks Web API」が稼働しているサーバー情報を取得できます。
レスポンス結果はこんな感じ:

{
  "servertime": [サーバーの現在時刻(unixtimeスタンプ)],
  "servertimestring": [サーバーの現在時刻(文字列)]
}

servertimestringは叩いてみたら、日本時間よりも「-16時間」されていました。
アメリカの西あたりで稼働しているサーバーってことになりますね。

ただ、AWSなどのクラウドサービスを使っていたり、APIサーバーを国単位で分散化していたら全く違う結果が返ってくるかと。
Steamは巨大なプラットフォームですから、流石に分散されているでしょうしね…。

おわりに

今回は、Part1に紹介しそびれてた「野良で叩けるSteam Web API」について見ていきました。

今回で野良で叩けるSteam Web APIは紹介し尽くしましたが…。
Steam Web APIとは別に面白そうなAPIがあるので、次回Partではそちらについて見ていきましょう。

それでは|д゚*)