Aikの技術日記

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

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

はじめに

こんにちは、筆者です。

前回、前々回の記事にて、Steam APIの概要や野良で叩けるSteam Web APIについてまとめていきました。
今回はSteam Web APIには分類されない面白そうなAPI、「レビュー取得API」についてみていきます。
※このAPIも野良で叩けます

それではいきましょう。

レビュー取得APIについて

執筆当時の段階では、レビュー取得APIには大きく分けて下記の2つがある様です:

  1. レビューの内容を取得するAPI
  2. レビューのヒストグラムを取得するAPI

それぞれ詳しく見ていきましょう。

レビュー内容取得API

  • URL[GET] https://store.steampowered.com/appreviews/[appidを入力]?json=1
  • オプションパラメータ:
    • filterstring: 並び順を指定可能、値には下記の値を指定
      • [recent]: 作成日時の降順
      • [updated]: 最終更新日時の降順
      • [all] (デフォルト値): 有用性順(「参考になった」順)、後述するday_rangeパラメータと一緒に使う
    • day_rangestring: 有用性順の日時範囲を指定可能(?)、filter>[all]パラメータと一緒に使う
      • 例えば「参考になった」レビューの中でも「3日前までのものを取得したい」場合はここに3日前と指定する
    • languagestring: レビューの言語を指定
      • 指定可能な値はここの「サポート言語>API言語コード」を参照
      • 言語を指定しない場合は[all]と指定
    • review_typestring:レビューの種類を指定できる, 下記の値を指定
      • [positive]: 肯定的なレビュー
      • [negative]: 否定的なレビュー
      • [all] (デフォルト値): すべて
    • purchase_typestring: レビュー投稿者のアプリ購入経路を指定できる, 下記の値を指定
      • [steam] (デフォルト値): アプリをSteam上で購入したユーザー
      • [non_steam_purchase]: アプリをSteam上で購入しなかったユーザー
      • [all]: すべて
    • num_per_pagestring: レビュー取得最大件数を指定可能(最大100まで)
      • 指定しない場合=20が指定される
    • cursorstring: リクエストのページ指定が可能、詳しくは後述

このAPIは、Steam上の特定アプリの「レビュー」を様々な条件でフィルタリングして表示できます。
レスポンス結果はこんな感じ:

{
  "success": [リクエストの成功フラグ。成功時=1],
  "query_summary": {
    "num_reviews": [取得したレビュー数],
    "review_score": [レビュースコア(数値)],
    "review_score_desc": [レビュースコア説明(「非常に好評」,「圧倒的に好評」などが入る)],
    "total_positive": [肯定的なレビュー総数],
    "total_negative": [否定的なレビュー総数],
    "total_reviews": [クエリパラメータと合致するレビュー総数(全レビューの総数ではない)]
  },
  "reviews": [{
    "recommendationid": [「おすすめ」の固有ID],
    "author": {
      "steamid": [ユーザーのSteamID],
      "num_games_owned": [ユーザーが所有するゲーム数],
      "num_reviews": [ユーザーが投稿したレビュー数],
      "playtime_forever": [ユーザーの対象アプリの通算プレイ時間],
      "playtime_last_two_weeks": [ユーザーの対象アプリの直近2週間のプレイ時間],
      "playtime_at_review": [ユーザーの対象アプリのレビュー記載時点のプレイ時間],
      "last_played": [ユーザーの最終プレイ時間(unixタイムスタンプ)]
    },
    "language": [言語],
    "review": [レビュー内容],
    "timestamp_created": [レビュー作成日(unixタイムスタンプ)],
    "timestamp_updated": [レビュー最終更新日(unixタイムスタンプ)],
    "voted_up": [true=「肯定的なおすすめ」レビューと判定されたレビュー],
    "votes_up": [「参考になった」と評価したユーザー数],
    "votes_funny": [「面白い」と評価したユーザー数],
    "weighted_vote_score": [「参考になった」スコア(単位:%)],
    "comment_count": [このレビューに対するコメント数],
    "steam_purchase": [true=このレビュー作成者がSteamで対象ゲームを購入した],
    "received_for_free": [true=レビュー投稿時に「アプリを無料で入手した」にチェック],
    "written_during_early_access": [true=アーリーアクセス期間中にレビューを投稿した],
    "developer_response": [開発元からのこのレビューへのコメント(無い場合はプロパティごと存在しない)],
    "timestamp_dev_responded": [開発元からのこのレビューへのコメント投稿日時(unixタイムスタンプ)(無い場合はプロパティごと存在しない)]
  }],
  "cursor": [条件に合うレビューが20個より多い場合に付与, 次のリクエストのcursorにこの値をつけることで21個目以降のレビューを取得可能]
}

基本的にはSteamストア上で見れる情報ばかりですが、votes_upvotes_funnyなどデータとして取得できると色々と可能性がありそうなパラメータもありますね。
※参考記事: User Reviews - Get List (Steamworks Documentation)

以下、個別で解説が必要なパラメータについての補足をば…。

オプションパラメータcursorの補足

本パラメータは「全レビューを取得したい」時に使用するものです。

というのも、本APIのレビュー最大取得件数が100件である都合上、条件に合致するレビューが100件以上ある場合、1リクエストで全てのレビューを取得できないため…。
101件目以降のレビューも取得できる様に、本APIでは「100件以上該当レビューがある場合、レスポンスにcursorという値も一緒に返される」様になっています。

そして、次リクエスト時に「レスポンス内のcursor」をパラメータに付与することで、101件目以降のレビューも取得できる様になっています。
次リクエスト(101件目のレビュー~200件目までのレビュー取得)時に、「201件以降も該当レビューがある場合」は再度レスポンスにcursorという値も一緒に返されるので…。
そのまた次のリクエスト時にその値を使うことで、無限にレビューを取得できる、という仕組みです。

ちなみにですが、返却されるcursorの値は「URLEncodedが必要な文字が含まれている」可能性があるそうなので…。
使用する時は、念のためURLEncodedしてから使用した方が良さそうです。

レスポンスパラメータreceived_for_freeの補足

Steamでは「アプリを無料で入手する」方法があり、例えば:

  • Steamフレンドにプレゼントしてもらう
  • 何らかの方法でSteamキー(製品の無料化コード)を入手し、それ経由で入手する

…といった形でアプリを無料で入手できるのです。
ただ、この情報はSteam上には保持されていない(もしかしたら保持されてるかもですが)ためか…。
「上記の方法で入手したプレイヤーのレビュー」と、「お金を支払って入手したプレイヤーのレビュー」は区別して表示されません。

無料で入手したプレイヤーの中でも、例えば「フレンドからのプレゼント」で入手した方などは、下手すると「そのゲームが自分に合わないのにプレイした」場合だってありますよね。
(もちろん普通に購入したユーザーでもその場合になるケースはあるでしょうが)
また、クラウドファンディングに参加した特典ならともかく「自分でお金を出して買ったわけでは無い」プレイヤーと、「お金を支払って入手した」プレイヤーとでは感じる感想が変わるかもしれません。

そういったことへの配慮のためか、Steamのレビューでは「アプリを無料で入手した場合」にチェックを入れられる機能があります。
received_for_freeはこのチェックを入れたかどうかを見れる、というわけですね。

この値をどう処理するかはAPIの利用者次第ですが…工夫すれば面白い結果が得られるかもしれませんね。

ただ、前述の通り「このチェックボックスにチェックを入れるかはレビュー投稿者が任意で選べる」ものです。
チェックボックスにチェック入れ忘れた」とか「故意にチェックを入れなかった」場合は取得できないので、その辺りは注意が必要です。

レビューヒストグラム取得API

こちらは「レビューのヒストグラムデータ」を取得できるAPIです。
ここでいうヒストグラムというのは、Steamストア上にある下記のグラフのことを指します:

"レビューのヒストグラム"
これこれ

ちなみに本APIに関する情報は、公式Docsからは見つかりませんでした…筆者の調査不足かもしれませんが…。
というか、本APIに関してはネットで検索しても下記のQiita記事しかヒットしません:

Steamに登録されている大量のゲームから埋もれている名作を見つけ出す - Qiita

…というわけで、レスポンス結果の値が何を示すのかは「筆者の推測」となっています…ご了承ください。
レスポンス結果はこんな感じ:

{
  "success": [リクエストの成功フラグ。成功時=1],
  "results": {
    "start_date": [集計開始日(unixタイムスタンプ)],
    "end_date": [集計終了日(unixタイムスタンプ)],
    "weeks": [],
    "rollups": [{ヒストグラムデータ
      "date": [対象期間(unixタイムスタンプ)],
      "recommendations_up": [対象期間中の肯定的なレビューの投稿数],
      "recommendations_down": [対象期間中の否定的なレビューの投稿数]
    }
    {...以降同一フォーマットのデータが並ぶ、恐らくヒストグラムグラフの1項目を示すデータ}
    ],
    "rollup_type": [上記`rollups`の対象期間がどんな区切りで示されているかを示す, "week"や"month"などが入る],
    "recent": [{直近のヒストグラムデータ
      "date": [対象期間(unixタイムスタンプ)],
      "recommendations_up": [対象期間中の肯定的なレビューの投稿数],
      "recommendations_down": [対象期間中の否定的なレビューの投稿数]
    }]
  },
  "count_all_reviews": [謎値, truefalseが入る],
  "expand_graph": [謎値, truefalseが入る],
}

参考情報がめちゃくちゃ少なくちょっと謎なAPIですが、レビューの総括が見れる様なAPIなので…。
使いこなせればとても優秀そうなAPIですね。

以上で「野良で叩けるSteam API」は以上になります。
ここからは筆者のちょっとした感想を述べていければ。
(必要ないならおわりにまで読み飛ばしてください)

総括

ここまで「野良で叩けるSteam API」を見てきましたが、基本的にはデータを取得するだけAPIしか叩けないなという印象です。
いやそりゃそうなんですけどね…野良でデータの書き換えが出来てしまうのはセキュリティ的にまずいと思うので。

野良では叩けないAPIには、データ操作が可能なAPIもゴロゴロあります。
もちろんその中でも、「開発元が特別に発効しないといけないKey」が必要なAPIもあるので…。
本気でこなし尽くしたいのであれば、開発元と協力関係となりKeyを入手するか…。
自分で作ったゲームをSteamにあげ、それで試すかのどっちかとなると思います。

ただ、野良から叩ける範囲でもこれだけ面白そうな情報が取れるのは非常に興味深いです。
(Twitter APIは過去に散々悪用されてから、API使用が厳しくなった経緯がありますが…Steam APIについてはまだそういった悪用事例が少ないのかなぁと邪推してみたり。)

特にレビュー取得APIについては、実に様々な情報が得られるので活用しがいがありそうです。
他にも「アクティブユーザー数を取得するAPI」も楽しそうですね。
そのゲームコミュニティの活性度が伺えそうです!

おわりに

今回の記事では、Part1, 2に続き野良で叩けるSteam APIを見ていきました。
今回でこれらAPIについては紹介尽くしたので、本シリーズは今記事で終了です。

本当は1記事にまとめようと思ったのですが…。
執筆途中に文字数が10000文字を超え出したあたりで「これやべぇ」と思い、分割しちゃいました。
流石に分割しすぎかな〜と思いましたが、分割した方が不思議と投稿モチベも上がるので良かったのかなぁと。

今後はまとめ上げたAPIを使って、何か面白いツールでも作ってみようかなと思います(時間があれば)。
特に、Part1で話したLibrary of Ruinaについては大好きなゲームということもあり、色々調べたいですね…。

最後に1つ余談を。
APIまで使いたくはないけど、Steamのいろんなデータを見たい!」という方に必見なのが、「Steam統計」というものです。

Steamでの「現在最もプレイヤー数が多いゲーム」や、「Steamユーザーの使用PC比率」など面白いデータがたくさん見れる場所となっております…!
アクセス方法については、下記の記事に詳しく書かれていたので参考に。

【同時接続数/GPU/見方】Steam統計で調べられる項目一覧 | PCゲームガイダンス

それでは|д゚*)