この記事では、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-dotenvpython-dotenv は、.env からAPIキーを読み込む場合に使います。APIキー不要のAPIだけ試す場合は、requests と pandas だけでも動作します。
共通設定と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))取得結果には、appid と name が含まれます。ゲーム名で部分一致検索したい場合は、以下のようにできます。
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 appdetailsの使い方|価格・発売日・対応OS・ジャンルをPythonで取得
- Steam appreviewsの使い方|レビュー本文・評価サマリーをPythonで取得
- Steam同時接続数を自前収集して可視化する方法|CCUをPythonで定期取得
- SteamのAppIDを確認する方法|URL・検索・API・Python一括取得
- Steam Web APIキーの取得方法|登録・保管・Pythonでの接続確認
- Steamの情報を取得する方法まとめ|公式API・Storefront・SteamSpyの使い分け
まとめ
この記事では、Steam公式Web APIをPythonから利用し、アプリ一覧、同時接続数、実績解除率、実績スキーマ、ニュースを取得する方法を紹介しました。
同時接続数は現在値、実績解除率はプレイヤーの進行傾向、ニュースはアップデートやイベントの背景確認に役立ちます。これらをレビュー本文や評価推移と組み合わせることで、Steamレビュー分析の解釈を補強できます。
次は、Steamストア側の appdetails を使って、価格、発売日、ジャンル、対応OSなどのストア情報を取得していきます。