Agendar para Redes Sociais
Configuração: preencha estes campos
Substitua cada placeholder abaixo antes da primeira execução.
| placeholder | o que é |
|---|---|
<YOUR_METRICOOL_BLOG_ID> | O blogId da sua marca no Metricool (obtido de getBrandSettings) |
<YOUR_TIMEZONE> | Fuso horário IANA para agendamento, ex. America/Sao_Paulo |
<YOUR_POST_TIME> | Horário padrão de postagem diária, ex. 10:00 |
<YOUR_IG_HANDLE>, <YOUR_TIKTOK_HANDLE>, <YOUR_YOUTUBE_CHANNEL_ID> | As contas conectadas no Metricool |
<YOUR_DRIVE_UPLOAD_FOLDER_ID> | Uma pasta do Google Drive compartilhada como "qualquer pessoa com o link" (veja o hop de mídia) |
<YOUR_VIDEO_LIBRARY> | Onde os arquivos finalizados são mantidos, ex. ~/Videos/Finalizados |
<YOUR_STANDING_CTA> | Linha de fechamento opcional que você coloca em toda legenda |
<YOUR_VOICE_FILE> | Opcional: caminho para um guia de voz/estilo para legendas |
Marca: blogId <YOUR_METRICOOL_BLOG_ID>, fuso horário <YOUR_TIMEZONE>.
Conectado: Instagram (<YOUR_IG_HANDLE>), TikTok (<YOUR_TIKTOK_HANDLE>), YouTube (<YOUR_YOUTUBE_CHANNEL_ID>).
O hop de mídia (a parte que não é óbvia)
A API do Metricool aceita apenas URLs públicas. Não aceita um arquivo local. A cadeia de funcionamento:
- Faça upload do MP4 para uma pasta do Drive, como
Metricool Uploads (Claude)(<YOUR_DRIVE_UPLOAD_FOLDER_ID>). Compartilhe a pasta "qualquer pessoa com o link" uma vez; os arquivos herdam isso, então não é necessário compartilhar por arquivo.cd <dir com o arquivo> && gws drive files create \ --params '{"uploadType":"multipart","supportsAllDrives":true}' \ --json '{"name":"<nome>.mp4","mimeType":"video/mp4","parents":["<YOUR_DRIVE_UPLOAD_FOLDER_ID>"]}' \ --upload "<arquivo>" - Agende usando a URL de download direto:
https://drive.google.com/uc?id=<fileId>&export=download. O link/viewfalha com "Falha ao normalizar mídia". - O Metricool copia o arquivo para seu próprio armazenamento; o
mediada resposta muda parastatic.metricool.com/.... - Exclua a cópia do Drive assim que você ver isso. O armazenamento nunca se acumula.
Claude geralmente não pode tornar arquivos do Drive públicos (o sandbox bloqueia) e não pode editar suas próprias permissões. É por isso que a pasta compartilhada existe. Se um arquivo acabar fora da pasta, peça ao usuário para movê-lo, em vez de tentar compartilhá-lo.
Legendas
Se você mantém um guia de voz, leia <YOUR_VOICE_FILE> primeiro e combine com ele. Caso contrário, use estes padrões.
Quando o reel tem um CTA de palavra-chave de comentário (uma palavra-chave que aciona um DM ou e-mail automatizado), a linha 1 é o CTA:
- Linha 1:
Comente <PALAVRA-CHAVE> e eu enviarei <nome do recurso> grátis 👇, palavra-chave em maiúsculas, exatamente como falada no clipe de CTA do reel. - Depois a linha de gancho e as 2-4 linhas de ensino abaixo.
- Feche com o CTA fixo, se você usar um.
- A palavra-chave deve corresponder ao CTA falado no reel (
reel_ctano arquivo de estado do vídeo). Uma palavra-chave por vídeo.
Formato para reels sem um CTA de palavra-chave:
- Linha 1 é o gancho. É a única linha que aparece no feed. Geralmente a mesma linha com que o reel abre.
- 2-4 linhas curtas que ensinam uma coisa. Quebras de linha entre elas, não um parágrafo.
- Sem spam de hashtags. Poucas ou nenhuma.
- Feche com
<YOUR_STANDING_CTA>exatamente se você tiver um.
Escreva a partir do que está realmente no reel, usando as palavras do criador da transcrição, não conselhos genéricos. Curto, mas educativo: o espectador deve aprender uma coisa utilizável só com a legenda.
Exemplos genéricos do formato:
"Postar todo dia = ESCONDER O POTE / Postar 3 vídeos excelentes por semana = CRESCIMENTO"
"Dica rápida se você quer um áudio melhor: coloque o microfone mais perto, não aumente o ganho..."
Renderização
As legendas são incorporadas: video-reels as coloca na V3 como um clipe de sobreposição alpha, com o cartão de texto-gancho na V2. Nada para importar, nenhuma caixa de seleção de incorporação.
- O usuário corta o reel. Ambas as faixas de sobreposição são clipes independentes, então cortar a V1 não as move. Se o timing for recortado, re-renderize as legendas desse reel em vez de deslizá-las.
- Claude as renderiza através da API do Resolve. Quatro reels levam cerca de 90 segundos.
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()
Então start_rendering. A string do codec é "H264", não "H.264", e o formato é "mp4". Monitore o diretório de saída em vez do status do trabalho; os arquivos aparecem à medida que terminam. Espere ~40MB para 30 segundos.
3. A renderização é o ponto sem retorno para o timing, então faça qualquer corte primeiro.
4. Verifique a saída com ffmpeg antes de fazer upload, um quadro dentro da janela do gancho e um no meio do reel:
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
Empilhe-os em uma única folha de prova e realmente olhe para ela. Este é o último lugar onde um cartão de gancho faltando ou uma faixa de legenda em branco pode ser detectado, e após o agendamento não há exclusão.
Para onde vão os arquivos finalizados
Tudo o que é mantido vai para <YOUR_VIDEO_LIBRARY>/, uma pasta por vídeo:
<YOUR_VIDEO_LIBRARY>/<Video> YYYY-MM-DD/
Reels/ o que foi postado. 1080x1920 H.264
Reels/Masters/ mesmo corte, arquivo de 60 Mbps
Timelines/ um .drt por timeline + o projeto .drp
Covers/ as capas de reel do Instagram aprovadas, 1080x1920 JPG
Thumbnails/ as opções de tamanho completo
YouTube/ o longa exportado, entrega + mestre
Agenda de postagem.txt o que sai, onde e quando
O arquivo de upload: tão alto quanto a API de publicação do Instagram permite
O Metricool posta através da API de publicação de conteúdo do Meta, que limita o que aceita. Faça upload do melhor arquivo que se encaixa dentro desses limites, feito a partir do mestre de 60 Mbps e não da renderização de entrega do Resolve:
- H.264 High, yuv420p, 1080x1920, GOP fechado, moov na frente (
+faststart) - vídeo no máximo 24 Mbps (o limite é 25), áudio AAC 128 kbps a 48 kHz (o Resolve escreve 320 kbps, que está acima)
- apenas fluxos de vídeo e áudio. O Resolve adiciona uma faixa de dados de timecode; remova-a com
-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"
No CRF 16, imagens de cabeça falante usavam apenas ~8 Mbps, então CRF 11 gasta mais do orçamento. Execute em segundo plano, já que vários reels levam minutos em -preset slow. Codifique um arquivo de cada vez, não em paralelo: muitas codificações paralelas podem encher o disco no meio da escrita e truncar todos os arquivos. O Instagram ainda re-comprime do seu lado; isso garante que o que ele começa seja o mais limpo possível.
Duas renderizações por reel, não uma. Mesmo codec, mesma resolução, taxa de bits diferente:
| resolução | taxa de bits | para | |
|---|---|---|---|
| entrega | 1080x1920 H.264 | Passagem do Resolve, depois substituída pelo arquivo de upload acima | upload |
| mestre | 1080x1920 H.264 | 60 Mbps via "VideoQuality": 60000 | arquivo |
Mesmas duas passagens para o longa em 1920x1080: ~900MB de entrega, ~4.5GB mestre para um vídeo de 10 minutos.
1080x1920 é a resolução correta: o Instagram serve 1080 de largura independentemente, e o corte do reel já está superamostrado a partir de 4K. Não ofereça ProRes ou um quadro maior a menos que solicitado.
VideoQuality é pegajoso. Defina-o em cada passagem.
As configurações de renderização ficam no projeto, não no trabalho. Deixe VideoQuality fora de uma chamada SetRenderSettings e a renderização reutiliza silenciosamente o que a anterior usou. Uma passagem de entrega de longa que herda 60000 dos mestres de reel sai ~5x maior do que o pretendido.
project.SetRenderSettings({..., "VideoQuality": 12000}) # entrega, ~12 Mbps
project.SetRenderSettings({..., "VideoQuality": 60000}) # mestre, ~60 Mbps
Nunca confie no padrão para a passagem de entrega. E nunca confie na listagem de trabalhos: VideoQuality retorna como None de GetRenderJobList() mesmo quando foi aplicado. Verifique o arquivo finalizado:
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 out.mp4
Verifique o espaço livre antes de enfileirar um par de longa. Um mestre de 10 minutos a 60 Mbps é ~4.5GB.
Exporte também as timelines para a pasta, para que a edição seja portátil sem o banco de dados do projeto:
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"))
- Renderize diretamente nela. Defina o
TargetDirdo Resolve para<essa pasta>/Reels, para que nada precise ser movido depois. - Renomeie a partir dos nomes das timelines do Resolve.
Reel_2_-_my_best_tip.mp4vira2. my best tip.mp4: numerado para ordenar, legível de relance. Mesmos nomes para os mestres e arquivos .drt, para que as três pastas se alinhem. - Mova, não copie.
~/Movies/<video>-*contém arquivos de trabalho (JSON do whisper, SRTs, movs de sobreposição, movs de legenda). Eles ficam no lugar para re-renderizações; as exportações finalizadas saem. - Escreva
Agenda de postagem.txtapós o agendamento, listando a data, hora e redes de cada reel, para que o usuário possa ver o que já saiu sem abrir o Metricool.
Mencione espaço em disco apenas se uma renderização falhar por falta de espaço, ou se um par de longa claramente não couber.
Capas (apenas Instagram)
Cada reel recebe uma capa personalizada do Instagram antes de ser agendado. Execute a skill reel-covers após as legendas serem aprovadas e antes de agendar. Ela retorna um JPG aprovado por reel em <Video>/Covers/. Mostre as capas no mesmo momento que as legendas e os slots, para que tudo seja aprovado em uma passagem.
Faça upload de cada capa através do mesmo hop do Drive que o vídeo (mesma pasta <YOUR_DRIVE_UPLOAD_FOLDER_ID>, mimeType: image/jpeg) e passe-a como videoThumbnailUrl usando o formulário uc?id=...&export=download. Exclua a cópia do Drive assim que o Metricool tiver sua própria cópia, o mesmo que com o vídeo.
Agendamento
Uma postagem por reel, todas as três redes, capa incluída. A capa só importa no Instagram. O TikTok a ignora em uma conta pessoal, e o Shorts só a mostra em um canal verificado. Não divida a postagem.
"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<id do video>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<id da capa>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<titulo curto>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<titulo, <100 chars>"}
- Adicionar uma capa a uma postagem já agendada:
updateScheduledPostcom os campos originais completos da postagem (texto, provedores, mídia, todos os dados de rede, data) maisvideoThumbnailUrl. Ele sobrescreve e não tem desfazer, então copie os campos degetScheduledPostsexatamente. Nunca substitua umvideoThumbnailUrlouvideoCoverMillisecondsexistente: uma postagem que tem qualquer um deles já tem uma capa escolhida. - Se uma atualização falhar com "Falha ao normalizar mídia" enquanto outras funcionaram, a busca do Drive falhou dessa vez. A postagem permanece inalterada. Faça upload do arquivo novamente (novo id) e tente novamente. Tentar a mesma URL não ajudará.
- Em seguida, verifique com
getScheduledPostsque ovideoThumbnailUrlde cada postagem agora começa comstatic.metricool.come exclua as cópias do Drive. - O YouTube requer um título e
madeForKids. O TikTok quer um título curto. autoPublish: truepermite que o Metricool o publique automaticamente.
Quando agendar (regra padrão, ajuste a gosto)
Comece no dia seguinte ao de hoje. Uma postagem por dia. Se um dia já tiver conteúdo, passe para o próximo dia livre.
dia = amanhã
para cada postagem em ordem:
enquanto dia já tem uma postagem agendada: dia += 1
agende às <YOUR_POST_TIME> local no dia
dia += 1
<YOUR_POST_TIME>em<YOUR_TIMEZONE>é o horário de postagem padrão.- Sempre chame
getScheduledPostsprimeiro, cobrindo amanhã até amanhã + (número de postagens + 14 dias), para que você possa ver as lacunas. Pular essa verificação pode colocar uma postagem em um slot já ocupado. - Um dia conta como ocupado se qualquer coisa estiver agendada naquele dia, rascunhos incluídos.
- Não agrupe várias postagens em um dia e não deixe buracos: o objetivo é uma execução diária constante começando imediatamente.
- Nunca coloque um rótulo de teste no texto da legenda. Nada de "RASCUNHO DE TESTE", nada de "seguro excluir". A legenda é a cópia finalizada, sempre, mesmo em uma execução de teste; o usuário pode querer mantê-la.
Marque postagens de teste com
draft: true+autoPublish: false(rascunhos são visualmente distintos no planejador) e entregue oplannerUrlmais o id da postagem para que possa ser excluída em um clique.
YouTube longa (o vídeo principal, não um Short)
Recomendado: não envie arquivos grandes de longa através do Metricool. Faça upload no YouTube Studio. Uma exportação de ~1GB enviada através do Metricool pode ser armazenada truncada no meio da transferência. O Resolve coloca o índice MP4 (moov) no final do arquivo, então uma cópia truncada é ilegível, e o YouTube relata "processamento abandonado" depois que já "publicou". O Metricool pode não relatar um erro. Entregue ao usuário o arquivo, título, descrição e miniatura para colar no Studio, renderizado em 4K (o Studio não tem problema de tamanho). Tudo abaixo é mantido para referência.
Se o Metricool for usado para um arquivo grande, verifique o armazenamento...
[truncado para tradução]