insight-analysis-pro でチャンネル別 refresh token 方式の Analytics API を使うための初回セットアップ手順書。
YouTube Analytics API はサービスアカウント非対応で、チャンネルオーナーの OAuth 同意が必須。なので「チャンネルごとに refresh token を1個作って、Bitwarden で共有」する設計にしている。
| STEP | 誰が | 頻度 | やること |
|---|---|---|---|
| A | mocha 全体で誰か1人 | 初回1回 | Google Cloud で OAuth クライアントを作って Bitwarden に保管 |
| B | チャンネルオーナー | チャンネル追加時 | yt_auth.py を実行して refresh token を生成 → Bitwarden に保管 |
| C | 誰でも | 都度 | Bitwarden から token を取得して yt_analytics.py を実行 |
credentials/client_secret.json も tokens/<channel_id>.json も .gitignore 済みで git には乗らない。共有 Vault にファイル添付して受け渡しすること。
2種類のOAuthクライアントを作る。後で Device Flow と Local Server Flow を使い分けるため、どちらも必要。
mocha-official プロジェクトを開くcredentials/client_secret.json として保存insight-analysis-pro / client_secret.json)credentials/client_secret_device.json として保存insight-analysis-pro / client_secret_device.json)新しいチャンネルを追加するたびに、そのチャンネルのオーナー権限を持つ Google アカウントで認証する。2通りのフローから選べる。
| フロー | こちらの動き | 相手の動き | 向き |
|---|---|---|---|
| B-1. Device Flow | モカ側のマシンで yt_auth.py --device-flow 実行 → URL+コードが表示される |
URLを開いてコード入力 → Googleでログイン+許可 | クリエイター本人・社外クライアント(推奨) |
| B-2. Local Server Flow | — | 自分のPCにリポジトリをclone → CLI実行 → 自分のブラウザで認証 | モカ社内 / エンジニア |
モカ側のマシンで実行する。相手にはURLと数字コードを送るだけでOK。
python3 scripts/yt_auth.py \ --channel-id UCxxxxxxxxxxxxxxxxxxxxxx \ --label todoro-chan \ --device-flow
実行すると以下のような案内がターミナルに出る:
================================================================ チャンネル「todoro-chan」のオーナーに以下を送ってください: 1. このURLを開く: https://www.google.com/device 2. このコードを入力: ABCD-EFGH 3. Googleアカウントでログインして「許可」をクリック 有効期限: 30分 ================================================================ [info] 相手の同意完了を待っています... (Ctrl+Cで中断)
テンプレ例:
お疲れさまです、モカの〇〇です。 YouTubeチャンネルの分析データ取得のため、以下から許可をいただけますか? 1. このURLを開く: https://www.google.com/device 2. このコードを入力: ABCD-EFGH 3. チャンネルの管理権限を持つGoogleアカウントでログイン → 「許可」をタップ スマホからでもOKです。30分以内に対応をお願いします。
相手が同意するとモカ側のターミナルが自動で [ok] 同意を確認しました を表示し、tokens/UCxxx.json が生成される。
他メンバーが使えるよう、生成された JSON を Bitwarden の mocha 共有 Vault にアップロード。タイトル例: insight-analysis-pro / token / todoro-chan。
自分が認証するチャンネルの管理者でもある場合(モカ社内チャンネルなど)はこっちが簡単。
git clone git@github.com:mochainc/insight-analysis-pro.git cd insight-analysis-pro pip install -r requirements.txt mkdir -p credentials # Bitwarden の client_secret.json を credentials/client_secret.json として保存 python3 scripts/yt_auth.py \ --channel-id UCxxxxxxxxxxxxxxxxxxxxxx \ --label todoro-chan
ブラウザが自動で開くのでチャンネルオーナーのGoogleアカウントでログイン → 許可。成功すると tokens/UCxxx.json が生成される。あとは Bitwarden へ。
tokens/ と credentials/ は .gitignore 済みだが、強制コミットしないように git status でも目視確認。
mkdir -p tokens # Bitwarden の "insight-analysis-pro / token / xxx" を # tokens/UCxxxxxxxxxxxxxxxxxxxxxx.json として保存
python3 scripts/yt_analytics.py retention \ --channel-id UCxxxxxxxxxxxxxxxxxxxxxx \ --video-id abcDEFghi12 \ --out output/retention.json
100ポイント(0%, 1%, ..., 100%)の audienceWatchRatio と relativeRetentionPerformance が JSON で返ってくる。
python3 scripts/yt_analytics.py traffic \ --channel-id UCxxxxxxxxxxxxxxxxxxxxxx \ --video-id abcDEFghi12
python3 scripts/yt_analytics.py subscribers \ --channel-id UCxxxxxxxxxxxxxxxxxxxxxx \ --start 2026-04-01 --end 2026-04-30
python3 scripts/yt_analytics.py raw \ --channel-id UCxxxxxxxxxxxxxxxxxxxxxx \ --metrics views,likes,comments \ --dimensions day \ --filters "video==abcDEFghi12"
| サブコマンド | 用途 | 必須オプション |
|---|---|---|
retention | 視聴者維持率カーブ | --channel-id --video-id |
traffic | 流入元別の視聴数 | --channel-id --video-id |
subscribers | 登録者増減(日次) | --channel-id |
raw | 任意 metrics/dimensions/filters | --channel-id --metrics |
共通オプション: --start YYYY-MM-DD / --end YYYY-MM-DD / --out PATH。 --start 省略時は動画公開日(video-id があれば)か30日前にフォールバック。
tokens/ credentials/ は必ず .gitignore。 git status で見えていないこと確認yt_auth.py が自動設定)| 症状 | 原因 | 対処 |
|---|---|---|
OAuthクライアントが見つかりません |
client_secret.json 未配置 | Bitwarden から取得して credentials/client_secret.json(Local Flow)または credentials/client_secret_device.json(Device Flow)に置く |
| Device Flow で「タイムアウト」 | 30分以内に相手が同意しなかった | もう一度コマンド実行して新しいコードを発行 |
| Device Flow で「ユーザーが認証を拒否」 | 相手が Google 同意画面で「拒否」をクリック | 相手に再度依頼。アカウント間違いの可能性もあるので念のため確認 |
| 「認証アカウントの所有チャンネルと一致しません」 | 別アカウントでログインした | ブラウザの Google ログアウト → 正しいオーナーアカウントで再実行 |
HttpError 403 |
権限不足 / token 失効 / API未有効化 | Cloud Console で API 有効化を確認 → yt_auth.py --force で再認証 |
| 維持率カーブが空配列 | 視聴回数が閾値未満 / ロング動画ではない | YT は再生数が一定以下のショートではカーブを返さない仕様。動画 ID とロング/ショート種別を確認 |
tokenが既に存在 |
既に認証済みのチャンネル | 上書きする場合は --force を付ける(refresh token も再発行される) |