Aikの技術日記

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

Steam APIについてまとめてみた Part1

はじめに

こんにちは、筆者です。

最近も相変わらずニコ動だったり技術記事漁ったりしていますが…。
ほんの数週間前まではSteam系のゲーム…果てはそのゲームのMOD制作に没頭してました。

そうして幾つかMODを作っている内、Steam自体に興味を持つ様になり…。
「SteamってTwitterみたいにAPIないかな!? あったら色々遊べる活用できるのに!!」
…と思い、SteamAPIに関するまとめ記事を投稿するに至った次第です。
(Steam APIに関するまとめ記事って驚くほど少ないですし…)

調べてみると、SteamのAPIにはどうもsecret_keyaccess_tokenが不要な、いわゆる「野良でも叩ける」範囲でもそこそこ使えそうなAPIがあるとのことなので…。
今回はそういうAPIについてまとめていこうかと思います。
※結構量があるのでPart分割しています

前置きが長くなっちゃいましたね…。
それでは本題にいきましょう。

Steam APIの全体像

まず、Steam APIの全体像から見ていきましょう。

Steam APIは、大きく分けると下記の2種類があります:

  • Steamwork SDKを経由し叩く「Steamworks API
  • Webから叩ける「Steamworks Web API

Steamworks SDKについては、Steamworksアカウントに登録した後でダウンロードできるツールとなっております。野良(secret_keyaccess_token無しで使う)ではもちろん叩けません。

また、Steamworks Web APIについても:

  1. 野良で叩けるAPI
  2. Steamworksアカウントが必要なAPI

…に分かれています。

特に、(2)については単なるSteamworksアカウントではなく「管理者権限」を持ってないとダメな様子です…Steamwork SDKと比べて、使用条件はちょっと厳しそうですね。
詳しくはこちらを→Authentication using Web API Keys (Steamworks Documentation)

ちなみに、(1)で叩けるAPIには「特定ゲームのニュースリリース一覧を取得する」様なAPIや、面白そうなのだと「特定ゲームの全ユーザーの実績獲得率を確認できる」物まであります。

…が、当然のことながらどれも「情報を取得する」ところまでしかできません。投稿だったり情報の書き換え等はできない感じです。
情報の書き換えや投稿については、(2)のタイプのAPIを使用することになります。
(2)には、面白い物だと「チート行為を報告できるAPI」もあったりします。こういうのもAPI化されているんですね…。

全体像としてはここまで、お次は「Steamworks Web APIの中でも野良で叩けるAPI」について見ていきましょう。

Steamで野良でも使用可能なAPI一覧

まずはどんなAPIがあるか、カテゴリごとに見ていきましょう。

なおメインの情報源としては公式Docsを参考にしてます: https://partner.steamgames.com/doc/webapi
…が、公式Docsに載ってない謎パラメータがいっぱいあるので、そちらについては別記事で情報を保管してます。悪しからず。

※また、本情報は2020/08~10頃にDocsを見て確認した情報です、現状とは異なる可能性があるのでご注意を

カテゴリ一覧

  • ISteamApp: Steam上に公開しているアプリケーション(ゲーム)情報を取得できる
  • ISteamNews: ニュース情報を取得できる
  • ISteamRemoteStorage: Steamワークショップ, UGCコンテンツ情報を取得できる
  • ISteamUserStats: Steam登録ユーザーの情報を取得できる
  • ISteamWebAPIUtil: Steamworks Web APIサーバー自身の情報を取得できる

また、Steamworks Web APIという括りではないですが「レビュー取得」が可能なAPIも存在します。
野良で叩ける範囲でも結構色々できそうですね…。

本Partでは上2つのカテゴリについてまとめていこうかと思います。
他のカテゴリについては次Part以降にまとめていければと。

ここからは、カテゴリごとにどんなAPIがあるか見ていきましょう。

ISteamApp

Steam上に公開しているアプリケーション(ゲーム)情報取得ができるAPIです。
ここで取得できる情報は、「アプリ名(ゲーム名)」や他APIで使用する「アプリID」といったものになります。

GetAppList: Steam上の全てのアプリ情報取得

Steamに公開中の全てのアプリ情報を取得できます。
なお、追加DLCも「1つのアプリケーション」として取得されますのでご注意を。

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

"applist":
  "apps" [
    {
      "appid": [アプリID(number)],
      "name": [アプリ名(string)]
    }
  ]

使用上の注意点として…。
文字通り、Steam上の全アプリの情報を引っ張ってくるため、レスポンスがめちゃくちゃ重いです。
数十秒待つ程度では、完全なレスポンス結果を取得できないレベルです…ご注意を。

GetServersAtAddress: ゲームサーバー情報を取得

APIについては、公式Docsに説明がなかったので…下記のサイトの情報を参考にしています。
https://forums.alliedmods.net/archive/index.php/t-192365.html
https://wiki.teamfortress.com/wiki/WebAPI/GetServersAtAddress

APIはサーバーのIPアドレスを指定して、ゲームサーバー情報を取得できる…らしいです。
オンライン対戦系のSteamゲーをやったことがないからか、筆者にはどういったシーンで利用するのかわかりませんが…。

レスポンスはこんな感じとのこと:
serversには空情報が返ってくることもあります。

{
  "response":{
    "success": [リクエストが成功したかどうか(Boolean)],
    "servers":[{
      "addr": "92.97.220.205:27016",
      "gmsindex":65534,
      "appid":10,
      "gamedir":"cstrike",
      "region":6,
      "secure":true,
      "lan":false,
      "gameport":27016,
      "specport ":0
    }]
  }
}
UpToDateCheck: ?? ?

これについては…公式Docsに詳細な説明がなかった上、使ってみてもよくわからなかったので…。
下記の記事を参考に、どんな情報が返却されるかだけ記します。
https://wiki.teamfortress.com/wiki/WebAPI/UpToDateCheck

{
  "response":
  {
    "success": [リクエストが成功したかどうか(Boolean)],
    "up_to_date": [指定されたバージョン番号が最新バージョンであるかどうか(Boolean)],
    "version_is_listable": [指定されたバージョンをパブリック変更ログにリストできるかどうかを示す(Boolean)],
  }
}

なお、有効でないversionを引いた場合は下記の様なレスポンスが返ってきます。

{
  "response":
  {
    "success":true,
    "up_to_date":false,
    "version_is_listable":false,
    "required_version": [有効なバージョン番号],
    "message":"Your server is out of date, stranger."
  }
}

この場合、required_versionに示される番号をversionに指定して、再度リクエストを投げると正常データが返ってきます。

ちなみに、本APIに対応していないアプリケーションもあるっぽいです…。
冒頭で述べた「Library of Ruina」は対応していないっぽく、下記の様なレスポンスが返ってきました。

{"response":{"success":false,"error":"Couldn't get app info for the app specified."}}

ISteamNews

Steam各アプリの「コミュニティハブ > ニュース」情報を取得できます。
野良で叩けるものは1つだけです。

GetNewsForApp: 指定アプリのニュース情報を取得
  • URL[GET] https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/
  • 必須パラメータ:
    • appid[uint32]: アプリ固有のID
  • オプション(必須ではない)パラメータ:
    • maxlength[uint32]: レスポンス内のcontentsの最大長を指定可能。0or指定なしの場合contents全体が返却される。
    • enddate[uint32:unixタイムスタンプ]: ここで指定した日付よりも前の投稿を取得できる
    • count[uint32]: 取得する投稿数(デフォルト:20件)
    • feeds[string]: ニュースを返すフィード名のコンマ区切りリスト

指定したアプリのニュース情報を取得できます。

レスポンス結果はこんな感じ:
※これに限った物ではないですが、公式Docsには返却値の説明がないので推測な部分が多々あります。

{
  "appnews":
  {
    "appid": [アプリID],
    "newsitems":
      [
        {
          "gid": [そのニュースの固有ID],
          "title": [ニュースタイトル],
          "url": [そのニュースへのリンク],
          "is_external_url": [指定されたURLが外部Webサイトへのリンクかどうか/Steamストアにリンクしている場合はfalse],
          "author": [ニュース執筆者],
          "contents": [ニュース本文],
          "feedlabel": [ニュースのカテゴリラベル(Community AnnouncementsだったりThe Loadoutだったり…多分投稿者が任意で決めれる)],
          "date": [投稿日(unixタイムスタンプ形式)],
          "feedname": [ニュースアイテムのソースを説明する内部タグ],
          "feed_type": [フィードの種類(数値), 各数値が何を示すかは謎],
          "appid": [アプリID],
          "tags":[タグ(patchnotes, mod_reviewed…多分投稿者が任意で決めれる)]
        }
      ]
      "count": [記事数]
  }
}

普段のニュース画面ではみられないいろんな情報が見れちゃいます。
また、これまでのAPIにはなかったオプションパラメータがあるので、まだ使いやすいかなと思います。

なお、appidは先に紹介したGetAppListAPIから拾えます。
…が、全部取得するAPIから目当てのものを拾うのは現実的ではないので…URLを活用するのがいいかもです。

例えばLibrary of RuinaのストアページURLは下記になってますが:
https://store.steampowered.com/app/1256670/Library_Of_Ruina/

この、/app/の後に続く数値がそのままappidになってます。
ここから取得した方が早いでしょう…。

おわりに&次回記事へ…

今回はSteam APIの概要やその種類、そして野良で叩けるAPIの一部を紹介しました。
今回記事で全部は紹介しきれなかったので…残りの4カテゴリ:

  • ISteamRemoteStorage: Steamワークショップ, UGCコンテンツ情報を取得できる
  • ISteamUserStats: Steam登録ユーザーの情報を取得できる
  • ISteamWebAPIUtil: Steamworks Web APIサーバー自身の情報を取得できる
  • レビュー取得API

…については次回以降にまとめていければと思います。
これだけ叩けるAPIがあるなら、色々と夢が膨らみそうだなと思いつつ…。

それでは|д゚*)