Come pubblicare post sui social media da Python

Come pubblicare post sui social media da Python

Pubblica e programma su 15 reti da Python. Esempi funzionanti, i campi per piattaforma effettivamente obbligatori e come evitare sorprese.

Se la tua pipeline di contenuti è in Python, che sia uno scraper, un job di dati o un flusso con un LLM, la pubblicazione non dovrebbe significare appoggiarsi a qualcos’altro.

Installazione e autenticazione

pip install bulkpublish
from bulkpublish import BulkPublish

bp = BulkPublish("bp_your_key_here")

Il client legge anche BULKPUBLISH_API_KEY dall’ambiente, che è l’abitudine migliore:

import os
from bulkpublish import BulkPublish

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

Crea prima una bozza

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

Le bozze sono visibili nell’app, così puoi vedere cosa ha effettivamente prodotto il tuo codice prima che lo veda un pubblico. Passa a "scheduled" quando sei soddisfatto.

Trova gli ID dei tuoi canali invece di inserirli nel codice:

channels = bp.channels.list()

Programmarne uno

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 è un nome IANA. Passa il fuso orario esplicitamente per qualsiasi cosa ricorrente, altrimenti il tuo orario di pubblicazione si sposta di un’ora due volte l’anno quando cambia l’ora legale.

Requisiti per piattaforma

Questa è la parte che sorprende. Alcune piattaforme richiedono campi che altre non richiedono, e platform_specific è dove vanno inseriti. YouTube, per esempio, richiede un titolo da 1 a 100 caratteri.

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 manca un campo per piattaforma obbligatorio, il post viene rifiutato al momento della creazione invece di fallire silenziosamente più tardi. Cattura quell’eccezione e registrala, perché in una pipeline automatizzata nessuno sta guardando lo schermo.

Testo diverso per piattaforma

platform_content accetta sostituzioni per piattaforma, ed è così che una singola chiamata pubblica su più reti senza inviare lo stesso testo ovunque:

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 la pena usarlo. Una pipeline che trasmette testo identico a quindici reti è ciò che rende evidente la pubblicazione automatizzata.

Rate limit

FreeProBusiness
Richieste API/giorno305.00050.000
API key1510
Le 30 richieste al giorno del piano Free servono per valutare l’API. Una pipeline reale ha bisogno di un piano a pagamento, e un ciclo senza backoff esaurirà l’allowance gratuita in pochi secondi.

Se è un LLM a scrivere il contenuto

Due regole che contano più in Python che altrove, perché è lì che di solito vivono quelle pipeline.

Crea bozze, non post pubblicati, almeno finché non l’hai osservato per un po’. Il testo generato è sbagliato con sicurezza in modi in cui una bozza umana non lo è.

Non lasciare mai che il modello affermi un fatto su un prodotto. Prezzi e limiti cambiano, e un modello produrrà volentieri qualcosa di plausibile. Tutto ciò che è fattuale deve venire da una fonte.

La versione breve

pip install bulkpublish, costruisci il client con la tua chiave dall’ambiente, chiama bp.posts.create. Usa platform_specific per i campi obbligatori per piattaforma come i titoli YouTube, platform_content per testo diverso per rete, passa un fuso orario con tutto ciò che è programmato e inizia con le bozze.