機能仕様 - rfdnxbro/trends-laravel GitHub Wiki
技術コミュニティでの企業影響力を定点観測するWebアプリケーションの機能仕様書です。
- 招待制サイト: 招待を受けた人のみアクセス可能
-
権限レベル:
- 一般ユーザー: 閲覧・検索機能
- 管理者: データ管理・ユーザー管理機能
- 1時間ごとにスクレイピング実行
-
全プラットフォーム実行:
php artisan scrape:all
/php artisan scrape:all --dry-run
-
個別プラットフォーム実行:
php artisan scrape:platform <platform>
-
定期実行用:
php artisan scrape:schedule
/php artisan scrape:schedule --silent
- URL: https://b.hatena.ne.jp/hotentry/it
- 企業特定: テックブログのドメインで特定
- 自動登録条件: ITカテゴリのホットエントリーに掲載された記事のドメイン
- 実装状況: HatenaBookmarkScraperクラスで実装済み
-
コマンド:
php artisan scrape:platform hatena
/php artisan scrape:platform hatena --dry-run
- URL: https://qiita.com(トレンドページ)
- 企業特定: ユーザーアカウントと企業の紐づけ
- 自動登録条件: トレンドに掲載された記事のユーザーが企業アカウントの場合
- 実装状況: QiitaScraperクラスで実装済み
-
コマンド:
php artisan scrape:platform qiita
/php artisan scrape:platform qiita --dry-run
- URL: https://zenn.dev/ (Techカテゴリ、16記事上限)
- 企業特定: ユーザーアカウントと企業の紐づけ
- 自動登録条件: Techカテゴリのトレンド記事のユーザーが企業アカウントの場合
- 実装状況: ZennScraperクラスで実装済み
-
コマンド:
php artisan scrape:platform zenn
/php artisan scrape:platform zenn --dry-run
- 記事タイトル
- URL
- 投稿日時
- 著者情報
- エンゲージメント数(統一されたエンゲージメント指標)
- 記事の技術タグ・カテゴリ
Qiita固有のデータ項目:
- エンゲージメント数(LGTM数)
- 投稿者ユーザー名
- 投稿者URL
Zenn固有のデータ項目:
- エンゲージメント数(いいね数)
- 投稿者ユーザー名
- 投稿者URL
- 表示回数カウント: 各サイトに表示された回数の単純合計
- エンゲージメント数カウント: エンゲージメント数の合計
-
ポイント加算方式: エンゲージメント数に応じたポイント制
- 10以上: +1ポイント
- 100以上: +5ポイント
- 1000以上: +10ポイント等
-
対象: 全技術カテゴリ
- プログラミング言語
- フレームワーク
- インフラ技術
- データベース
- AI/ML、ブロックチェーン等
- 企業ID
- 企業名
- 作成日時
- 更新日時
- ブログID
- 企業ID(外部キー)
- ドメイン名
- ブログ名
- 作成日時
- 更新日時
- 条件: 各サイトのトレンドに新しいドメイン・Organization・Publicationが掲載
- 処理: 企業マスタとブログテーブルに自動登録
- URL変更対応: ブログテーブルでドメイン変更・削除に対応
-
期間別ランキング:
GET /api/rankings/{period}
- 日次/週次/月次ランキング -
期間タイプ一覧:
GET /api/rankings/periods
- 利用可能期間の取得 -
統計情報:
GET /api/rankings/statistics
- ランキング統計データ -
上位N件:
GET /api/rankings/{period}/top/{limit}
- 上位企業の取得 -
順位変動:
GET /api/rankings/{period}/risers
- 上昇企業の取得 -
順位下降:
GET /api/rankings/{period}/fallers
- 下降企業の取得 -
変動統計:
GET /api/rankings/{period}/statistics
- 順位変動統計 -
企業別ランキング:
GET /api/rankings/company/{company_id}
- 特定企業のランキング
-
企業詳細情報:
GET /api/companies/{company_id}
- 企業基本情報と現在ランキング -
企業記事一覧:
GET /api/companies/{company_id}/articles
- 企業の記事履歴(ページネーション対応) -
影響力スコア履歴:
GET /api/companies/{company_id}/scores
- 時系列スコアデータ -
ランキング情報:
GET /api/companies/{company_id}/rankings
- 企業のランキング履歴
-
記事一覧:
GET /api/articles
- 記事一覧(企業・プラットフォーム別フィルタ、ページネーション対応) -
記事詳細情報:
GET /api/articles/{id}
- 記事基本情報・企業情報・統計データ
-
企業検索:
GET /api/search/companies
- 企業名・ドメイン・説明文での検索 -
記事検索:
GET /api/search/articles
- 記事タイトル・著者名での検索 -
統合検索:
GET /api/search
- 企業・記事の横断検索 - 関連度スコア: 検索結果に関連度スコアを付与して最適化
- レート制限: 60リクエスト/分
- キャッシュ: 5分間のレスポンスキャッシュ
- エラーハンドリング: 統一されたエラーレスポンス形式
- バリデーション: 入力パラメータの検証
- 企業影響力ランキング表示: リアルタイムでのランキング表示
- 期間指定: 過去1ヶ月、3ヶ月、1年等の期間選択
- 企業詳細ページ: 投稿履歴、技術スタックの変遷等
- 技術キーワード分析: 注目技術と企業の関連性を可視化
- 検索機能: 企業・記事の横断検索
- 企業マスタ管理: 企業情報の手動修正・削除
- ブログドメイン管理: ドメイン情報の手動修正・削除
- スクレイピング状況確認: 実行ログとエラー確認
- ユーザー管理: 招待・権限変更・削除
- データ収集システム: スクレイピング機能の実装
- 企業自動登録: 新規企業の自動検出・登録
- 企業影響力ランキングAPI: 期間別ランキング機能
- 企業詳細API: 企業情報・記事・スコア履歴
- 検索API: 企業・記事の横断検索機能
- フロントエンドダッシュボード: React + Tailwind CSSでのダッシュボード
- 基本認証: 招待制ユーザー管理
- 管理画面: データ管理機能
- 技術キーワード分析: 注目技術と企業の関連性を可視化
- 高度な検索フィルタ: 技術スタック・期間・影響力による絞り込み
- レポート機能: 定点観測データのエクスポート
- 通知機能: ランキング変動アラート
- バックエンド: Laravel(キューシステムでスクレイピング非同期実行)
- フロントエンド: React + Tailwind CSS
- データベース: PostgreSQL(時系列データ処理)
- 本番環境: Laravel Cloud
- Laravel Scheduler: 1時間ごとの定期実行
- キューシステム: 非同期でのスクレイピング処理
- Job分散: 各サイト別のジョブで並列実行
- Guzzle HTTP: HTTPリクエスト処理
- Goutte: DOMスクレイピング(Symfony DomCrawler)
- Laravel HTTP Client: 簡単なHTTPクライアント
Laravel Scheduler (hourly)
↓
ScrapingJob (Main)
├─ HatenaScrapingJob
├─ QiitaScrapingJob
└─ ZennScrapingJob
- Job層: 各サイトのスクレイピング処理
- Service層: スクレイピングロジック
- Repository層: データベース操作
- Model層: Eloquentモデル
- Retry機能: 3回まで自動リトライ
- Failed Job Queue: 失敗したジョブの管理
- ログ記録: 各サイトのスクレイピング状況記録
- Horizon: キューの監視・管理
- Laravel Telescope: デバッグ・パフォーマンス監視