Steam価格監視システム - セール時の過去最安値更新を検知し、高機能WebアプリケーションとDiscord通知で情報提供するシステム
SteamSentinelは、Steam(Steam)+ Sentinel(見張り番)の名前の通り、ゲーム価格の忠実な見張り役として動作します。監視対象のゲームが過去最安値を更新したり、セールが開始された際に自動的にアラートを発生させます。
TypeScript完全対応と**SPA(Single Page Application)**アーキテクチャにより、企業レベルのWebアプリケーションとして設計されています。
- ✅ 価格監視: 設定したゲームの価格を定期的にチェック
- ✅ アラート機能: 歴代最安値更新またはセール開始時に通知
- ✅ SPA Webダッシュボード: TypeScript製のシングルページアプリケーション
- ✅ 価格推移グラフ: Chart.jsによる美しい価格履歴の可視化
- ✅ レスポンシブデザイン: デスクトップ・タブレット・モバイル対応
- ✅ ダークモード: 目に優しいダークテーマ
- ✅ リアルタイム更新: 手動更新と自動監視
- ✅ プリセットゲーム: 人気ゲーム100タイトル内蔵
- ✅ 拡張価格閾値: 価格・割引率・セール開始の3つのアラート条件
- ✅ ゲーム管理画面: 監視無効ゲーム含む全ゲーム管理・編集機能
- ✅ データベースマイグレーション: 自動バージョン管理とスキーマ更新
- ✅ 包括的バックアップ: エクスポート/インポート、3つのモード対応
- ✅ Discord連携: Webhook通知、リッチEmbed対応
- ✅ 出費追跡ダッシュボード: 月間/年間出費統計、節約額表示
⚠️ 高割引ゲーム動的検知: 80%以上割引検知(基盤実装済み)⚠️ レビュー統合表示: Steam/Metacritic/Reddit評価統合(基盤実装済み)- ✅ リリース日管理: 未リリースゲームの発売日追跡
⚠️ Epic Games無料ゲーム通知: RSS Feed対応(基盤実装済み)
- ✅ TypeScript完全対応: フロントエンド・バックエンド共に型安全
- ✅ SPAアーキテクチャ: クライアントサイドルーティング、統一ナビゲーション
- ✅ 企業レベルセキュリティ: CSP、Helmet.js、レート制限
- ✅ リアルタイム監視進捗: 進捗バー、残り時間表示、失敗件数カウント
- ✅ 詳細エラー報告: 失敗理由詳細分析、カテゴリ別分類、統計表示
- Node.js: 18.0.0以上
- npm: Node.jsに同梱
- OS: Windows, macOS, Linux
git clone https://github.com/your-username/steam-sentinel.git
cd steam-sentinelnpm install# .env.exampleをコピーして.envファイルを作成
cp .env.example .env
# .envファイルを編集してAPIキーを設定
nano .env# IsThereAnyDeal API (必須)
ITAD_API_KEY=your_itad_api_key_here# Discord通知 (オプション)
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
# サーバー設定
WEB_PORT=3000
WEB_HOST=127.0.0.1
# 監視設定
MONITORING_INTERVAL_HOURS=1npm run db:initnpm run seed:games# 開発モード
npm run dev
# 本番モード
npm run build
npm startブラウザで http://localhost:3000 にアクセス
- https://isthereanydeal.com/dev/app/ にアクセス
- メールアドレスとアプリ名を入力して登録
- 発行されたAPIキーを
.envファイルに設定
ITAD_API_KEY=your_generated_key_here- Discordサーバーの設定 → 連携サービス → ウェブフック
- 新しいウェブフックを作成
- WebhookのURLを
.envファイルに設定
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/123456789/abcdef...- ゲーム追加: ダッシュボードの「ゲーム追加」ボタンをクリック
- 価格確認: ゲーム一覧で現在価格・セール情報・歴代最安値を確認
- グラフ表示: ゲーム名をクリックして価格推移グラフを表示
- 手動更新: 「手動更新」ボタンで即座に価格をチェック
Ctrl+R/Cmd+R: 手動更新Ctrl+A/Cmd+A: ゲーム追加モーダルを開くCtrl+D/Cmd+D: ダークモード切り替えESC: モーダルを閉じる
- SteamストアページのURLからApp IDを取得
- 例:
https://store.steampowered.com/app/730/→ App ID:730
- 例:
- ダッシュボードで「ゲーム追加」をクリック
- App IDとゲーム名を入力
- 必要に応じて価格閾値を設定
- 「追加」ボタンをクリック
# 環境変数で設定(時間単位)
MONITORING_INTERVAL_HOURS=1 # 1時間ごと(デフォルト)# 同じアラートの連続送信を防ぐ(時間単位)
NOTIFICATION_COOLDOWN_HOURS=6 # 6時間(デフォルト)# 価格履歴の保持期間(日数)
DATA_RETENTION_DAYS=365 # 1年間(デフォルト)steam-sentinel/
├── src/
│ ├── api/ # 外部API統合
│ ├── config/ # 設定管理
│ ├── controllers/ # API コントローラー
│ ├── db/ # データベース管理
│ ├── middleware/ # Express ミドルウェア
│ ├── models/ # データモデル
│ ├── routes/ # APIルート
│ ├── services/ # ビジネスロジック
│ ├── types/ # TypeScript型定義
│ └── utils/ # ユーティリティ
├── public/ # 静的ファイル
│ ├── css/ # スタイルシート
│ ├── js/ # JavaScript
│ └── index.html # メインHTML
├── scripts/ # セットアップスクリプト
├── data/ # データベースファイル
└── logs/ # ログファイル
- Node.js: JavaScript ランタイム
- TypeScript: 型安全性(27ファイル完全対応)
- Express.js: Webフレームワーク
- better-sqlite3: 高速データベース
- node-cron: スケジューラー
- Winston: ログ管理
- Helmet.js: セキュリティ強化
- TypeScript SPA: 360行のクライアントサイドルーター実装
- 統一ナビゲーション: 250行の動的ナビゲーション実装
- Chart.js: 価格推移グラフ描画
- History API: ブラウザ履歴管理
- IsThereAnyDeal API: 価格情報取得(v2対応)
- Steam Store API: Steam価格情報
- Discord Webhook: リッチEmbed通知送信
- Steam CDN: ゲームバナー画像取得
# 開発サーバー起動
npm run dev
# TypeScriptコンパイル
npm run build
# リンティング
npm run lint
# 型チェック
npm run typecheck
# データベース初期化
npm run db:init
# プリセットゲーム投入
npm run seed:games- レート制限: API呼び出し頻度を制限(開発環境では無効化)
- 入力検証: SQLインジェクション・XSS対策
- CSP (Content Security Policy): 適切なセキュリティヘッダー設定
- Helmet.js: 包括的なセキュリティ保護
- TypeScript型安全性: コンパイル時型チェックによるバグ防止
- 対象ゲーム数: 100ゲーム推奨(上限なし)
- 監視間隔: 10分〜24時間(設定可能)
- メモリ使用量: 約256MB(100ゲーム監視時)
- API制限: ITAD 2秒間隔、Steam 3秒間隔
- 監視進捗: リアルタイム進捗表示、残り時間推定
- better-sqlite3: 高速ファイルベースDB(移植性重視)
- 価格履歴: 最大1年間保持
- マイグレーション: 自動バージョン管理とスキーマ更新
- 包括的バックアップ: エクスポート/インポート、3つのモード対応
- 自動クリーンアップ: 古いデータの定期削除
ITAD_API_KEY is not configured
→ .envファイルにITAD APIキーが設定されているか確認
Port 3000 is already in use
→ .envファイルでWEB_PORTを変更するか、他のアプリケーションを停止
Database integrity check failed
→ npm run db:initでデータベースを再初期化
# ログファイルの確認
tail -f logs/steam-sentinel-$(date +%Y-%m-%d).log
# エラーログの確認
tail -f logs/error-$(date +%Y-%m-%d).log問題が解決しない場合は、以下の情報を含めてIssueを作成してください:
- OS情報
- Node.jsバージョン
- エラーメッセージ
- ログファイル(機密情報は除く)
このプロジェクトはMITライセンスの下で公開されています。詳細はLICENSEファイルを参照してください。
プルリクエストやIssueの報告を歓迎します。大きな変更を行う前に、まずIssueで議論することをお勧めします。
- このリポジトリをフォーク
- 機能ブランチを作成 (
git checkout -b feature/amazing-feature) - 変更をコミット (
git commit -m 'Add some amazing feature') - ブランチにプッシュ (
git push origin feature/amazing-feature) - プルリクエストを作成
- IsThereAnyDeal - 価格データAPI提供
- Steam - ゲーム情報
- Chart.js - グラフライブラリ
SteamSentinel - あなたのゲーム購入をよりスマートに 🎮