Steam データ活用

Steam appdetailsの使い方【価格・割引・タグ・発売情報・対応OSを取得】Python最小サンプル

この記事でできること:SteamのStorefront appdetails(非公開仕様)を使って、価格・割引・ジャンル/タグ・発売情報・対応OSなどのストア情報をPythonで取得し、記事やダッシュボードで使いやすい形に整えます。前回の Step2: 公式Web API と併用し、ストア由来の“見せる情報”を補完します。

全体の位置づけは Steamガイド(入口ページ)、AppIDの基本は Step1: AppIDの見つけ方 を参照してください。

appdetailsとは(要点)

  • エンドポイント:https://store.steampowered.com/api/appdetails?appids=<APPID>&cc=jp&l=japanese
  • 非公開仕様のため、将来的な変更リスクあり(堅牢化と監視が前提)。
  • 価格情報(price_overview)、タグ/ジャンル、発売日、対応プラットフォーム(Win/Mac/Linux)、スクショ/動画URL 等を返します。
  • typegame/dlc/software などを判定できます(DLC/サントラの誤選択を回避)。
  • 地域/言語は cc(国)と l(言語)で切替(例:cc=jp, l=japanese)。

よく使うフィールド(抜粋)

欲しい情報JSONパス例補足
正式名称data.name言語 l に依存
タイプ(game/dlc/...)data.typeDLC/バンドル除外に重要
発売日data.release_date.datecoming_soon で未発売判定
価格/割引data.price_overview.finalfinal_formatted(例:¥1,980)も便利
対応OSdata.platforms.{windows,mac,linux}真偽値
ジャンルdata.genres[].description上位ジャンル
タグdata.categories[].description“マルチプレイ”などカテゴリ側にも特徴
サムネ/スクショdata.header_image, data.screenshots[]記事のOGP/カード化に
メタスコアdata.metacritic.score無い場合もあり
おすすめ件数data.recommendations.total“レビュー総量”の目安

クイックスタート(Python最小サンプル)

1タイトルを取得して主要項目を抜き出す

import requests

def appdetails(appid:int, cc="jp", lang="japanese"):
    url = "https://store.steampowered.com/api/appdetails"
    r = requests.get(url, params={"appids": appid, "cc": cc, "l": lang}, timeout=30).json()
    node = r.get(str(appid), {})
    if not node.get("success"):
        return None
    return node.get("data")

def pick_fields(d):
    if not d: return {}
    price = (d.get("price_overview") or {})
    return {
        "name": d.get("name"),
        "type": d.get("type"),
        "release_date": (d.get("release_date") or {}).get("date"),
        "coming_soon": (d.get("release_date") or {}).get("coming_soon"),
        "is_free": d.get("is_free"),
        "price_final": price.get("final"),
        "price_currency": price.get("currency"),
        "price_display": price.get("final_formatted"),
        "platforms": {k:v for k,v in (d.get("platforms") or {}).items()},
        "genres": [g.get("description") for g in (d.get("genres") or [])],
        "categories": [c.get("description") for c in (d.get("categories") or [])],
        "header_image": d.get("header_image"),
        "metacritic": (d.get("metacritic") or {}).get("score"),
        "recommendations": (d.get("recommendations") or {}).get("total"),
    }

appid = 2420510  # 例:HoloCure
data = appdetails(appid)
print(pick_fields(data))

複数タイトルを一括取得(ループ)→ DataFrame化

import time, pandas as pd

def fetch_many(appids:list[int], cc="jp", lang="japanese", sleep=0.3):
    rows = []
    for aid in appids:
        d = appdetails(aid, cc=cc, lang=lang)
        row = {"appid": aid} | pick_fields(d)
        rows.append(row)
        time.sleep(sleep)  # マナー
    return pd.DataFrame(rows)

df = fetch_many([570, 730, 1172470])  # Dota2, CS2, Apex
print(df[["appid","name","price_display","release_date","platforms"]])

非公開仕様のため「まとめ取得」の挙動は将来変わる可能性があります。堅実なのは“1タイトルずつ”のループです。

DLC/バンドルの誤選択を避けるチェックリスト

  • data.type == "game" を基本条件に(DLCやmusicを除外)。
  • data.fullgame が存在する場合は“本体に紐づく追加物”の可能性。
  • data.dlc の配列が長い=本体である可能性が高い(逆にDLC側は fullgame を持つ)。
  • 名称が近い候補は Step1 の手順(あいまい一致→appdetails検証)で確定。

地域・言語(cc / l)の指定

日本向け表示にするには cc=jpl=japanese を付けます。価格通貨や説明文が日本語に寄ります。グローバル比較をする場合は、cc/lを固定して集計するのが無難です。

  • 例:?appids=730&cc=jp&l=japanese
  • 北米比較用:?cc=us&l=english

堅牢化のコツ(実務)

  • successフラグを必ず確認(success==True でない場合はデータ無し扱い)。
  • ネットワーク/一時的障害に備えてリトライ+タイムアウト
  • レスポンスが大きいのでローカルキャッシュ(例:日次更新)。
  • キー存在チェックget(...,{}))で欠損に強く。
  • スクショURLは枚数制限して保存(記事での読み込みを軽くする)。
  • 価格履歴・CCU履歴はappdetails単体では取れないため、別記事(CCU時系列)や外部参照で補完。

小ワザ:記事カード用の最小データ整形

カード辞書の例(タイトル・価格・タグ上位3・ヘッダー画像)

def to_card(d:dict):
    if not d: return {}
    tags = [c.get("description") for c in (d.get("categories") or [])][:3]
    price = (d.get("price_overview") or {})
    return {
        "title": d.get("name"),
        "price": price.get("final_formatted") or ("無料" if d.get("is_free") else None),
        "tags": " / ".join(tags),
        "img": d.get("header_image"),
        "release": (d.get("release_date") or {}).get("date")
    }

card = to_card(appdetails(730))
print(card)

カード化は Steamガイド の「やりたいこと別」導線にも流用できます。

よくある質問(FAQ)

  • Q. 一括取得は可能?
    A. 将来的な互換性のため、ループで1件ずつ取得する方針を推奨します(非公開仕様のため)。
  • Q. 年齢制限タイトルで取れないことがある?
    A. Store側の判定により情報が薄くなる場合があります。取得失敗時はリトライ+代替の地域/言語で再試行し、最終的に欠損処理。
  • Q. 正式タグはどこに?
    A. genres は上位ジャンル、categories は“機能タグ”に近い(マルチプレイ対応 等)。より“人気度”を見る場合は SteamSpy 側のタグ集計も併用。

この先に進む(関連How-to)

  1. 【How-to】レビュー本文の取得と要約(appreviews)
  2. 【How-to】同時接続の自前収集と可視化(時系列)
  3. 【How-to】推定オーナー数とタグ集計(SteamSpy)

入口に戻る:Steamガイド / 前の記事:Steam公式Web APIの使い方 / さらに前:AppIDの見つけ方

免責とポリシー:
appdetails は公式ドキュメント外のエンドポイントです。挙動は予告なく変わる可能性があります。利用規約・法令・引用ルールを遵守の上でご利用ください。

-Steam, データ活用
-, , , , , ,