Como automatizar suas redes sociais com a API oficial da Meta em Python
Publicar o mesmo conteúdo no Facebook e no Instagram todos os dias toma tempo. Copiar a legenda, subir a imagem, conferir o link, repetir na outra rede. Quando a empresa já produz conteúdo com regularidade, esse trabalho manual vira gargalo.
A Meta mantém um SDK oficial em Python que conversa direto com a Graph API, a mesma API usada pelo Gerenciador de Anúncios e pelo Meta Business Suite. Com ele, um script consegue publicar na Página do Facebook, no perfil profissional do Instagram e ainda consultar métricas, sem depender de ferramentas de terceiros.
O que é o facebook-python-business-sdk
O repositório oficial fica em github.com/facebook/facebook-python-business-sdk e é distribuído no PyPI como facebook_business. A versão atual (26.0.2) acompanha a Graph API v26.0.
Ele reúne em um só pacote várias APIs da Meta:
- Pages API: publicações, fotos, agendamentos e insights da Página
- Instagram Graph API: publicação de imagens, carrosséis, Reels e métricas do perfil profissional
- Marketing API: campanhas, conjuntos de anúncios, criativos, públicos e relatórios
- Business Manager: contas, ativos e permissões
- Conversions API: envio de eventos de conversão a partir do servidor
Quase todo o código da pasta adobjects/ é gerado automaticamente a partir da especificação da Graph API. Cada nova versão da API chega ao SDK por commits automáticos. Por isso, não edite esses arquivos: escreva sua automação em um projeto separado que importa o pacote.
O que você precisa antes de começar
A parte mais trabalhosa não é o código, é a configuração na Meta.
- Um app em developers.facebook.com, do tipo Business.
- Uma Página do Facebook em que você seja administrador.
- Uma conta profissional do Instagram (Empresa ou Criador de conteúdo) vinculada a essa Página.
- Um token de acesso da Página com as permissões necessárias.
| Objetivo | Permissões |
|---|---|
| Publicar na Página do Facebook | pages_manage_posts, pages_read_engagement, pages_show_list |
| Publicar no Instagram | instagram_basic, instagram_content_publish, pages_show_list |
| Ler métricas | read_insights, instagram_manage_insights |
Para testes, o Graph API Explorer gera um token de usuário com essas permissões. Para uso contínuo, troque-o por um token de longa duração ou, melhor ainda, use um usuário do sistema no Business Manager, que gera tokens sem prazo de expiração vinculados à empresa e não à conta pessoal de alguém.
Token de acesso é credencial. Não coloque no código, não envie para o Git e não cole em ferramentas de terceiros. Guarde em variável de ambiente ou em um cofre de segredos e revogue imediatamente se vazar.
Instalação
python3 -m venv .venv
source .venv/bin/activate
pip install facebook_business
As credenciais ficam em variáveis de ambiente:
export FB_APP_ID="seu_app_id"
export FB_APP_SECRET="seu_app_secret"
export FB_PAGE_TOKEN="token_da_pagina"
export FB_PAGE_ID="id_da_pagina"
export IG_USER_ID="id_da_conta_instagram"
Informar o app_secret faz o SDK calcular o appsecret_proof em todas as chamadas, uma assinatura HMAC que impede o uso do token fora do seu app. Vale ativar a opção Exigir prova de segredo do app nas configurações avançadas do app.
Descobrindo os IDs da Página e do Instagram
Com um token de usuário, a lista de Páginas que você administra vem junto com o token de cada uma. O ID do Instagram fica no campo instagram_business_account da Página:
import os
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.user import User
from facebook_business.adobjects.page import Page
FacebookAdsApi.init(
app_id=os.environ["FB_APP_ID"],
app_secret=os.environ["FB_APP_SECRET"],
access_token=os.environ["FB_USER_TOKEN"],
)
for pagina in User(fbid="me").get_accounts(fields=["name", "id", "access_token"]):
ig = Page(pagina["id"]).api_get(fields=["instagram_business_account"])
print(pagina["name"], pagina["id"], ig.get("instagram_business_account"))
Publicando na Página do Facebook
Com o token da Página, uma publicação com texto e link é uma chamada a create_feed:
import os
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.page import Page
FacebookAdsApi.init(
app_id=os.environ["FB_APP_ID"],
app_secret=os.environ["FB_APP_SECRET"],
access_token=os.environ["FB_PAGE_TOKEN"],
)
pagina = Page(os.environ["FB_PAGE_ID"])
post = pagina.create_feed(params={
"message": "Novo artigo no blog: como automatizar suas redes sociais com a API da Meta.",
"link": "https://triatti.com/artigos",
})
print("Publicado:", post["id"])
Para publicar uma imagem, use create_photo com uma URL pública:
pagina.create_photo(params={
"url": "https://seusite.com/imagens/capa.jpg",
"caption": "Legenda da foto",
})
Agendando a publicação
A Página aceita publicações agendadas. Envie published=False e o horário em timestamp Unix. O horário precisa estar entre 10 minutos e 30 dias no futuro:
from datetime import datetime, timedelta
quando = int((datetime.now() + timedelta(days=1)).timestamp())
pagina.create_feed(params={
"message": "Este post sai amanhã.",
"link": "https://triatti.com/artigos",
"published": False,
"scheduled_publish_time": quando,
})
Publicando no Instagram
O Instagram funciona em duas etapas. Primeiro você cria um contêiner de mídia com a imagem e a legenda. Depois publica esse contêiner.
import os
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.iguser import IGUser
FacebookAdsApi.init(
app_id=os.environ["FB_APP_ID"],
app_secret=os.environ["FB_APP_SECRET"],
access_token=os.environ["FB_PAGE_TOKEN"],
)
ig = IGUser(os.environ["IG_USER_ID"])
# 1. cria o contêiner
container = ig.create_media(params={
"image_url": "https://seusite.com/imagens/capa.jpg",
"caption": "Automatize suas redes com a API oficial da Meta.\n\n#automacao #python #meta",
"alt_text": "Logo da Meta ao lado de ícones do Facebook e Instagram",
})
# 2. publica
publicado = ig.create_media_publish(params={"creation_id": container["id"]})
print("Publicado no Instagram:", publicado["id"])
Alguns cuidados que evitam a maior parte dos erros:
- A imagem precisa estar em uma URL pública. A Meta baixa o arquivo do seu servidor; endereços internos, com login ou atrás de firewall falham.
- Use JPEG e proporção entre 4:5 e 1.91:1 para o feed.
- Vídeos e Reels são processados em segundo plano. Crie o contêiner com
media_type="REELS"evideo_url, consulte o campostatus_codedo contêiner até ele ficarFINISHEDe só então chamecreate_media_publish. - Existe limite de publicações por dia na conta. Consulte o saldo atual com
ig.get_content_publishing_limit(fields=["quota_usage", "config"])antes de rodar publicações em lote.
Para carrosséis, crie um contêiner para cada imagem com is_carousel_item=True, depois um contêiner com media_type="CAROUSEL" e children com a lista de IDs, e publique este último.
Lendo métricas
O mesmo SDK lê o desempenho do que foi publicado, o que permite montar relatórios sem exportar planilhas à mão:
for post in pagina.get_published_posts(fields=["message", "created_time", "permalink_url"], params={"limit": 5}):
print(post["created_time"], post.get("permalink_url"))
for midia in ig.get_media(fields=["caption", "like_count", "comments_count", "permalink"], params={"limit": 5}):
print(midia.get("like_count"), midia.get("comments_count"), midia["permalink"])
Tratando erros
Quando a API recusa uma chamada, o SDK levanta FacebookRequestError, que traz o código e a mensagem da Meta:
from facebook_business.exceptions import FacebookRequestError
try:
pagina.create_feed(params={"message": "Teste"})
except FacebookRequestError as e:
print(e.api_error_code(), e.api_error_message())
Os casos mais comuns são token expirado (código 190), permissão ausente (código 10 ou 200) e limite de chamadas atingido (códigos 4, 17 e 32). Em automações que rodam sozinhas, registre esses erros e avise alguém em vez de tentar de novo sem parar.
Juntando tudo em uma rotina
Com as peças acima, um fluxo típico fica assim:
- O artigo é publicado no site.
- Um script pega o título, o resumo, a capa e o link.
- O script publica na Página do Facebook com o link do artigo.
- O script cria o contêiner e publica a capa no Instagram com a legenda e as hashtags.
- Os IDs das publicações ficam registrados para consultar as métricas depois.
Esse script pode rodar por cron, por um webhook do seu CMS ou dentro de uma pipeline de CI. O custo é zero além da infraestrutura: a Graph API não cobra pelas chamadas de publicação.
Quando faz sentido usar o SDK
O SDK oficial vale a pena quando a empresa quer controle total do processo, integração com sistemas próprios e nenhuma dependência de plataformas pagas de agendamento. Também é a base para quem pretende, mais adiante, automatizar campanhas e relatórios de anúncios, já que tudo está no mesmo pacote.
Se o volume é pequeno e não há ninguém para manter o código, uma ferramenta pronta pode ser mais simples. O ponto de atenção é sempre o mesmo: tokens bem guardados, permissões mínimas e alguém acompanhando quando a API mudar de versão.
Precisa integrar as redes sociais da sua empresa aos seus sistemas? A TRIAT pode ajudar a desenhar e manter essa automação.
Precisa disso rodando na sua empresa?
A TRIAT implanta e monitora Linux, storage, virtualização, redes e segurança — do projeto ao suporte 24/7.
Falar com um especialista

