--- name: instagram-poster description: Publica conteΓΊdo no Instagram via Instagram Graph API (Meta) β€” suporta posts de imagem, carrossΓ©is e reels. Usa ImgBB para hospedagem gratuita de imagens. --- # πŸ“Έ PublicaΓ§Γ£o no Instagram via Graph API Skill para publicar conteΓΊdo no Instagram usando a API oficial gratuita do Meta, com upload automΓ‘tico de imagens locais via ImgBB. > [!IMPORTANT] > **Regra de Ouro:** Antes de publicar, SEMPRE pedir confirmaΓ§Γ£o ao usuΓ‘rio com preview completo do post (caption, imagem, tipo). Nunca publicar automaticamente sem aprovaΓ§Γ£o explΓ­cita. --- ## 🎯 Quando Usar Esta Skill Use quando o usuΓ‘rio pedir para: - **Publicar** um post no Instagram (imagem, carrossel ou reel) - **Postar** conteΓΊdo gerado pelo workflow `write-tech-article` ou pela skill `designer` - **Enviar** imagens/vΓ­deos para o Instagram Feed --- ## πŸ”§ PrΓ©-requisitos ### Arquivo de ConfiguraΓ§Γ£o β€” `artigos/.config-social-media.json` As credenciais do Instagram ficam na seΓ§Γ£o `instagram` do arquivo unificado `artigos/.config-social-media.json`: ```json { "instagram": { "account_id": "SEU_INSTAGRAM_BUSINESS_ID", "access_token": "SEU_ACCESS_TOKEN_META", "imgbb_api_key": "SUA_API_KEY_IMGBB" } } ``` > [!CAUTION] > Este arquivo contΓ©m credenciais sensΓ­veis. Ele **DEVE** estar no `.gitignore` do projeto. A skill verifica e adiciona automaticamente caso nΓ£o esteja. ### DependΓͺncias de Sistema - `curl` β€” para chamadas HTTP - `jq` β€” para parsing de JSON --- ## πŸš€ Fluxo de ExecuΓ§Γ£o ### Passo 0: Verificar ConfiguraΓ§Γ£o Antes de qualquer aΓ§Γ£o, verifique se `artigos/.config-social-media.json` existe e contΓ©m a seΓ§Γ£o `instagram`. **Se NΓƒO existir ou seΓ§Γ£o `instagram` ausente β†’ Executar Onboarding Guiado (ver seΓ§Γ£o abaixo)** **Se existir β†’ Ler as credenciais com `jq`:** ```bash CONFIG_FILE="artigos/.config-social-media.json" INSTAGRAM_ACCOUNT_ID=$(jq -r '.instagram.account_id' "$CONFIG_FILE") ACCESS_TOKEN=$(jq -r '.instagram.access_token' "$CONFIG_FILE") IMGBB_API_KEY=$(jq -r '.instagram.imgbb_api_key' "$CONFIG_FILE") ``` --- ### Passo 1: Upload de Imagem Local para ImgBB As imagens locais (ex: geradas pela skill `designer` em `image/`) precisam de URL pΓΊblica para a Graph API do Instagram. ```bash # Upload para ImgBB RESPONSE=$(curl -s -X POST "https://api.imgbb.com/1/upload" \ -F "key=$IMGBB_API_KEY" \ -F "image=@/caminho/local/imagem.jpg") # Extrair URL pΓΊblica IMAGE_URL=$(echo "$RESPONSE" | jq -r '.data.url') ``` > [!NOTE] > Se o usuΓ‘rio jΓ‘ tiver uma URL pΓΊblica de imagem, pular esta etapa. --- ### Passo 2: Criar Media Container ```bash # Post de imagem ΓΊnica (feed) CONTAINER=$(curl -s -X POST \ "https://graph.instagram.com/v25.0/${INSTAGRAM_ACCOUNT_ID}/media" \ -d "image_url=${IMAGE_URL}" \ -d "caption=${CAPTION}" \ -d "access_token=${ACCESS_TOKEN}") CREATION_ID=$(echo "$CONTAINER" | jq -r '.id') ``` **Para Carrossel (2-10 imagens):** ```bash # 1. Criar container individual para cada imagem (sem caption) CHILD_ID=$(curl -s -X POST \ "https://graph.instagram.com/v25.0/${INSTAGRAM_ACCOUNT_ID}/media" \ -d "image_url=${IMAGE_URL_N}" \ -d "is_carousel_item=true" \ -d "access_token=${ACCESS_TOKEN}" | jq -r '.id') # 2. Criar container do carrossel (com caption + children) CAROUSEL_ID=$(curl -s -X POST \ "https://graph.instagram.com/v25.0/${INSTAGRAM_ACCOUNT_ID}/media" \ -d "media_type=CAROUSEL" \ -d "caption=${CAPTION}" \ -d "children=${CHILD_1},${CHILD_2},${CHILD_N}" \ -d "access_token=${ACCESS_TOKEN}" | jq -r '.id') ``` **Para Reel (vΓ­deo):** ```bash CONTAINER=$(curl -s -X POST \ "https://graph.instagram.com/v25.0/${INSTAGRAM_ACCOUNT_ID}/media" \ -d "video_url=${VIDEO_URL}" \ -d "caption=${CAPTION}" \ -d "media_type=REELS" \ -d "access_token=${ACCESS_TOKEN}") ``` --- ### Passo 3: Publicar o Container ```bash RESULT=$(curl -s -X POST \ "https://graph.instagram.com/v25.0/${INSTAGRAM_ACCOUNT_ID}/media_publish" \ -d "creation_id=${CREATION_ID}" \ -d "access_token=${ACCESS_TOKEN}") POST_ID=$(echo "$RESULT" | jq -r '.id') ``` --- ## πŸ“‹ Onboarding Guiado Quando `artigos/.config-social-media.json` nΓ£o existe ou nΓ£o contΓ©m a seΓ§Γ£o `instagram`, apresente este guia: ``` ⚠️ ConfiguraΓ§Γ£o do Instagram nΓ£o encontrada em artigos/.config-social-media.json Para publicar no Instagram via API, vocΓͺ precisa configurar 3 coisas. Vou te guiar em cada uma: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ“‹ PASSO 1 β€” Conta Instagram Business/Creator Seu Instagram precisa ser conta profissional (grΓ‘tis). β†’ Instagram β†’ ConfiguraΓ§Γ΅es β†’ Conta β†’ Mudar para conta profissional β†’ Escolha "Business" ou "Criador de conteΓΊdo" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ“‹ PASSO 2 β€” Vincular ao Facebook A Graph API exige vΓ­nculo com uma PΓ‘gina do Facebook. β†’ Instagram β†’ ConfiguraΓ§Γ΅es β†’ Conta β†’ Contas vinculadas β†’ Facebook β†’ Vincule (ou crie) uma PΓ‘gina do Facebook ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ“‹ PASSO 3 β€” Criar Facebook App β†’ Acesse: https://developers.facebook.com/ β†’ BotΓ£o "Criar App" β†’ Tipo "Business" β†’ Adicione o produto "Instagram Graph API" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ“‹ PASSO 4 β€” Gerar Access Token β†’ No App Dashboard β†’ Ferramentas β†’ Graph API Explorer β†’ Selecione seu App β†’ Adicione permissΓ΅es: β€’ instagram_basic β€’ instagram_content_publish β€’ pages_read_engagement β†’ Clique "Generate Access Token" β†’ Converta para long-lived token (~60 dias): curl -s "https://graph.facebook.com/v25.0/oauth/access_token \ ?grant_type=fb_exchange_token \ &client_id=SEU_APP_ID \ &client_secret=SEU_APP_SECRET \ &fb_exchange_token=SEU_TOKEN_CURTO" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ“‹ PASSO 5 β€” Obter Instagram Account ID Com o token gerado, execute: # 1. Listar pΓ‘ginas do Facebook curl -s "https://graph.facebook.com/v25.0/me/accounts?access_token=SEU_TOKEN" # β†’ Copie o "id" da pΓ‘gina vinculada ao Instagram # 2. Obter o ID da conta Instagram curl -s "https://graph.facebook.com/v25.0/{PAGE_ID}?fields=instagram_business_account&access_token=SEU_TOKEN" # β†’ O campo "instagram_business_account.id" Γ© o seu account_id ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ“‹ PASSO 6 β€” API Key do ImgBB (para upload de imagens) β†’ Crie conta grΓ‘tis em: https://imgbb.com/ β†’ Acesse: https://api.imgbb.com/ β†’ Copie sua API Key ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Quando tiver os 3 valores, me informe: 1. Instagram Account ID 2. Access Token (long-lived) 3. ImgBB API Key Eu crio/atualizo o artigos/.config-social-media.json e adiciono ao .gitignore. ``` ApΓ³s o usuΓ‘rio fornecer os valores: 1. Criar (ou atualizar) `artigos/.config-social-media.json` com a seΓ§Γ£o `instagram` 2. Verificar `.gitignore` β€” se nΓ£o contiver `.config-social-media.json`, adicionar 3. Confirmar ao usuΓ‘rio que tudo estΓ‘ configurado 4. Prosseguir com a publicaΓ§Γ£o --- ## ⚠️ Tratamento de Erros | Erro | Causa ProvΓ‘vel | AΓ§Γ£o | |------|---------------|------| | `OAuthException` | Token expirado ou invΓ‘lido | Guiar renovaΓ§Γ£o do token (Passo 4 do onboarding) | | `Invalid image` | URL da imagem inacessΓ­vel | Verificar upload no ImgBB, tentar novamente | | `Application limit reached` | Quota da API excedida (100 posts/24h) | Informar limite e sugerir aguardar | | `Not a Business Account` | Conta pessoal | Guiar conversΓ£o para Business/Creator | | `Missing permission` | PermissΓ΅es insuficientes no token | Guiar geraΓ§Γ£o de novo token com permissΓ΅es corretas | --- ## πŸ“ Limites da API | Recurso | Limite | |---------|--------| | Posts por 24h | 100 (carrossel conta como 1) | | Imagens por carrossel | MΓ‘x. 10 | | Caption | MΓ‘x. 2.200 caracteres | | Hashtags por post | MΓ‘x. 30 | | Formato imagem | JPEG recomendado | --- ## ⚑ Quick Reference ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ INSTAGRAM POSTER β€” DECISΓƒO RÁPIDA β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Config β†’ artigos/.config-social-media.json (instagram) β”‚ β”‚ Sem config β†’ Onboarding guiado (ensina tudo ao usuΓ‘rio) β”‚ β”‚ Upload β†’ ImgBB (local β†’ URL pΓΊblica) β”‚ β”‚ API β†’ Instagram Graph API v25.0 (grΓ‘tis) β”‚ β”‚ Tipos β†’ Feed (1 img) | Carrossel (2-10) | Reel (vid) β”‚ β”‚ Fluxo β†’ ImgBB β†’ Container β†’ Publish β”‚ β”‚ β”‚ β”‚ REGRA DE OURO: Sempre pedir confirmaΓ§Γ£o antes de publicar β”‚ β”‚ LIMITE: 100 posts/24h | 2.200 chars caption | 30 hashtags β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ```