Runbook - Módulo Instagram Posts

Agendamento de posts no feed do Instagram direto pela plataforma. Validado em 2026-08-22 na conta master master@exemplo.com (company 2), whitelabel app.marca-exemplo.com / bac

8 min de leitura Atualizado em 22 de ago. de 2026

Agendamento de posts no feed do Instagram direto pela plataforma. Validado em 2026-08-22 na conta master master@exemplo.com (company 2), whitelabel app.marca-exemplo.com / backend.marca-exemplo.com. Primeira leva real: 11 peças agendadas (IDs 183–193), todas 201.

Onde mora na UI

Sidebar → grupo Instagram’sPosts → rota /instagram/posts.

  • Abas: Publicações (feed já postado, espelha o @ real) · Agendamentos (fila PENDING)
  • Botões: Publicar (abre modal de criação) · Atualizar Posts
  • ⚠ Não confundir com /live-chat-instagram (inbox de conversas do canal).

API validada

MétodoEndpointUso
GET/instagram/posts?searchParam=&pageNumber=1publicações existentes
GET/instagram/publish/scheduledfila de agendados (array com id, caption, mediaUrls, scheduledAt UTC ISO, status PENDING/PUBLISHED)
POST/instagram/publish/create/schedule/{instagramId}cria agendado (201). instagramId=459 na conta @sagazchat
  • Upload da mídia acontece dentro do fluxo do form (multipart interno); depois o backend guarda em marca-exemplo.blackstorages.com/instagram/{companyId}/scheduled/.
  • scheduledAt chega em UTC (2026-08-24T14:00:00Z = 11h BRT) — o campo do form aceita hora local e converte certo.
  • Tipos: radio STORIES / POST / CAROUSEL; quando: radio NOW / DATE.

Gotchas do formulário (custaram depuração)

  1. Checkbox sem rótulo nenhum (logo abaixo do handle @conta) é obrigatório: sem marcar, o botão Publicar fica disabled sem mensagem nenhuma. Marcando, destrava.
  2. O input[type=file] some do DOM após o upload — não da pra re-ler files[0] depois; validar upload esperando img[src^="blob:"].
  3. Os radios são spans MUI sem <label> — clicar no texto (“Agendar”) pode não disparar onChange; clicar em span.MuiRadio-root:has(input[value="DATE"]).
  4. Escape fecha o modal inteiro (e o clique seguinte em “Publicar” reabre um modal vazio = falso sucesso). Commitar o campo data com Tab, nunca Escape.
  5. Campo data/hora é input texto com máscara DD/MM/YYYY hh:mm — aceita type() normal.
  6. Limite: imagem 8MB (aceita jpeg/jpg/png), vídeo 50MB mp4.

Scripts validados

ScriptModoRiscoInputOutput
sagaz-rc-ig-probe.mjsleiturabaixoenv RC_EMAIL/RC_PASSWORDlogin + dump sidebar; salva _out/rc-session.json
sagaz-rc-ig-inspecionar.mjs / -abrir.mjs / -posts.mjsleiturabaixosessãoscreenshots + dump DOM das rotas
sagaz-rc-ig-agendar.mjsescritamédiomanifest JSON via IG_MANIFEST ([{id,file,caption,when}])agenda N posts; _out/rc-ig-resultados.json + prints pre/pós
sagaz-rc-ig-verificar.mjsleiturabaixosessãoconteúdo da aba Agendamentos

Credenciais sempre por variável de ambiente (nunca hardcoded); sessão Playwright reutilizável em scripts/_out/rc-session.json (padrão do scripts-playwright).

Relacionado