ソーシャルにスケジュール投稿
セットアップ:以下の項目を入力
初回実行前に、以下のプレースホルダーをすべて置き換えてください。
| プレースホルダー | 説明 |
|---|---|
<YOUR_METRICOOL_BLOG_ID> | Metricool ブランドの blogId(getBrandSettings から取得) |
<YOUR_TIMEZONE> | スケジュール用の IANA タイムゾーン(例:America/Chicago) |
<YOUR_POST_TIME> | デフォルトの投稿時間(例:10:00) |
<YOUR_IG_HANDLE>、<YOUR_TIKTOK_HANDLE>、<YOUR_YOUTUBE_CHANNEL_ID> | Metricool に接続されたアカウント |
<YOUR_DRIVE_UPLOAD_FOLDER_ID> | 「リンクを知っている全員」に共有された Google Drive フォルダ(メディアホップ参照) |
<YOUR_VIDEO_LIBRARY> | 完成ファイルの保存先(例:~/Videos/Finished) |
<YOUR_STANDING_CTA> | すべてのキャプションに追加するオプションの定型文 |
<YOUR_VOICE_FILE> | オプション:キャプション用の音声/スタイルガイドのパス |
ブランド: blogId <YOUR_METRICOOL_BLOG_ID>、タイムゾーン <YOUR_TIMEZONE>。
接続済み: Instagram(<YOUR_IG_HANDLE>)、TikTok(<YOUR_TIKTOK_HANDLE>)、YouTube(<YOUR_YOUTUBE_CHANNEL_ID>)。
メディアホップ(わかりにくい部分)
Metricool の API は 公開 URL のみ を受け付けます。ローカルファイルは受け付けられません。処理の流れは以下の通りです。
- MP4 を
Metricool Uploads (Claude)(<YOUR_DRIVE_UPLOAD_FOLDER_ID>)などの Drive フォルダにアップロードします。フォルダを「リンクを知っている全員」に一度共有すれば、ファイルはその権限を継承するため、ファイルごとに共有する必要はありません。cd <ファイルのあるディレクトリ> && gws drive files create \ --params '{"uploadType":"multipart","supportsAllDrives":true}' \ --json '{"name":"<名前>.mp4","mimeType":"video/mp4","parents":["<YOUR_DRIVE_UPLOAD_FOLDER_ID>"]}' \ --upload "<ファイル>" - 直接ダウンロード URL を使用してスケジュールします:
https://drive.google.com/uc?id=<fileId>&export=download。/viewリンクは「メディアの正規化に失敗しました」というエラーで失敗します。 - Metricool がファイルを自社のストレージにコピーします。レスポンスの
mediaはstatic.metricool.com/...に変わります。 - それを確認したら Drive のコピーを削除 します。ストレージが蓄積されることはありません。
Claude は通常、Drive ファイルを公開できず(サンドボックスでブロックされる)、自身の権限を編集できません。そのため、共有フォルダが存在します。ファイルがフォルダ外にある場合は、共有しようとせずにユーザーに移動を依頼してください。
キャプション
音声ガイドを保持している場合は、最初に <YOUR_VOICE_FILE> を読み、それに合わせてください。それ以外の場合は以下のデフォルトを使用します。
リールにコメントキーワード CTA(自動 DM やメールをトリガーするキーワード)がある場合、1行目は CTA です。
- 1行目:
Comment <KEYWORD> and I'll send you <リソース名> free 👇(キーワードは大文字で、リールの CTA クリップで話されている通りに) - 次に フック行と、以下の 2〜4 行の教育行。
- 最後に 定型 CTA を(使用する場合)付ける。
- キーワードはリールで話されている CTA(動画の状態ファイルの
reel_cta)と一致する必要があります。動画ごとに1つのキーワード。
キーワード CTA がないリールの形式:
- 1行目はフック。 フィードで表示される唯一の行。通常、リールの冒頭と同じ行。
- 2〜4行の短い行で1つのことを教える。段落ではなく、行間に改行。
- ハッシュタグのスパムは避ける。少数またはなし。
- 定型 CTA がある場合は、そのまま
<YOUR_STANDING_CTA>で締めくくる。
実際のリールの内容から、トランスクリプト内のクリエイターの言葉を使って書き、一般的なアドバイスは使わない。短いが教育的:視聴者はキャプションだけで1つの使えることを学べるように。
一般的な形状の例:
「毎日投稿=バーンアウト / 週に3本の素晴らしい動画を投稿=成長」
「より良いオーディオを得るための簡単なヒント:ゲインを上げるのではなく、マイクを近づけてください...」
レンダリング
キャプションは焼き込み済み:video-reels はそれらを V3 にアルファオーバーレイクリップとして配置し、テキストフックカードは V2 に配置します。インポートも焼き込みチェックボックスも不要。
- ユーザーがリールをトリミングします。両方のオーバーレイトラックは独立したクリップであるため、V1 をトリミングしてもそれらは移動しません。タイミングを再カットした場合は、スライドさせるのではなく、そのリールのキャプションを再レンダリングします。
- Claude が Resolve API を通じてレンダリングします。4つのリールで約90秒かかります。
out = os.path.expanduser("~/Movies/<video>-deliverables/reels-final")
os.makedirs(out, exist_ok=True)
project.DeleteAllRenderJobs()
for i in range(project.GetTimelineCount()):
t = project.GetTimelineByIndex(i+1)
if not t.GetName().startswith("Reel"):
continue
project.SetCurrentTimeline(t)
project.SetRenderSettings({"TargetDir": out, "CustomName": t.GetName().replace(" ", "_"),
"SelectAllFrames": True, "FormatWidth": 1080, "FormatHeight": 1920,
"ExportVideo": True, "ExportAudio": True})
project.SetCurrentRenderFormatAndCodec("mp4", "H264")
project.AddRenderJob()
その後 start_rendering。コーデック文字列は "H264" であり、"H.264" ではありません。フォーマットは "mp4" です。ジョブステータスではなく出力ディレクトリをポーリングします。ファイルは完了すると表示されます。30秒で約40MBを見込んでください。
3. レンダリングはタイミングの後戻りできないポイントなので、まずトリミングを行ってください。
4. アップロード前に ffmpeg で出力をスポットチェックし、フックウィンドウ内の1フレームとリール中央の1フレームを確認します:
ffmpeg -v error -ss 1.5 -i reel.mp4 -frames:v 1 hook.png -y
ffmpeg -v error -ss 8 -i reel.mp4 -frames:v 1 cap.png -y
それらを1つのプルーフシートにまとめて、実際に確認します。ここがフックカードの欠落や空白のキャプショントラックをキャッチできる最後の場所であり、スケジュール後は削除できません。
完成ファイルの保存先
すべての保持ファイルは <YOUR_VIDEO_LIBRARY>/ に、動画ごとに1つのフォルダとして保存されます:
<YOUR_VIDEO_LIBRARY>/<動画名> YYYY-MM-DD/
Reels/ 投稿されたもの。1080x1920 H.264
Reels/Masters/ 同じカット、60 Mbps アーカイブ
Timelines/ タイムラインごとの .drt + プロジェクト .drp
Covers/ 承認された Instagram リールカバー、1080x1920 JPG
Thumbnails/ フルサイズのサムネイルオプション
YouTube/ エクスポートされた長尺動画、配信用+マスター
Posting schedule.txt 何が、どこに、いつ投稿されるか
アップロードファイル:Instagram の公開APIが許可する最大品質
Metricool は Meta のコンテンツ公開APIを通じて投稿します。そのAPIには上限があります。その上限内に収まる最高のファイルを、60 Mbps マスターから(Resolve の配信レンダリングからではなく)作成します:
- H.264 High, yuv420p, 1080x1920, closed GOP, moov を先頭に(
+faststart) - ビデオ 24 Mbps 最大(上限は 25)、オーディオ AAC 128 kbps、48 kHz(Resolve は 320 kbps を書き込むため超過)
- ビデオとオーディオストリームのみ。 Resolve はタイムコードデータトラックを追加するため、
-dnで削除します
ffmpeg -i "Masters/<n>.mp4" -map 0:v:0 -map 0:a:0 -map_metadata -1 -dn \
-c:v libx264 -preset slow -crf 11 -maxrate 24M -bufsize 48M -pix_fmt yuv420p -profile:v high \
-g 48 -keyint_min 48 -sc_threshold 0 -flags +cgop \
-c:a aac -b:a 128k -ar 48000 -movflags +faststart "Reels/<n>.mp4"
CRF 16 でもトーキングヘッド映像は約 8 Mbps しか使用しなかったため、CRF 11 で予算をより多く使います。-preset slow では数分かかるため、バックグラウンドで実行します。ファイルを並列ではなく、一度に1つエンコードします: 多数の並列エンコードは書き込み中にディスクを満たし、すべてのファイルを切り詰める可能性があります。Instagram は独自の再圧縮を行うため、これにより開始時の品質が許容範囲内で最もクリーンであることを確認します。
リールごとに2つのレンダリング、1つではありません。 同じコーデック、同じ解像度、異なるビットレート:
| 解像度 | ビットレート | 用途 | |
|---|---|---|---|
| 配信 | 1080x1920 H.264 | Resolve パス、その後上記のアップロードファイルに置き換え | アップロード用 |
| マスター | 1080x1920 H.264 | 60 Mbps("VideoQuality": 60000 経由) | アーカイブ用 |
長尺動画も 1920x1080 で同じ2パス:10分の動画で約900MBの配信、約4.5GBのマスター。
1080x1920 が適切な解像度です:Instagram は関係なく 1080 幅で配信し、リールのクロップはすでに 4K からオーバーサンプリングされています。特に依頼がない限り、ProRes やより大きなフレームは提供しないでください。
VideoQuality は固定されます。パスごとに毎回設定してください。
レンダリング設定はプロジェクトに保存され、ジョブには保存されません。SetRenderSettings 呼び出しで VideoQuality を省略すると、レンダリングは以前の設定を静かに再利用します。リールマスターから 60000 を継承した長尺配信パスは、意図したよりも約5倍大きくなります。
project.SetRenderSettings({..., "VideoQuality": 12000}) # 配信、約12 Mbps
project.SetRenderSettings({..., "VideoQuality": 60000}) # マスター、約60 Mbps
配信パスではデフォルトに決して依存しないでください。そしてジョブリストを決して信頼しないでください: VideoQuality は、適用された場合でも GetRenderJobList() から None として読み戻されます。完成ファイルを確認してください:
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 out.mp4
長尺ペアをキューに入れる前に空き容量を確認してください。 60 Mbps で10分のマスターは約4.5GBです。
タイムラインもフォルダにエクスポートして、プロジェクトデータベースなしで編集を portable にします:
for i in range(project.GetTimelineCount()):
t = project.GetTimelineByIndex(i+1)
t.Export(os.path.join(d, t.GetName() + ".drt"), resolve.EXPORT_DRT)
resolve.GetProjectManager().ExportProject(project.GetName(), os.path.join(d, project.GetName() + ".drp"))
- 直接レンダリングします。 Resolve の
TargetDirを<そのフォルダ>/Reelsに設定し、後で移動する必要がないようにします。 - Resolve のタイムライン名からリネームします。
Reel_2_-_my_best_tip.mp4は2. my best tip.mp4になります:番号順でソートされ、一目で読めるようになります。マスターと .drt ファイルも同じ名前にして、3つのフォルダが揃うようにします。 - コピーではなく移動します。
~/Movies/<video>-*には作業ファイル(Whisper JSON、SRT、オーバーレイ mov、キャプション mov)が含まれます。これらは再レンダリングのためにそのまま残し、完成したエクスポートのみ移動します。 - スケジュール後に
Posting schedule.txtを書き込み、各リールの日付、時間、ネットワークを一覧表示して、ユーザーが Metricool を開かなくても何が出荷されたか確認できるようにします。
ディスク容量については、レンダリングが実際に容量不足で失敗した場合、または長尺ペアが明らかに収まらない場合にのみ言及してください。
カバー(Instagram のみ)
すべてのリールには、スケジュール前にカスタム Instagram カバーが設定されます。キャプションが承認された後、スケジュール前に reel-covers スキルを実行してください。 リールごとに承認された1つの JPG が <Video>/Covers/ に返されます。キャプションとスロットと同じゲートでカバーを表示し、すべてが1回の承認で完了するようにします。
各カバーを動画と同じ Drive ホップ(同じフォルダ <YOUR_DRIVE_UPLOAD_FOLDER_ID>、mimeType: image/jpeg)を通じてアップロードし、videoThumbnailUrl として uc?id=...&export=download 形式で渡します。Metricool が独自のコピーを取得したら、動画と同様に Drive コピーを削除します。
スケジュール設定
リールごとに1つの投稿、3つのネットワークすべて、カバーを含む。 カバーは Instagram でのみ重要です。TikTok は個人アカウントでは無視し、Shorts は確認済みチャンネルでのみ表示します。投稿を分割しないでください。
"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<video id>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<cover id>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<short title>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<title, <100 chars>"}
- 既にスケジュールされた投稿にカバーを追加する場合:
updateScheduledPostに投稿の完全な元のフィールド(テキスト、プロバイダー、メディア、すべてのネットワークデータ、日付)とvideoThumbnailUrlを指定します。上書きされ、元に戻せないため、getScheduledPostsからフィールドをそのままコピーしてください。既存のvideoThumbnailUrlまたはvideoCoverMillisecondsを決して置き換えないでください: いずれかがある投稿は、すでに選択されたカバーがあります。 - 1つの更新が "Failed to normalize media" で失敗し、他が成功した場合、その Drive からの取得が一度失敗したものです。投稿は変更されません。ファイルを再アップロードして(新しい ID)、再試行してください。同じ URL を再試行しても役に立ちません。
- 次に、
getScheduledPostsですべての投稿のvideoThumbnailUrlがstatic.metricool.comで始まることを確認し、Drive コピーを削除します。 - YouTube はタイトルと
madeForKidsを必要とします。 TikTok は短いタイトルを必要とします。 autoPublish: trueにより、Metricool が自動的に投稿します。
スケジュールするタイミング(デフォルトルール、必要に応じて調整)
今日の翌日から開始します。1日1投稿。既にコンテンツがある日は、次の空いている日に移動します。
day = 明日
for each post in order:
while day already has a scheduled post: day += 1
schedule at <YOUR_POST_TIME> local on day
day += 1
<YOUR_TIMEZONE>の<YOUR_POST_TIME>がデフォルトの投稿時間です。- 常に最初に
getScheduledPostsを呼び出し、明日から明日 +(投稿数 + 14日)までをカバーして、空き状況を確認します。このチェックをスキップすると、既に埋まっているスロットに投稿が配置される可能性があります。 - その日に何か(下書きを含む)がスケジュールされている場合、その日は埋まっていると見なされます。
- 複数の投稿を1日に詰め込まず、穴を残さないでください:目的は即座に開始する安定した毎日の連続投稿です。
- キャプションテキストにテストラベルを決して入れないでください。 「TEST DRAFT」、「safe to delete」などは禁止です。キャプションは常に完成したコピーであり、テスト実行であっても同様です。ユーザーはそれを保持したい場合があります。
テスト投稿は
draft: true+autoPublish: falseでマークしてください(下書きはプランナーで視覚的に区別されます)。そして、plannerUrlと投稿 ID を渡して、1回のクリックで削除できるようにします。
長尺 YouTube(メイン動画、Short ではない)
推奨:大きな長尺ファイルは Metricool で送信しないでください。YouTube Studio でアップロードしてください。 Metricool を通じて送信された約1GBのエクスポートは、転送中に切り詰められた状態で保存される可能性があります。Resolve は MP4 インデックス(moov)をファイルの末尾に配置するため、切り詰められたコピーは読み取り不可能になり、YouTube は既に「公開」された後に「処理が中止されました」と報告します。Metricool はエラーを報告しない場合があります。ファイル、タイトル、説明、サムネイルを Studio に貼り付けるためにユーザーに渡し、4K でレンダリングします(Studio にはサイズ問題はありません)。以下のすべては参考用に保持されています。
Metricool を大きなファイルに使用する場合は、保存されたメディアのサイズを確認してください...