Instagram Dashboard. Metricas Diarias Automaticas
Quando Usar
- Quando o aluno quiser monitorar o crescimento do proprio perfil no Instagram de forma automatica, sem precisar abrir ferramentas toda manha.
- Como base de dados para
/copy-carrossel(conteudo baseado no que ja funciona) e/dados-instagram(analise profunda com insights de copy). - Quando o aluno precisar mostrar evolucao de metricas para clientes ou parceiros.
Nao usar para:
- Analisar perfis de concorrentes (usar
/dados-instagram). - Perfis privados (o Apify nao coleta dados de perfis privados).
O Que Entrega
| Arquivo | Descricao |
|---|---|
.claude/skills/instagram-dashboard/scripts/atualizar.py |
Script Python principal (Windows, macOS, Linux) — compartilhado entre todos os produtos |
.claude/skills/instagram-dashboard/scripts/atualizar_powershell.ps1 |
Script PowerShell de backup (Windows) |
meus-produtos/{ativo}/entregas/instagram-dashboard/dashboard.html |
Dashboard HTML completo, abre no navegador |
meus-produtos/{ativo}/entregas/instagram-dashboard/imagens/ |
Thumbnails e slides dos posts (gerados pelo script) |
meus-produtos/{ativo}/entregas/instagram-dashboard/insights.json |
Dados estruturados sem base64 (usado por /copy-variacao-post) |
meus-produtos/{ativo}/entregas/instagram-dashboard/historico.json |
Snapshots acumulativos (seguidores, engajamento) entre execucoes |
meus-produtos/{ativo}/entregas/instagram-dashboard/log.txt |
Log de cada execucao com timestamp e status |
Como Funciona
atualizar.py (ou atualizar_powershell.ps1 no Windows como backup)
├── POST apify~instagram-scraper (sync, timeout 60s)
│ directUrls + resultsType:"details" → seguidores, bio, foto de perfil
│ Baixa profilePicUrl via requests/WebClient → base64
├── POST apify~instagram-scraper (sync, timeout 300s) — loop ate 100 posts
│ directUrls + resultsType:"posts" → posts (fotos, carrosseis, reels)
│ Se posts com likesCount=-1 > 0: expande resultsLimit e busca de novo
│ Para quando tiver 30 posts com likes visiveis OU atingir 100 posts
│ Seleciona 30 priorizando posts com likes visiveis
├── Para cada post: baixa displayUrl via requests/WebClient → base64
│ Para carrosseis: baixa cada imagem do array images → base64
│ (CDN do Instagram bloqueia URLs diretas em HTML local)
├── Salva thumbnails e slides como .jpg em entregas/instagram-dashboard/imagens/
│ Armazena caminhos relativos em insights.json (thumbnailPath, carouselPaths)
│ Para Reels: transcreve audio via apify~whisper-speech-to-text → transcricao
└── Regenera dashboard.html com dados + imagens embutidos como variavel JS
O dashboard.html e sempre autossuficiente: dados e thumbnails embutidos diretamente no HTML gerado pelo script. Nao depende de servidor local nem de fetch(). Funciona abrindo direto no navegador, inclusive offline apos a primeira geracao.
APIs Utilizadas
Uma chamada de perfil + loop de posts (ambas sync, mesmo ator):
| # | Ator Apify | Tipo | Parametro chave | Retorna |
|---|---|---|---|---|
| 1 | apify~instagram-scraper |
sync, timeout 60s | directUrls, resultsType: "details" |
seguidores, bio, foto, verificado |
| 2 | apify~instagram-scraper |
sync, timeout 300s | directUrls, resultsType: "posts", resultsLimit: 30..100 |
posts com likes, comentarios, views. Expande ate 100 para substituir likes ocultos. |
Por que sync e nao async: o endpoint async do Apify retorna run IDs que ficam inacessiveis via polling (record-not-found) dependendo do plano da conta. O sync e mais simples e confiavel.
Todas as imagens em base64: o CDN do Instagram bloqueia carregamento de imagens de arquivos HTML locais. O script baixa TODAS as imagens (foto de perfil, thumbnails dos posts, imagens do carrossel) via requests (Python) ou WebClient (PowerShell) com User-Agent e Referer: https://www.instagram.com/ e converte para data:image/jpeg;base64,....
Campo de imagem usado: displayUrl (thumbnail JPEG do post). Para carrosseis, o campo images pode estar vazio — o script usa displayUrl como fallback. O cycling de carrossel funciona quando images tem multiplas entradas.
insights.json com caminhos de arquivo: alem de embutir base64 no dashboard, o script salva os thumbnails e slides como .jpg em entregas/instagram-dashboard/imagens/ e armazena os caminhos relativos no insights.json (thumbnailPath, carouselPaths). Isso permite que o /copy-variacao-post use o Read tool do Claude para analisar visualmente as imagens.
Transcricao de Reels: para posts do tipo Video, o script chama apify~whisper-speech-to-text com a videoUrl do post e armazena a transcricao em insights.json. O /copy-variacao-post usa essa transcricao para entender o conteudo real do Reel sem precisar reproduzir o video.
Custo por execucao: ~US$0,05-0,20 no plano gratuito Apify (varia com quantas iteracoes de busca expandida forem necessarias).
Compatibilidade por Sistema Operacional
O script principal e atualizar.py (Python 3), que funciona nativamente em todos os sistemas. O atualizar_powershell.ps1 e o backup validado para Windows.
Instalacao da dependencia (unica):
pip install requests
| OS | Script | Como rodar |
|---|---|---|
| Windows | atualizar.py |
python atualizar.py --abrir |
| macOS | atualizar.py |
Python 3 ja incluso. python3 atualizar.py --abrir |
| Linux | atualizar.py |
Python 3 ja incluso. python3 atualizar.py --abrir |
| Windows (backup) | atualizar_powershell.ps1 |
powershell -ExecutionPolicy Bypass -File atualizar_powershell.ps1 -Abrir |
Configuracao Necessaria
| Chave | Onde fica | Como obter |
|---|---|---|
APIFY_API_TOKEN |
.env |
console.apify.com > Settings > Integrations > Personal API token |
IG_USER |
.env |
@ do perfil do aluno (sem @, lowercase). Tambem salvo em entregas/conta.md |
Dashboard: O Que Mostra
ESTRUTURA OBRIGATORIA — todas as 12 secoes devem estar presentes em todos os dashboards gerados, nesta ordem:
- Cabecalho (perfil): foto de perfil em base64 (fallback: inicial do nome), @username, bio, ultima atualizacao
- Visao Geral (4 cards KPI): seguidores, engajamento medio (%) com total de shares, total de posts, formato mais postado
- Evolucao ao Longo do Tempo: graficos de tendencia de seguidores e engajamento medio entre execucoes. So aparece quando historico.json tem 2+ snapshots.
- Desempenho por Formato: cards separados para Reels, Carrossel e Foto com media de likes, comentarios, shares e views totais (Reels).
- Melhores Horarios para Postar: heatmap 7x24 (dia da semana x hora). Intensidade = engajamento medio. Tooltip com contagem e media.
- Frequencia de Postagem: posts por semana vs engajamento. Insight comparando semanas com 4+ posts vs menos.
- Top 3 Posts: os 3 com maior engajamento, com thumbnail em base64, badge de tipo, likes, comentarios, shares, views (Reels), taxa de engajamento e link.
- Analise de Hashtags: top 10 hashtags por engajamento medio. Barras horizontais com contagem e media.
- Tamanho da Legenda vs Engajamento: 3 buckets (curta, media, longa) com engajamento medio por faixa. Insight textual.
- Linha do Tempo (4 graficos): curtidas, visualizacoes (Reels), engajamento (%) e compartilhamentos. Canvas puro, uma linha por formato, tooltip colorido.
- Barra de Filtros: filtros interativos por tipo (Reel/Carrossel/Foto) e periodo (7/15/30 dias). Afeta grade de posts, Top 3 e KPIs.
- Todos os Posts (grade): thumbnail ciclavel em base64, badge de tipo, likes, comentarios, shares, views (Reels), data, legenda truncada e link.
NUNCA omitir nenhuma dessas 12 secoes. Nao existe versao simplificada do dashboard.
Fluxo
PASSO -1. Verificar Plataforma Ativa (OBRIGATORIO — executar antes de qualquer outra coisa)
Leia .env. Verifique o valor de INSTAGRAM_ATIVO.
Cenario: INSTAGRAM_ATIVO=false (aluno ja disse que nao tem Instagram)
Voce marcou que nao tem um perfil ativo no Instagram.
Quer atualizar essa preferencia?
1. Sim, tenho Instagram agora — configurar o dashboard
2. Nao, pode ignorar
Se escolher 1: troque INSTAGRAM_ATIVO=false por INSTAGRAM_ATIVO=true no .env e continue para o PASSO 0.
Se escolher 2: encerre sem fazer nada.
Cenario: INSTAGRAM_ATIVO nao existe no .env (primeira vez)
Voce tem um perfil ativo no Instagram que quer monitorar?
1. Sim, tenho Instagram
2. Nao tenho Instagram
Se escolher 1: salve INSTAGRAM_ATIVO=true no .env (Edit cirurgico, adicionar linha). Continue para o PASSO 0.
Se escolher 2: salve INSTAGRAM_ATIVO=false no .env. Encerre com:
Tudo bem. Se um dia criar um perfil no Instagram, e so chamar essa skill de novo.
Cenario: INSTAGRAM_ATIVO=true (aluno confirmou que tem Instagram)
Continue direto para o PASSO 0 sem perguntar nada.
PASSO 0. Detectar Estado
Antes de qualquer pergunta, leia em paralelo:
.envna raiz do projeto — existeAPIFY_API_TOKENcom valor? existeIG_USERcom valor?meus-produtos/{ativo}/entregas/instagram-dashboard/dashboard.html— o arquivo existe?
Cenario A. Dashboard ja configurado (dashboard.html existe)
Mostre o menu sem perguntas:
Dashboard do Instagram ja esta configurado.
Perfil monitorado: @{IG_USER do .env}
O que quer fazer?
1. Abrir o dashboard agora
2. Atualizar os dados agora
3. Trocar o perfil monitorado
4. Recriar o script do zero
Opcao 1 — Abrir (Windows):
start meus-produtos/{ativo}/entregas/instagram-dashboard/dashboard.html
macOS: open ... / Linux: xdg-open ...
Opcao 2 — Atualizar:
python .claude/skills/instagram-dashboard/scripts/atualizar.py --abrir
Aguarde, leia o log em meus-produtos/{ativo}/entregas/instagram-dashboard/log.txt, informe o resultado.
Opcao 3 — Trocar perfil:
Pergunte o novo @. Normalize (sem @, lowercase). Atualize com Edit cirurgico no .env: linha IG_USER=<novo_username>. Execute para testar:
python .claude/skills/instagram-dashboard/scripts/atualizar.py --abrir
Opcao 4 — Recriar do zero: Siga o Cenario B abaixo.
Cenario B. Primeira configuracao
1. Username do Instagram
Prioridade: ler .env primeiro (IG_USER). Se encontrar, confirme:
Encontrei o Instagram configurado: @{username}
E esse mesmo perfil que quer monitorar?
1. Sim, pode continuar
2. Nao, quero usar outro
Se nao encontrar, pergunte:
Qual o usuario do seu perfil no Instagram? (so o nome, sem o arroba)
(ex: meuperfil)
Normalize: sem @, lowercase. Salve com Edit cirurgico no .env: IG_USER=<username>.
2. Token Apify
Se APIFY_API_TOKEN estiver no .env: use diretamente, nao pergunte.
Se nao estiver: execute a skill configurar-apify e retorne aqui apos concluir.
PASSO 1. Confirmacao
Configuracao confirmada:
- Perfil Instagram: @{username}
- Token Apify: configurado
- Script: .claude/skills/instagram-dashboard/scripts/atualizar.py
- Dashboard: meus-produtos/{ativo}/entregas/instagram-dashboard/dashboard.html
Custo estimado no Apify: menos de US$ 0,20 por geracao no plano gratuito.
1. Tudo certo, atualizar agora
2. Quero ajustar algo
PASSO 2. Executar
python .claude/skills/instagram-dashboard/scripts/atualizar.py --abrir
macOS / Linux: python3 ...
Aguarde a conclusao (pode levar ate 10 minutos — busca expandida de ate 100 posts).
Leia o log para confirmar sucesso:
tail -10 meus-produtos/{ativo}/entregas/instagram-dashboard/log.txt
Erros comuns:
| Erro no log | Causa | Solucao |
|---|---|---|
401 ou autenticacao |
Token Apify invalido | Verificar token em console.apify.com |
Perfil vazio ou erro |
@ errado ou perfil privado | Confirmar username; perfis privados nao funcionam |
| Arquivo travado pelo navegador | Browser com dashboard aberto | Fechar a aba do dashboard e rodar novamente |
PASSO 3. Entrega
Apos confirmar sucesso no log, atualize o painel de entregas:
py -3 scripts/painel-incremental.py --secao dashboards
(macOS/Linux: python3 scripts/painel-incremental.py --secao dashboards)
Isso embute o dashboard como aba dentro do painel de entregas do produto ativo.
Se o painel ainda nao existir (produto recente sem /produto-concepcao), informe:
O painel de entregas ainda nao foi criado para este produto.
Rode /produto-concepcao primeiro para gerar o painel, depois atualize os dashboards.
Informe ao aluno:
Dashboard do Instagram gerado.
Acesse pelo Painel de Entregas:
meus-produtos/{ativo}/painel-entregas.html (aba Dashboards)
Para atualizar os dados quando quiser:
python .claude/skills/instagram-dashboard/scripts/atualizar.py
(depois rode: py -3 scripts/painel-incremental.py --secao dashboards)
Perfil monitorado: @{username}
Sem agendamento automatico: nao configurar CronCreate nem schtasks. O aluno roda o script manualmente.
Backup PowerShell (Windows):
powershell -ExecutionPolicy Bypass -File .claude\skills\instagram-dashboard\scripts\atualizar_powershell.ps1 -Abrir
PASSO 4. Verificar Proxima Plataforma na Fila
Apos confirmar entrega com sucesso, verifique se meus-produtos/{ativo}/.dashboard-queue.json existe.
Se o arquivo NAO existir: exibir os "Proximos Passos" normalmente e encerrar. (Skill foi chamada diretamente, sem fila.)
Se o arquivo EXISTIR:
- Leia o conteudo do arquivo.
- Mova
"instagram"dependentesparaconcluidos(Edit cirurgico no JSON). - Verifique se ainda ha itens em
pendentes.
Se pendentes estiver vazio: delete o arquivo .dashboard-queue.json. Exiba:
Todos os dashboards foram gerados.
E encerre.
Se pendentes tiver proxima plataforma, exiba a oferta de continuacao:
Instagram concluido.
Proximo na fila: {Plataforma} ({@username ou canal, se ja estiver no .env})
1. Gerar o dashboard do {Plataforma} agora
2. Parar por aqui (posso continuar depois chamando /dashboard-social)
- Opcao 1: executar a skill correspondente (
tiktok-dashboardouyoutube-dashboard). - Opcao 2: encerrar sem alterar a fila. Na proxima chamada a
/dashboard-social, o arquivo sera detectado e oferecera retomada automatica.
Regra: nunca exibir os "Proximos Passos" quando o arquivo de fila existir. A fila tem prioridade sobre as sugestoes de conteudo.
Regras
- Sempre ler
.envantes de pedir o token Apify ao usuario. SeAPIFY_API_TOKENestiver presente, usar diretamente. So perguntar se o arquivo nao existir ou a chave estiver vazia. - O token Apify e o username do Instagram ficam no
.env(APIFY_API_TOKENeIG_USER). O script le essas variaveis do.envem runtime. Nunca hardcodar no script. - Nunca sobrescrever
entregas/conta.mdinteiro. Usar Edit cirurgico para atualizar so o campoInstagram:. - Dashboard em HTML puro. Sem libs externas alem de Google Fonts. Canvas puro para grafico.
- Nao usar travessao em nenhum texto exibido no dashboard.
- Design system Fluxo Criativo: fundo
#000000, surface#111111, borda#252525, texto#e8e8e6, muted#a8a8a3, neon#c4ff5ecomo cor de destaque principal. Fontes JetBrains Mono + Space Grotesk via Google Fonts. Cards comborder-top:2px solid, sem sombra, sem border-radius. - Se o perfil for privado, informar e sugerir export manual via Metricool ou Instagram Insights.
- CRITICO — Thumbnails obrigatorios em base64: NUNCA usar a URL do CDN do Instagram diretamente como
srcde<img>. O CDN bloqueia carregamento de arquivos HTML locais. O script DEVE baixar cada thumbnail comrequests(Python) ouWebClient(PowerShell) com User-Agent e Referer do Instagram e converter paradata:image/jpeg;base64,...antes de embutir no JSON. Isso e inegociavel para as imagens aparecerem no dashboard. - CRITICO — Usar apenas
apify~instagram-scrapercom chamadas sync: NAO usar atoresnH2AHrwxeTRJoN5hXnemxMc5Ga1oCONPmWJIa(retornam run IDs inacessiveis no polling). Usar sempre o endpointrun-sync-get-dataset-itemscomresultsType:"details"(perfil) eresultsType:"posts"(posts), ambos viadirectUrlscom a URL do perfil. - CRITICO — Campo de imagem correto: o campo
displayUrldo Apify retorna a thumbnail do post. O campoimagespode estar vazio mesmo para carrosseis. O script deve sempre usardisplayUrlcomo fallback obrigatorio para a thumbnail principal. - Likes ocultos (likesCount = -1): o Instagram permite que criadores ocultem a contagem de likes por post. O Apify retorna
likesCount: -1nesses casos. O script deve: (1) tentar buscar mais posts do perfil para substituir os com likes ocultos — expande oresultsLimitincrementalmente ate ter 30 posts com likes visiveis ou atingir o cap de 100 posts; (2) priorizar posts com likes visiveis na selecao final dos 30 exibidos; (3) exibir--no lugar de-1no dashboard; (4) usar0nos calculos internos (media, ordenacao Top 3, altura de barras no grafico).
Proximos Passos Apos Configurar
/copy-variacao-post— criar variacoes dos posts com mais engajamento (le thumbnails e insights.json do dashboard)/copy-carrossel— criar conteudo novo baseado nos posts com mais engajamento/copy-anuncio— transformar os dados em anuncios com angulos testados