個人 VTuber のバズ動向を観察するためのランキング集計ツール。 YouTube Shorts / 中尺動画 (4-30分) / TikTok / Twitter(X) の4プラットフォームを対象に、毎日自動でランキングを更新します。
🌐 公開ページ: https://vtuberoffice07-cell.github.io/youtube-shorts-ranking/
Note: このリポジトリは個人運営の非営利プロジェクトです。広告表示や有料プランはありません。 YouTube・TikTok・Twitter(X) からの公式サービスではなく、各社による承認・後援を受けたものではありません。
| ランキング | 対象 | スクリプト | データ |
|---|---|---|---|
| YouTube Shorts (個人VTuber) | 60秒以下の縦動画 | main.py |
ranking_history.json |
| YouTube Shorts (全体) | 同上、企業勢含む | main_all.py |
ranking_all_history.json |
| YouTube 中尺動画 | 4-30分の横動画 | main_long.py |
long_history.json + youtube_long.db |
| TikTok | ハッシュタグ検索 | tiktok_ranking.py |
tiktok_history.json + tiktok.db |
| Twitter(X) | キーワード検索 | tweet_ranking.py |
tweet_history.json + tweets.db |
各ランキングは 登録者数に対する再生数倍率(伸び率) を主指標として並び替えており、登録者数の多寡に依存しないバズの検出を狙っています。
┌─────────────────────┐ cron 1日2回 ┌──────────────────┐
│ GitHub Actions │ ─────────────────▶ │ Python Scripts │
│ (daily-ranking.yml) │ │ (main*.py 等) │
└─────────────────────┘ └────────┬─────────┘
│
┌─────────────────────┼─────────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌─────────┐
│ YouTube Data API │ │ Apify (TikTok/X) │ │ SQLite │
│ v3 │ │ │ │ + JSON │
└──────────────────┘ └──────────────────┘ └────┬────┘
│
▼ commit
┌──────────────────┐
│ GitHub Pages │
│ (viewer.html) │
└──────────────────┘
viewer.html を静的配信(クライアントが JSON を fetch)# 1. 依存ライブラリをインストール
pip install -r requirements.txt
# 2. 環境変数を設定
cp .env.example .env
# .env を編集して YOUTUBE_API_KEY と APIFY_API_TOKEN を記入
# 3. スクリプトを個別実行
python main.py # YouTube Shorts (個人VTuber)
python main_all.py # YouTube Shorts (全体)
python main_long.py # YouTube 中尺動画
python tiktok_ranking.py
python tweet_ranking.py
# 4. ブラウザで結果を確認
# viewer.html を任意の HTTP サーバーで配信(例: python -m http.server 8000)
| 変数 | 用途 | 取得方法 |
|---|---|---|
YOUTUBE_API_KEY |
YouTube Data API v3 | Cloud Console |
APIFY_API_TOKEN |
Apify (TikTok / Twitter スクレイピング) | Apify Console |
重要:
.envは git で除外されています。本番では GitHub Actions の Repository Secrets に登録してください。
.github/workflows/daily-ranking.yml で定義:
Run workflow ボタンで dispatch 可能ジョブ全体: 30分。各ステップ: 5〜10分。これにより API ハング時のジョブ暴走と GitHub Actions 無料枠の浪費を防止しています。
YouTube ランキング (個人 / 全体) のいずれかが失敗した場合、自動で GitHub Issue が作成されます。同名の open Issue があれば重複作成されません。
YouTube Data API v3 はデフォルトで 10,000 unit/日 の無料枠が割り当てられています(PT 0:00 = JST 16:00 リセット)。
各スクリプトの 1 回あたりの消費量目安:
| スクリプト | 1回の消費 | 主な API メソッド |
|---|---|---|
main.py |
約 200 unit | search.list (100 × 2) |
main_all.py |
約 200 unit | search.list (100 × 2) |
main_long.py |
約 470 unit | playlistItems.list (1) × 多数 + search.list (100) × 2 |
クォータ最適化のポイント:
main_long.pyは登録者上位チャンネルの uploads playlist を巡回する設計で、search.list (100 unit) ではなく playlistItems.list (1 unit) を主に使うことで大幅にコストを削減しています。
クォータ増加申請の手順は SETUP_QUOTA_REQUEST.md を参照してください。
viewer.html の初期表示を高速化するため、各 history JSON は 2 段階で生成・読込みされる:
| ファイル | サイズ | 内容 | 読込みタイミング |
|---|---|---|---|
*_latest.json |
~1MB | 直近 30 日 | 初回 fetch(即時表示) |
*_history.json |
全期間 | 全データ | latest 表示後にバックグラウンド遅延 fetch |
これにより初期表示は数百ms〜1秒で完了し、ユーザーが古い日付に切り替えた時点で全期間データが既にロード済みになる。
vtuber_common.py の write_latest_snapshot() が各 main_*.py / tweet_ranking.py から呼ばれて latest を生成する。
JSON 履歴ファイルを毎日コミットしているため、.git は徐々に肥大化する(執筆時点で約 57MB、年 +13MB ペース見込み)。
現状の方針: 個人運営の小規模リポジトリのため許容範囲(GitHub の上限 1GB に対して十分小さい)。.gitattributes で JSON のデルタ圧縮を最適化済み。
将来の選択肢(必要になった時点で検討):
gh-pages ブランチに JSON を分離。main はコード専用に。過去履歴は触らないので 57MB は残るが今後増えないquotaExceeded: YouTube API クォータ超過。JST 16:00 のリセットを待つか、増加申請を検討HttpError 403: API キー失効・権限不足。Repository Secrets を確認HttpError 429: レート制限。短時間の連続実行を避ける# 環境変数が設定されているか確認
python -c "import os; print('YT:', bool(os.getenv('YOUTUBE_API_KEY')), 'APIFY:', bool(os.getenv('APIFY_API_TOKEN')))"
# .env が読み込まれない場合は python-dotenv を確認
python -c "from dotenv import load_dotenv; load_dotenv(); import os; print(os.getenv('YOUTUBE_API_KEY'))"
*_history.json ファイルが存在するか確認viewer.html 上部の定数)python diagnose_long_offline.py # 中尺動画フィルタの動作を検証
python diagnose_long.py # 実 API でフィルタを検証(クォータ消費注意)
このサービスは YouTube API Services を利用しています。利用者は YouTube 利用規約 と Google プライバシーポリシー に同意したものとみなされます。
動画作成者・チャンネル所有者から本サービスへの自身の情報削除依頼があった場合、原則として 7 日以内に対応します。
📧 連絡先: amtokyo713@gmail.com
.
├── .github/
│ ├── workflows/
│ │ └── daily-ranking.yml # 毎日のランキング更新ワークフロー
│ └── dependabot.yml # 依存ライブラリの自動更新
├── main.py # YouTube Shorts (個人VTuber)
├── main_all.py # YouTube Shorts (全体)
├── main_long.py # YouTube 中尺 (4-30分)
├── tiktok_ranking.py # TikTok ランキング
├── tweet_ranking.py # Twitter(X) ランキング
├── generate_hints.py # ヒントレポート生成
├── diagnose_long.py # 中尺フィルタ診断(実API)
├── diagnose_long_offline.py # 中尺フィルタ診断(オフライン)
├── viewer.html # メイン表示ページ
├── privacy-policy.html # プライバシーポリシー
├── terms-of-service.html # 利用規約
├── robots.txt # 検索エンジンインデックス拒否
├── *.db # SQLite データベース
├── *_history.json # ランキング履歴
└── tasks/ # 開発メモ(公開対象外)
個人運営の非営利プロジェクトです。ソースコードの参照は自由ですが、以下を禁止します:
詳細は 利用規約 第4条 を参照してください。
カイン (個人運営、ハンドル名) 📧 amtokyo713@gmail.com