「毎日ショートを投稿したいが、手作業のアップロードが地味に時間を食う」——顔出しなしのYouTube副業を回していると、必ずこの壁にぶつかります。結論から言うと、YouTube Data API v3 の videos.insert メソッドを使えば、動画のアップロード・タイトル・説明文・公開設定までを完全にプログラムで自動化できます。ただし「無制限に何百本も自動投稿できる魔法」ではありません。1日のアップロード本数は事実上のクォータ上限があり、さらにAPI審査を通していないアプリでアップロードすると、動画が問答無用で「非公開ロック」されるという、多くの記事が触れない落とし穴が存在します。
この記事では、Google Cloud の設定からPythonの実装コード、認証フロー、そして「うまくいかない条件」までを、実際に量産チャンネルを回す視点で一気通貫に解説します。単なる公式ドキュメントの翻訳ではなく、副業で毎日投稿を回す人が本当に詰まるポイント——クォータ計算、審査、スパム判定リスク——に踏み込みます。
YouTube API でアップロード自動化ができること・できないこと
まず全体像を掴みましょう。YouTube Data API v3 は、YouTube の各種操作をHTTPリクエストで叩けるインターフェースです。アップロード自動化に関係するのは主に videos.insert(動画のアップロード)で、これに thumbnails.set(サムネイル設定)や playlistItems.insert(再生リスト追加)を組み合わせます。
APIでできること:
- 動画ファイルのアップロード(
videos.insert) - タイトル・説明文・タグ・カテゴリの設定
- 公開設定(public / unlisted / private)とスケジュール公開(publishAt)
- サムネイルの差し替え
- 再生リストへの自動追加
APIではできない・制限があること:
- Shorts専用のアップロードエンドポイントは存在しない。縦動画(アスペクト比9:16)を通常の
videos.insertでアップし、YouTube側が自動的にShortsと判定します。#Shortsをタイトルや説明に入れる運用は残っていますが、判定の主軸は尺と縦横比です。 - 収益化のオン・オフや広告設定の細かい制御はAPIから不可。これはYouTube Studio側の手動操作が必要です。
- 1日のアップロード本数に事実上の上限(後述のクォータ)。
つまりAPIは「アップロードと入稿メタデータの自動化」には最適ですが、収益化設定やチャンネル戦略まで丸投げできるものではありません。ここを誤解すると「思ったより自動化できない」と感じることになります。動画そのものの量産についてはFFmpegでショート動画を自動編集する方法と組み合わせると、生成から投稿までの一気通貫パイプラインが組めます。
事前準備:Google Cloud Console でのAPI有効化とOAuth設定
コードを書く前に、Google側の設定が必要です。ここで9割の初心者が詰まるので、番号付きで丁寧に追います。
- Google Cloud Console でプロジェクトを作成 — console.cloud.google.com にアクセスし、新規プロジェクトを作成します。
- YouTube Data API v3 を有効化 — 「APIとサービス」→「ライブラリ」から「YouTube Data API v3」を検索し、「有効にする」をクリック。
- OAuth同意画面の設定 — 「APIとサービス」→「OAuth同意画面」で、User Type を「外部」に設定。アプリ名、サポートメール、スコープ(
https://www.googleapis.com/auth/youtube.upload)を登録します。 - テストユーザーの追加 — 審査を通す前の「テスト」ステータスでは、自分のGoogleアカウントを「テストユーザー」に登録しないと認証が通りません。ここは必須です。
- OAuthクライアントIDを作成 — 「認証情報」→「認証情報を作成」→「OAuthクライアントID」→アプリケーションの種類「デスクトップアプリ」を選択。
client_secret.jsonをダウンロード — 作成したクライアントIDの右側からJSONをダウンロードし、スクリプトと同じディレクトリに置きます。
APIキーではなくOAuthが必要な理由
よくある勘違いが「APIキーだけでアップロードできる」というもの。動画のアップロードは特定ユーザーのチャンネルへの書き込み操作なので、OAuth 2.0 による本人認証が必須です。APIキー(developerKey)は検索など読み取り専用の公開データにしか使えません。アップロードには必ず client_secret.json を使ったOAuthフローを踏みます。
Pythonで動画をアップロードする実装コード
必要なライブラリをインストールします。
pip install google-auth-oauthlib google-api-python-client
以下が最小構成のアップロードスクリプトです。初回実行時にブラウザが立ち上がり、Googleアカウントで認可すると token.json(アクセストークン)が保存され、次回以降は自動でログインします。
import os
import google.oauth2.credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
SCOPES = ["https://www.googleapis.com/auth/youtube.upload"]
API_NAME = "youtube"
API_VERSION = "v3"
CLIENT_SECRETS_FILE = "client_secret.json"
TOKEN_FILE = "token.json"
def get_authenticated_service():
creds = None
# 保存済みトークンがあれば再利用
if os.path.exists(TOKEN_FILE):
creds = google.oauth2.credentials.Credentials.from_authorized_user_file(
TOKEN_FILE, SCOPES)
# トークンが無効・期限切れなら再取得
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
CLIENT_SECRETS_FILE, SCOPES)
creds = flow.run_local_server(port=0)
with open(TOKEN_FILE, "w", encoding="utf-8") as f:
f.write(creds.to_json())
return build(API_NAME, API_VERSION, credentials=creds)
def upload_video(youtube, file_path, title, description, tags,
category_id="22", privacy="private"):
body = {
"snippet": {
"title": title,
"description": description,
"tags": tags,
"categoryId": category_id, # 22 = People & Blogs
},
"status": {
"privacyStatus": privacy, # public / unlisted / private
"selfDeclaredMadeForKids": False,
},
}
# resumable=True で大きなファイルも分割アップロード
media = MediaFileUpload(file_path, chunksize=-1, resumable=True)
request = youtube.videos().insert(
part="snippet,status",
body=body,
media_body=media,
)
response = None
while response is None:
status, response = request.next_chunk()
if status:
print(f"アップロード進捗: {int(status.progress() * 100)}%")
print(f"完了 video_id = {response['id']}")
return response["id"]
if __name__ == "__main__":
yt = get_authenticated_service()
upload_video(
yt,
file_path="short_001.mp4",
title="顔出しなしで作った自動化ショート #Shorts",
description="APIから自動投稿したテスト動画です。",
tags=["Shorts", "副業", "自動化"],
privacy="private", # まずは private で挙動確認
)
コードのポイント解説
resumable=True:ネットワークが切れても途中から再開できる「レジューム可能アップロード」。大きな動画では必須です。privacyStatusは最初private:いきなりpublicにすると、後述の審査問題や意図しない公開事故が起きます。挙動を確認するまではprivateかunlistedで回すのが鉄則です。selfDeclaredMadeForKids:子ども向けコンテンツの申告。COPPA対応で必須項目化されているので必ず指定します。- スケジュール公開:
statusにpublishAt(ISO 8601形式のUTC時刻)を入れ、privacyStatusをprivateにすると予約投稿になります。
クォータ制限:1日何本までアップロードできるのか
ここが自動化の最大の制約です。YouTube Data API は「クォータ(ユニット)」という通貨で管理され、各Google Cloudプロジェクトはデフォルトで1日10,000ユニットが割り当てられます(太平洋時間の深夜0時にリセット)。
各操作の消費ユニットは以下の通りです。
| 操作 | メソッド | 消費ユニット |
|---|---|---|
| 動画アップロード | videos.insert |
1,600 |
| 動画情報の更新 | videos.update |
50 |
| 検索 | search.list |
100 |
| 動画リスト取得 | videos.list |
1 |
| サムネイル設定 | thumbnails.set |
50 |
| 再生リスト追加 | playlistItems.insert |
50 |
アップロード1回で1,600ユニット消費するため、10,000 ÷ 1,600 ≒ 1日あたり最大6本が事実上の上限です。サムネイル設定(50)や再生リスト追加(50)も足すと、実運用では5〜6本が現実的なラインになります。
「毎日20本自動投稿する」といった記事も見かけますが、それは古い情報か、クォータ拡張済みか、複数プロジェクトを併用しているケースです。デフォルトのままでは1日6本が壁だと理解しておきましょう。
クォータ計算チェックリスト
1日の投稿設計を組む前に、以下を確認してください。
- [ ] アップロード本数 × 1,600 が10,000以内に収まっているか
- [ ] サムネイル差し替え(50/本)を含めても余裕があるか
- [ ] 投稿前の重複チェックで
search.list(100/回)を多用していないか - [ ] クォータ超過時の
quotaExceededエラーをコードでハンドリングしているか - [ ] 太平洋時間0時のリセットを日本時間(+17時間)で把握しているか
クォータを増やすには
6本では足りない場合、Google Cloud Console からクォータ拡張リクエストを提出できます。ただしこれは自動承認ではなく、アプリの用途・コンプライアンス・API利用規約の遵守状況を審査する手動レビューです。「顔出しなしで動画を量産したい」という理由だけでは通りにくく、承認まで数週間かかることも珍しくありません。安易にクォータ増加を当てにした投稿計画は立てないほうが安全です。
【独自視点】API経由アップロードはポリシー的にどう見られるか
ここが最も見落とされがちで、かつ致命的なポイントです。多くの技術記事は「アップロードできた!」で終わりますが、実際に運用するとアップロードした動画が勝手に「非公開(ロック)」されるという現象に直面します。
未審査アプリで上げた動画は「locked as private」になる
YouTubeの仕様として、OAuth審査(API監査)を通していないアプリからアップロードした動画は、public を指定しても強制的に private にロックされます。これはユーザーが自分で非公開にした状態とは異なり、再審査に出すまで公開状態に戻せないという厳しい制限です。
Google公式のヘルプでも「サードパーティのAPIサービスがYouTubeの検証プロセスを通過していない場合、アップロードされた動画は非公開としてロックされる」と明記されています。GitHub上のアップローダーツール(youtubeuploader、youtube-upload など)のIssueでも、この「video locked to private due to unverified API project」問題が繰り返し報告されています。
つまり、審査を通さない自作スクリプトで公開投稿を自動化しようとしても、動画は世に出ないということです。自分専用のテスト・限定公開なら問題ありませんが、公開量産を狙うなら次の審査が避けられません。
OAuth審査(検証)を通す手順
公開投稿を自動化するには、OAuth同意画面を「テスト」から「本番」に切り替え、Googleの検証を受ける必要があります。
- OAuth同意画面で必要な情報(プライバシーポリシーURL、アプリのホームページ、利用スコープの正当性説明)を埋める
youtube.uploadなどの機密スコープを使う場合、動画デモやユースケース説明の提出を求められる- Googleのレビューを受け、承認されれば動画ロックが解除される
個人の副業レベルでこの審査を通すのはハードルが高く、現実的には「自分のチャンネルにテストユーザーとして限定運用」か、既に検証済みのサードパーティサービスを使うという二択になりがちです。この構造を知らずに「APIで公開自動投稿できる」と思い込むと、時間を溶かします。
【独自視点】大量自動投稿がスパム判定されるリスク
もう一つの落とし穴が、YouTube側のスパム・不正行為ポリシーです。API経由かどうかに関わらず、短時間に大量の類似動画を機械的に投下する行為は「スパム、欺瞞行為、詐欺」ポリシーに抵触する可能性があります。
特に危険なのが以下のパターンです。
- 同一・酷似コンテンツの反復アップロード(テンプレを微修正しただけの量産)
- 自動生成感の強いメタデータ(タイトルが機械的な連番など)
- 短期間での急激な投稿数増加(新規チャンネルがいきなり1日6本×連日)
APIでアップロード自体は成功しても、YouTube側のアルゴリズムが「反復的なコンテンツ」と判定すれば、収益化の対象外になったり、最悪チャンネル停止につながります。API監査を通していても、コンテンツの質・独自性の問題は別問題として残ります。
量産と規約遵守のバランスについてはチャンネルBAN対策と復旧の考え方も併せて確認してください。「自動化=安全に量産できる」ではなく、自動化はあくまで手作業の代替であり、YouTubeが嫌う「価値の低い反復コンテンツ」を大量投下する道具にすると逆効果になります。
Python API vs GAS vs サードパーティツールの比較
アップロード自動化の実現手段は一つではありません。目的別に整理します。
| 手段 | 初期難易度 | 公開投稿の可否 | クォータ | 向いている人 |
|---|---|---|---|---|
| Python + Data API | 中 | 審査必須(未審査は非公開ロック) | 10,000/日 | ローカルで自分のチャンネルを自動化したい人 |
| Google Apps Script (GAS) | 低〜中 | 同上(審査の壁は同じ) | 10,000/日 | サーバー不要でクラウド実行したい人 |
| 検証済みサードパーティ(Upload-Post等) | 低 | 可(サービス側が審査済み) | サービス依存 | コードを書かず複数SNS横断投稿したい人 |
| 手動アップロード | なし | 可 | 無制限 | 週数本ペースの人 |
Python + Data API はローカルのバッチ処理と相性が良く、動画生成パイプラインの末端に組み込むのに最適です。GAS はサーバーレスでスプレッドシート連携が楽ですが、審査の壁はPythonと同じです。検証済みサードパーティはコード不要で公開投稿もできますが、月額費用がかかり、外部サービスに認証を預けるリスクがあります。
投稿の全体設計はショートの自動投稿の方法で運用フロー全体を確認すると、どの手段が自分に合うか判断しやすくなります。
スケジュール実行で「毎日自動投稿」を組む
スクリプトができたら、定期実行で完全自動化します。1日6本のクォータ制限内で回すのが前提です。
Windowsの場合:タスクスケジューラで毎朝スクリプトを起動。
Mac/Linuxの場合:cron で時刻指定。
# 毎日午前9時(JST)に投稿スクリプトを実行
0 9 * * * cd /home/user/yt && /usr/bin/python3 upload.py >> upload.log 2>&1
クラウドで無人運用する場合:GitHub Actions や Google Cloud の Cloud Scheduler + Cloud Functions を使うと、PCを起動しっぱなしにせずに済みます。ただし token.json(リフレッシュトークン)をシークレットとして安全に保管する設計が必須です。トークンが漏れると他人にチャンネルを操作される危険があるため、リポジトリに絶対コミットしないことを徹底してください。
自動投稿バッチ構築チェックリスト
- [ ] 投稿する動画とメタデータをキュー(フォルダやスプレッドシート)で管理している
- [ ] 投稿済みファイルを別フォルダに移動して二重投稿を防いでいる
- [ ]
token.jsonとclient_secret.jsonを環境変数・シークレット管理にしている - [ ] クォータ超過・ネットワークエラー時のリトライとログ出力がある
- [ ] 1日の投稿本数を6本以内にハードコードで制限している
- [ ] まず
privateで数日テストしてから公開に切り替えた
よくある質問
YouTube APIで1日に何本まで自動アップロードできますか?
デフォルトでは1日約6本が上限です。アップロード1回が1,600ユニット消費し、1プロジェクトの1日クォータが10,000ユニットのため、10,000÷1,600≒6.25本が計算上の限界です。サムネイル設定などを含めると実質5〜6本が現実的です。
APIキーだけで動画をアップロードできますか?
できません。動画アップロードは特定チャンネルへの書き込み操作なので、OAuth 2.0による本人認証が必須です。APIキー(developerKey)は検索など読み取り専用の公開データにしか使えず、videos.insert には client_secret.json を使った認可フローが要ります。
API経由でアップロードした動画が非公開になってしまうのはなぜ?
OAuth審査(API監査)を通していないアプリからのアップロードは、YouTube側が強制的に「非公開ロック」するためです。public を指定してもロックされ、アプリの検証を通過するまで公開状態に戻せません。自分専用の限定運用なら問題になりませんが、公開量産にはGoogleの検証が必要です。
Shorts専用のアップロードAPIはありますか?
ありません。通常の videos.insert で縦動画(9:16)を上げれば、YouTube側が尺と縦横比から自動的にShortsと判定します。#Shorts を説明文に入れる運用は補助的に残っていますが、判定の主軸はアスペクト比と再生時間です。
自動で大量投稿するとアカウントは危険ですか?
はい、リスクがあります。短時間に類似・反復コンテンツを機械的に大量投下すると、YouTubeのスパムポリシーに抵触し、収益化除外やチャンネル停止につながる可能性があります。APIでアップロードが成功しても、コンテンツの独自性の問題は別に残ります。自動化は手作業の代替であり、価値の低い反復投稿の道具にすると逆効果です。
クォータの10,000ユニットはいつリセットされますか?
太平洋時間(PT)の深夜0時にリセットされます。日本時間だと夏時間で午後4時、冬時間で午後5時ごろです。この時差を意識せずにバッチを組むと「まだリセットされていないのに投稿しようとして失敗」という事故が起きるので、JST換算で管理してください。
クォータは増やせますか?どのくらいかかりますか?
Google Cloud Consoleからクォータ拡張リクエストを提出できますが、自動承認ではなく手動レビューです。アプリの用途やコンプライアンス状況が審査され、承認まで数週間かかることもあります。個人の量産目的では通りにくいため、増加を前提にした投稿計画は避けるべきです。
token.jsonやclient_secret.jsonはどう管理すべきですか?
絶対にGitHubなど公開リポジトリにコミットしないでください。特に token.json にはリフレッシュトークンが含まれ、漏洩すると第三者にチャンネルを操作されます。環境変数やクラウドのシークレット管理(GitHub Secrets、Secret Manager等)に保管し、.gitignore に必ず追加します。
エラーで途中からアップロードが止まりました。やり直せますか?
はい。MediaFileUpload を resumable=True で作り、next_chunk() ループで進捗を管理していれば、ネットワーク切断時も途中から再開できます。大きな動画ファイルでは必須設定なので、必ず有効にしてください。
まとめ
YouTube Data API v3 の videos.insert を使えば、Pythonで動画アップロードからメタデータ設定・予約公開までを完全自動化できます。実装自体はOAuth認証さえ通れば難しくありません。しかし、副業で量産を回すうえで本当に重要なのは、次の3つの制約を正しく理解することです。
- クォータ制限:1アップロード1,600ユニット、1日10,000ユニットで、実質1日6本が壁。拡張申請は手動審査で通りにくい。
- 審査の壁:未検証アプリで上げた動画は強制的に非公開ロックされ、公開量産にはGoogleのOAuth審査が必要。
- スパム判定リスク:反復的な低品質コンテンツの大量投下は、API成功とは無関係にポリシー違反となりチャンネルを危険にさらす。
APIは「魔法の量産ツール」ではなく「手作業の丁寧な代替」です。まずは private で挙動を確認し、クォータとポリシーの範囲内で、独自性のあるコンテンツを着実に投稿する——この地に足のついた運用が、結局は最短で成果につながります。動画生成から編集、投稿までの全体像は関連記事も参考に、自分のパイプラインを組み立ててみてください。