Como publicar posts em redes sociais a partir do Python

Como publicar posts em redes sociais a partir do Python

Publique e agende em 15 redes a partir do Python. Exemplos funcionais, os campos por plataforma que são realmente obrigatórios e como evitar surpresas.

Se o seu pipeline de conteúdo está em Python, seja um scraper, um job de dados ou um fluxo de LLM, publicar não deveria significar recorrer a outra coisa.

Instalar e autenticar

pip install bulkpublish
from bulkpublish import BulkPublish

bp = BulkPublish("bp_your_key_here")

O cliente também lê BULKPUBLISH_API_KEY do ambiente, o que é o hábito melhor:

import os
from bulkpublish import BulkPublish

bp = BulkPublish(os.environ["BULKPUBLISH_API_KEY"])

Crie primeiro um rascunho

post = bp.posts.create(
    content="Launching our new product today!",
    channels=[
        {"channelId": 1, "platform": "x"},
        {"channelId": 2, "platform": "linkedin"},
    ],
    status="draft",
)

Rascunhos ficam visíveis no app, então você pode ver o que seu código realmente produziu antes que um público veja. Mude para "scheduled" quando estiver satisfeito.

Encontre os IDs dos seus canais em vez de fixá-los no código:

channels = bp.channels.list()

Agende um

post = bp.posts.create(
    content="Launching our new product today!",
    channels=[{"channelId": 1, "platform": "x"}],
    status="scheduled",
    scheduled_at="2026-04-10T09:00:00Z",
    timezone="America/New_York",
)

scheduled_at é ISO-8601 e timezone é um nome IANA. Passe o fuso horário explicitamente para qualquer coisa recorrente, senão seu horário de publicação vai se deslocar uma hora duas vezes por ano quando o horário de verão mudar.

Requisitos por plataforma

Esta é a parte que surpreende as pessoas. Algumas plataformas exigem campos que outras não exigem, e é em platform_specific que eles entram. O YouTube, por exemplo, exige um título de 1 a 100 caracteres.

post = bp.posts.create(
    content="Behind the scenes on this month's build.",
    channels=[{"channelId": 5, "platform": "youtube"}],
    media_files=[file_id],
    platform_specific={"youtube": {"title": "How we ship every week"}},
    status="scheduled",
    scheduled_at="2026-04-10T09:00:00Z",
)

Se um campo obrigatório por plataforma estiver faltando, o post é rejeitado no momento em que você o cria, em vez de falhar silenciosamente depois. Capture essa exceção e registre-a, porque em um pipeline automatizado ninguém está olhando a tela.

Texto diferente por plataforma

platform_content aceita substituições por plataforma, que é como uma única chamada publica em várias redes sem enviar o mesmo texto em todos os lugares:

bp.posts.create(
    content="Default text for anything not overridden.",
    platform_content={
        "x": "The short version.",
        "linkedin": "The longer version, with the reasoning behind it.",
    },
    channels=[
        {"channelId": 1, "platform": "x"},
        {"channelId": 2, "platform": "linkedin"},
    ],
    status="draft",
)

Vale a pena usar. Um pipeline que transmite o mesmo texto para quinze redes é o que faz a publicação automatizada ficar evidente.

Limites de taxa

FreeProBusiness
Requisições de API/dia305.00050.000
Chaves de API1510
As 30 requisições por dia do Free servem para avaliar a API. Um pipeline de verdade precisa de um plano pago, e um loop sem backoff vai queimar o limite gratuito em segundos.

Se um LLM está escrevendo o conteúdo

Duas regras que importam mais em Python do que em qualquer outro lugar, porque é aqui que esses pipelines costumam viver.

Crie rascunhos, não posts publicados, pelo menos até você ter observado o comportamento por um tempo. Texto gerado erra com confiança de formas que um rascunho humano não erra.

Nunca deixe o modelo afirmar um fato sobre um produto. Preços e limites mudam, e um modelo vai produzir alegremente um valor plausível. Qualquer coisa factual vem de uma fonte.

A versão curta

pip install bulkpublish, construa o cliente com sua chave a partir do ambiente, chame bp.posts.create. Use platform_specific para campos obrigatórios por plataforma, como títulos do YouTube, platform_content para textos diferentes por rede, passe um fuso horário para qualquer coisa agendada e comece com rascunhos.