Steam データ活用

Steam公式Web APIの使い方|アプリ一覧・同時接続・実績・ニュースをPythonで取得

2025年10月17日

この記事では、Steam公式Web APIをPythonから利用し、アプリ一覧、現在の同時接続数、実績解除率、実績スキーマ、ニュースを取得する方法を解説します。

Steamのデータ分析では、レビュー本文やストア情報だけでなく、同時接続数や実績、ニュースなども重要な補助情報になります。たとえば、レビュー評価が変化した時期とニュースやアップデート情報を照らし合わせることで、評価変動の背景を考察しやすくなります。

本記事では、Steam公式Web APIのうち、個人の分析用途で使いやすい代表的なエンドポイントを最小コードで確認します。

この記事でできること

  • Steam公式Web APIで取得できる代表的な情報を理解する
  • GetAppList でアプリ一覧を取得する
  • GetNumberOfCurrentPlayers で現在の同時接続数を取得する
  • GetGlobalAchievementPercentagesForApp で実績解除率を取得する
  • GetSchemaForGame で実績名や説明を取得する
  • GetNewsForApp でSteamニュースを取得する
  • APIキーが必要なAPIと不要なAPIの違いを整理する

想定読者

  • Steamの公開データをPythonで取得したい方
  • Steamレビュー分析に補助データを加えたい方
  • 同時接続数やニュースを分析素材として使いたい方
  • 実績解除率からプレイヤーの進行傾向を見たい方
  • Steam公式Web APIの基本的な使い方を確認したい方

事前準備

この記事では、SteamのAppIDが分かっている前提で進めます。AppIDの確認方法は以下の記事で解説しています。

SteamのAppIDを確認する方法|URL・検索・API・Python一括取得

また、一部のAPIではSteam Web APIキーが必要です。APIキーをまだ取得していない場合は、先に以下の記事を確認してください。

Steam Web APIキーの取得方法|登録・保管・Pythonでの接続確認

今回扱う主なAPI

この記事で扱う主なエンドポイントは以下です。

目的エンドポイントAPIキー主な用途
アプリ一覧ISteamApps/GetAppList不要AppID候補の確認
現在の同時接続数ISteamUserStats/GetNumberOfCurrentPlayers不要現在プレイ中の人数確認
実績解除率ISteamUserStats/GetGlobalAchievementPercentagesForApp不要実績ごとの全体解除率
実績スキーマISteamUserStats/GetSchemaForGame必要実績名・説明・アイコン等の取得
ニュースISteamNews/GetNewsForApp不要アップデート・告知情報の確認

GetAppList は学習や小規模な確認には便利ですが、Steam公式ドキュメントでは現在 deprecated と案内されています。AppIDを正確に確定する場合は、前記事で紹介したストアURL確認や appdetails による検証も併用してください。

使用ライブラリ

この記事では、HTTPリクエストに requests、データ整形に pandas を使います。

pip install -U requests pandas python-dotenv

python-dotenv は、.env からAPIキーを読み込む場合に使います。APIキー不要のAPIだけ試す場合は、requestspandas だけでも動作します。

共通設定とAPIキーの読み込み

まず、APIを呼び出すための共通設定を用意します。APIキーは環境変数または .env から読み込む想定です。

import os
import time
from pathlib import Path

import requests
import pandas as pd

try:
    from dotenv import load_dotenv
except ImportError:
    load_dotenv = None


BASE_URL = "https://api.steampowered.com"


def load_steam_api_key() -> str | None:
    """
    Steam Web APIキーを読み込む。
    APIキー不要のAPIもあるため、見つからない場合は None を返す。
    """
    if load_dotenv is not None:
        load_dotenv()

    api_key = os.getenv("STEAM_WEB_API_KEY")

    if api_key and api_key.strip():
        return api_key.strip()

    return None


STEAM_WEB_API_KEY = load_steam_api_key()

print("APIキーあり:", STEAM_WEB_API_KEY is not None)

GetSchemaForGame のようにAPIキーが必要なAPIを使う場合は、STEAM_WEB_API_KEY が読み込めている必要があります。

共通のリクエスト関数を作る

各APIを安全に呼び出すため、共通のリクエスト関数を作ります。ここでは、タイムアウト、HTTPエラー、JSON変換をまとめて扱います。

def get_json(
    url: str,
    params: dict | None = None,
    timeout: int = 30,
) -> dict:
    """
    指定URLにGETリクエストを送り、JSONをdictで返す。
    """
    params = params or {}

    response = requests.get(
        url,
        params=params,
        timeout=timeout,
    )

    response.raise_for_status()

    return response.json()

実運用ではリトライやログ出力を追加してもよいですが、まずは最小構成で確認します。

GetAppListでアプリ一覧を取得する

GetAppList を使うと、Steam上の公開アプリ一覧を取得できます。レスポンス件数が多いため、毎回APIを呼ぶのではなく、ローカルに保存して再利用するのがおすすめです。

def get_app_list(
    cache_path: str = "steam_applist.csv",
    use_cache: bool = True,
) -> pd.DataFrame:
    """
    Steamの公開アプリ一覧を取得する。
    取得済みCSVがある場合はキャッシュとして利用する。
    """
    cache_file = Path(cache_path)

    if use_cache and cache_file.exists():
        return pd.read_csv(cache_file)

    url = f"{BASE_URL}/ISteamApps/GetAppList/v2/"

    data = get_json(url)

    apps = data["applist"]["apps"]
    df_apps = pd.DataFrame(apps)

    df_apps.to_csv(
        cache_file,
        index=False,
        encoding="utf-8-sig",
    )

    return df_apps


df_apps = get_app_list()

print(df_apps.head())
print("件数:", len(df_apps))

取得結果には、appidname が含まれます。ゲーム名で部分一致検索したい場合は、以下のようにできます。

keyword = "Palworld"

df_match = (
    df_apps[
        df_apps["name"]
        .fillna("")
        .str.contains(keyword, case=False, regex=False)
    ]
    .sort_values("name")
)

print(df_match.head(20))

ただし、GetAppList だけではゲーム本体・DLC・ツールなどの区別が十分に分からない場合があります。AppIDを確定する際は、ストアURLや appdetails で確認してください。

GetNumberOfCurrentPlayersで現在の同時接続数を取得する

GetNumberOfCurrentPlayers を使うと、指定したAppIDの現在の同時接続数を取得できます。

この値は取得時点のスナップショットです。過去の推移を見たい場合は、一定間隔で自前収集して時系列データとして保存する必要があります。

def get_current_players(appid: int) -> int | None:
    """
    指定AppIDの現在の同時接続数を取得する。
    """
    url = f"{BASE_URL}/ISteamUserStats/GetNumberOfCurrentPlayers/v1/"

    params = {
        "appid": appid,
    }

    data = get_json(url, params=params)

    return data.get("response", {}).get("player_count")


appid = 2246340

player_count = get_current_players(appid)

print("AppID:", appid)
print("現在の同時接続数:", player_count)

player_count が整数で返れば取得成功です。0の場合でも、対象タイトルでその時点の接続者が少ないだけの可能性があります。

複数タイトルの同時接続数をまとめて取得する

複数タイトルを比較したい場合は、AppIDリストを用意して一括取得します。

from datetime import datetime, timezone


target_apps = [
    {"appid": 2246340, "title": "Monster Hunter Wilds"},
    {"appid": 1446780, "title": "Monster Hunter Rise"},
    {"appid": 582010, "title": "Monster Hunter: World"},
]

rows = []

for item in target_apps:
    appid = item["appid"]

    rows.append({
        "timestamp_utc": datetime.now(timezone.utc).isoformat(),
        "appid": appid,
        "title": item["title"],
        "player_count": get_current_players(appid),
    })

    time.sleep(0.5)

df_ccu = pd.DataFrame(rows)

print(df_ccu)

時系列で保存したい場合は、取得結果をCSVに追記します。

csv_path = "steam_ccu_log.csv"

file_exists = Path(csv_path).exists()

df_ccu.to_csv(
    csv_path,
    mode="a",
    header=not file_exists,
    index=False,
    encoding="utf-8-sig",
)

同時接続数の継続収集と可視化については、以下の記事で詳しく扱います。

Steam同時接続数を自前収集して可視化する方法|CCUをPythonで定期取得

GetGlobalAchievementPercentagesForAppで実績解除率を取得する

GetGlobalAchievementPercentagesForApp を使うと、指定タイトルの実績ごとのグローバル解除率を取得できます。

解除率を見ることで、多くのプレイヤーが到達している実績や、到達率が低い実績を確認できます。ゲームの進行度や難易度の参考情報として使えます。

def get_global_achievement_percentages(appid: int) -> pd.DataFrame:
    """
    指定AppIDの実績解除率を取得する。
    """
    url = f"{BASE_URL}/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v2/"

    params = {
        "gameid": appid,
    }

    data = get_json(url, params=params)

    achievements = (
        data
        .get("achievementpercentages", {})
        .get("achievements", [])
    )

    df = pd.DataFrame(achievements)

    if not df.empty and "percent" in df.columns:
        df["percent"] = df["percent"].astype(float)
        df = df.sort_values("percent", ascending=False)

    return df


appid = 2246340

df_ach_rate = get_global_achievement_percentages(appid)

print(df_ach_rate.head(10))

実績解除率は、実績の内部名とパーセントで返ります。実績の表示名や説明を見たい場合は、次の GetSchemaForGame を使います。

GetSchemaForGameで実績名・説明を取得する

GetSchemaForGame を使うと、実績の表示名、説明、アイコンURLなどを取得できます。このAPIはSteam Web APIキーが必要です。

APIキーが読み込めていない場合は、先に Steam Web APIキーの取得方法|登録・保管・Pythonでの接続確認 を確認してください。

def get_schema_for_game(
    appid: int,
    api_key: str,
    lang: str = "japanese",
) -> dict:
    """
    指定AppIDの実績・統計スキーマを取得する。
    APIキーが必要。
    """
    url = f"{BASE_URL}/ISteamUserStats/GetSchemaForGame/v2/"

    params = {
        "key": api_key,
        "appid": appid,
        "l": lang,
        "format": "json",
    }

    data = get_json(url, params=params)

    return data.get("game", {})


if STEAM_WEB_API_KEY is None:
    raise RuntimeError("STEAM_WEB_API_KEY が見つかりません。")

appid = 2246340

schema = get_schema_for_game(
    appid=appid,
    api_key=STEAM_WEB_API_KEY,
)

achievements = (
    schema
    .get("availableGameStats", {})
    .get("achievements", [])
)

df_schema = pd.DataFrame(achievements)

print("gameName:", schema.get("gameName"))
print("実績数:", len(df_schema))
print(df_schema.head())

取得した実績スキーマには、実績内部名、表示名、説明、アイコンURLなどが含まれます。解除率データと結合すると、読みやすい実績一覧を作れます。

実績解除率と実績名を結合する

実績解除率は内部名だけだと読みづらいため、GetSchemaForGame の結果と結合します。

if not df_ach_rate.empty and not df_schema.empty:
    df_ach = df_ach_rate.merge(
        df_schema,
        left_on="name",
        right_on="name",
        how="left",
    )

    cols = [
        "name",
        "displayName",
        "description",
        "percent",
        "icon",
    ]

    existing_cols = [
        col for col in cols
        if col in df_ach.columns
    ]

    df_ach = df_ach[existing_cols]

    print(df_ach.head(10))

    df_ach.to_csv(
        "steam_achievement_rates.csv",
        index=False,
        encoding="utf-8-sig",
    )

このCSVを保存しておくと、記事内の実績紹介、難易度の目安、プレイヤー進行度の補助指標として使えます。

GetNewsForAppでニュースを取得する

GetNewsForApp を使うと、指定AppIDに関連するSteamニュースを取得できます。アップデート、イベント、パッチノートなどの情報を確認する際に便利です。

def get_news_for_app(
    appid: int,
    count: int = 5,
    maxlength: int = 300,
) -> pd.DataFrame:
    """
    指定AppIDのニュースを取得する。
    """
    url = f"{BASE_URL}/ISteamNews/GetNewsForApp/v2/"

    params = {
        "appid": appid,
        "count": count,
        "maxlength": maxlength,
        "format": "json",
    }

    data = get_json(url, params=params)

    newsitems = (
        data
        .get("appnews", {})
        .get("newsitems", [])
    )

    df_news = pd.DataFrame(newsitems)

    if not df_news.empty and "date" in df_news.columns:
        df_news["datetime_utc"] = pd.to_datetime(
            df_news["date"],
            unit="s",
            utc=True,
        )

    return df_news


appid = 2246340

df_news = get_news_for_app(
    appid=appid,
    count=5,
    maxlength=300,
)

print(df_news[["title", "url", "datetime_utc"]].head())

ニュース取得結果は、レビュー件数や評価推移と合わせて見ると便利です。特定のアップデートやイベント後にレビュー傾向が変わっていないかを確認できます。

代表的なデータをまとめて取得する

最後に、1つのAppIDについて、同時接続数、実績解除率、ニュースをまとめて取得する関数を作ります。

def collect_steam_api_summary(
    appid: int,
    api_key: str | None = None,
) -> dict:
    """
    Steam公式Web APIから代表的な情報をまとめて取得する。
    """
    result = {
        "appid": appid,
        "player_count": None,
        "achievement_rate_count": 0,
        "achievement_schema_count": None,
        "news_count": 0,
    }

    # 現在の同時接続数
    result["player_count"] = get_current_players(appid)

    # 実績解除率
    df_rates = get_global_achievement_percentages(appid)
    result["achievement_rate_count"] = len(df_rates)

    # 実績スキーマ
    if api_key:
        schema = get_schema_for_game(
            appid=appid,
            api_key=api_key,
        )

        achievements = (
            schema
            .get("availableGameStats", {})
            .get("achievements", [])
        )

        result["achievement_schema_count"] = len(achievements)

    # ニュース
    df_news = get_news_for_app(
        appid=appid,
        count=5,
        maxlength=300,
    )

    result["news_count"] = len(df_news)

    return result


summary = collect_steam_api_summary(
    appid=2246340,
    api_key=STEAM_WEB_API_KEY,
)

print(summary)

このように代表指標をまとめて取得しておくと、レビュー分析記事や比較記事の前処理として使いやすくなります。

取得結果を見るときの注意点

Steam公式Web APIの取得結果を見るときは、以下の点に注意してください。

  • 同時接続数は取得時点の値
    過去推移を見たい場合は、自分で定期収集する必要があります。
  • GetAppListだけでAppIDを確定しない
    DLCやツールなどが混ざる場合があるため、ストアURLや appdetails で確認します。
  • 実績がないタイトルもある
    解除率やスキーマが空でも、APIエラーとは限りません。
  • ニュースが空の場合もある
    対象タイトルに最近のニュースがない、または取得条件に合うニュースがない場合があります。
  • APIキーが必要なAPIと不要なAPIがある
    GetSchemaForGame はAPIキーが必要です。
  • 短時間に大量リクエストしない
    複数タイトルを取得する場合は、sleep を入れて間隔を空けます。

レビュー分析での活用例

Steam公式Web APIで取得した情報は、レビュー分析と組み合わせると使いやすくなります。

取得情報レビュー分析での使い方
同時接続数レビュー件数や評価変化とプレイヤー数の関係を見る
実績解除率プレイヤーの進行度や離脱ポイントの参考にする
実績スキーマ実績名・説明を使って読みやすい表を作る
ニュースアップデートやイベント後のレビュー変化を確認する
アプリ一覧AppID候補の検索や対象タイトルリスト作成に使う

たとえば、特定の月に低評価レビューが増えた場合、その前後のニュースやアップデート内容を確認することで、評価変化の背景を考察しやすくなります。

次に読む記事

まとめ

この記事では、Steam公式Web APIをPythonから利用し、アプリ一覧、同時接続数、実績解除率、実績スキーマ、ニュースを取得する方法を紹介しました。

同時接続数は現在値、実績解除率はプレイヤーの進行傾向、ニュースはアップデートやイベントの背景確認に役立ちます。これらをレビュー本文や評価推移と組み合わせることで、Steamレビュー分析の解釈を補強できます。

次は、Steamストア側の appdetails を使って、価格、発売日、ジャンル、対応OSなどのストア情報を取得していきます。

-Steam, データ活用