Guida Developer

Come Automatizzare la Pubblicazione sui Social Media con Python

Che tu stia costruendo una pipeline di contenuti per la tua startup, automatizzando i post per i clienti o integrando la pubblicazione social in un prodotto SaaS, Python rende tutto semplice. Questo tutorial ti guida dal tuo primo upload a uno script di automazione pronto per la produzione.

Perché Python per l\'automazione dei social media

Python e il linguaggio di riferimento per l\'automazione. E leggibile, ha un ecosistema enorme ed e perfetto per script che girano a intervalli regolari. E quando si tratta di pubblicare sui social media in modo programmatico, l\'alternativa all\'uso di un\'API come Upload-Post e costruire integrazioni OAuth per ogni piattaforma. Questo significa gestire la Content Posting API di TikTok, la Graph API di Instagram, la Data API di YouTube e cosi via. Ognuna con il suo flusso di autenticazione, i suoi limiti di rate e le sue particolarita.

Con l'API di pubblicazione sui social media, fai una singola chiamata API e pubblichi su tutte e dieci le piattaforme. L\'SDK Python rende tutto ancora piu semplice.

Configurare l\'ambiente

1. Installa l\'SDK

pip install upload-post

2. Ottieni la tua API key

Crea un account gratuito su app.upload-post.com e genera una API key dalla dashboard API Keys. Salvala come variabile d\'ambiente:

export UPLOAD_POST_API_KEY="your-api-key-here"

3. Collega i tuoi account social

Nella dashboard di Upload-Post, crea un profilo (es. "mybrand") e collega i tuoi account TikTok, Instagram, YouTube e qualsiasi altro account su cui vuoi pubblicare. Il nome del profilo e quello che userai nel tuo codice.

Il tuo primo upload: pubblicare un video

import os
from upload_post import UploadPostClient

client = UploadPostClient(
    api_key=os.environ["UPLOAD_POST_API_KEY"]
)

response = client.upload_video(
    video_path="my-video.mp4",
    title="Il nostro nuovo prodotto in azione",
    user="mybrand",
    platforms=["tiktok", "instagram", "youtube"]
)

if response["success"]:
    for platform, result in response["results"].items():
        if result["success"]:
            print(f"{platform}: {result['url']}")
        else:
            print(f"{platform}: upload failed")
else:
    print("Upload failed:", response)

Questo e uno script funzionante. Eseguilo e il tuo video va live su tre piattaforme. Ora facciamolo fare di piu.

Publish photos and carousels

response = client.upload_photos(
    photos=["slide-1.jpg", "slide-2.jpg", "slide-3.jpg"],
    title="Lookbook della collezione estiva",
    description="Ogni pezzo, realizzato in Portogallo. Acquista il link in bio.",
    user="mybrand",
    platforms=["instagram", "tiktok", "linkedin"]
)

print(response)

Instagram crea un post carosello, TikTok crea uno slideshow e LinkedIn mostra un post multi-immagine. Ogni piattaforma riceve il formato che preferisce.

Publish text content

Per post solo testo (pensa ai thread su Twitter, aggiornamenti LinkedIn o post su Reddit):

response = client.upload_text(
    title="Abbiamo appena rilasciato un enorme aggiornamento alla nostra API. Ecco cosa è cambiato...",
    user="mybrand",
    platforms=["x", "linkedin", "threads", "bluesky"]
)

print(response)

Se il tuo testo supera il limite di caratteri di una piattaforma, l\'API lo gestisce in modo intelligente. Su X, il testo oltre i 280 caratteri diventa automaticamente un thread. Su Threads, la suddivisione avviene a 500 caratteri. Su Bluesky, a 300.

Usare parametri specifici per piattaforma

Il parametro title imposta la didascalia predefinita per tutte le piattaforme, ma spesso vorrai testi diversi per ciascuna. Ecco come personalizzare per piattaforma:

import requests
import os

API_KEY = os.environ["UPLOAD_POST_API_KEY"]

with open("product-demo.mp4", "rb") as video:
    response = requests.post(
        "https://api.upload-post.com/api/upload",
        headers={"Autorizzazione": f"Apikey {API_KEY}"},
        files={"video": video},
        data={
            "user": "mybrand",
            "title": "Check this out",
            # Platform specific titles
            "tiktok_title": "POV: il tuo prodotto si vende da solo #ecommerce #dropshipping",
            "instagram_title": "Nuovo rilascio. Link in bio per accesso anticipato.",
            "youtube_title": "Demo del prodotto | Recensione completa",
            "youtube_description": "In questo video ti mostriamo esattamente come funziona...",
            "linkedin_title": "Siamo entusiasti di condividere il nostro ultimo lancio di prodotto con la comunità.",
            # Platform specific settings
            "platform[]": ["tiktok", "instagram", "youtube", "linkedin"],
            "privacy_level": "PUBLIC_TO_EVERYONE",
            "media_type": "REELS",
            "tags[]": ["product", "demo", "review"],
            "privacyStatus": "public",
        }
    )

print(response.json())

Questo esempio usa la libreria requests direttamente invece dell\'SDK, il che ti da accesso a ogni singolo parametro API. Consulta il riferimento API completo per tutte le opzioni disponibili per piattaforma.

Schedule posts for later

from datetime import datetime, timedelta

# Schedule for tomorrow at 9 AM
tomorrow_9am = (datetime.now() + timedelta(days=1)).replace(
    hour=9, minute=0, second=0, microsecond=0
)

response = client.upload_video(
    video_path="tomorrows-content.mp4",
    title="Buongiorno! Contenuti freschi per il tuo feed",
    user="mybrand",
    platforms=["tiktok", "instagram"],
    scheduled_date=tomorrow_9am.isoformat(),
    timezone="America/New_York"
)

print(f"Scheduled! Job ID: {response['job_id']}")
print(f"Pubblicherà alle: {response['scheduled_date']}")

Puoi programmare fino a 365 giorni in anticipo. Per maggiori dettagli sulla programmazione e il sistema di code, leggi la nostra guida alla programmazione.

Costruire un\'automazione completa: watcher di cartella

Ecco uno script pratico che monitora una cartella alla ricerca di nuovi file video e li carica automaticamente. Ottimo per agenzie che ricevono contenuti dei clienti in una cartella condivisa:

import os
import time
import json
from upload_post import UploadPostClient

client = UploadPostClient(
    api_key=os.environ["UPLOAD_POST_API_KEY"]
)

WATCH_FOLDER = "/path/to/content/inbox"
PROCESSED_FILE = "/path/to/content/processed.json"
CHECK_INTERVAL = 60  # seconds

def load_processed():
    if os.path.exists(PROCESSED_FILE):
        with open(PROCESSED_FILE) as f:
            return set(json.load(f))
    return set()

def save_processed(processed):
    with open(PROCESSED_FILE, "w") as f:
        json.dump(list(processed), f)

def upload_video(filepath):
    filename = os.path.basename(filepath)
    title = filename.rsplit(".", 1)[0].replace("-", " ").replace("_", " ")

    response = client.upload_video(
        video_path=filepath,
        title=title,
        user="mybrand",
        platforms=["tiktok", "instagram", "youtube"],
        add_to_queue=True,
        async_upload=True
    )
    return response

print(f"Watching {WATCH_FOLDER} for new videos...")

processed = load_processed()

while True:
    for filename in os.listdir(WATCH_FOLDER):
        if filename in processed:
            continue
        if not filename.lower().endswith((".mp4", ".mov")):
            continue

        filepath = os.path.join(WATCH_FOLDER, filename)
        print(f"New file detected: {filename}")

        try:
            result = upload_video(filepath)
            print(f"  Queued successfully: {result.get('job_id', 'done')}")
            processed.add(filename)
            save_processed(processed)
        except Exception as e:
            print(f"  Error: {e}")

    time.sleep(CHECK_INTERVAL)

Esegui questo script in background (o come servizio systemd) e ogni volta che qualcuno mette un video nella cartella, viene pubblicato su tutte le piattaforme collegate. Se hai bisogno di qualcosa di piu robusto, considera l\'uso di n8n o Make.com per un workflow gestito.

Lavorare con l\'API direttamente (senza l\'SDK)

Se preferisci non usare l\'SDK o hai bisogno di un controllo piu granulare, puoi usare la libreria requests direttamente. Ecco l\'equivalente dell\'upload con l\'SDK:

import requests

API_KEY = "your-api-key-here"
API_URL = "https://api.upload-post.com/api/upload"

# Upload a video
with open("video.mp4", "rb") as f:
    response = requests.post(
        API_URL,
        headers={"Autorizzazione": f"Apikey {API_KEY}"},
        files={"video": ("video.mp4", f, "video/mp4")},
        data={
            "user": "mybrand",
            "title": "Pubblicato con richieste Python",
            "platform[]": ["tiktok", "instagram"],
        }
    )

print(response.status_code)
print(response.json())

Validare la tua API key

Prima di eseguire un batch consistente, e una buona idea verificare che la tua chiave funzioni e controllare i limiti del tuo piano:

response = requests.get(
    "https://api.upload-post.com/api/uploadposts/me",
    headers={"Autorizzazione": f"Apikey {API_KEY}"}
)

data = response.json()
print(f"Email: {data['email']}")
print(f"Piano: {data['plan']}")

Migliori pratiche per la gestione degli errori

Quando costruisci script per la produzione, gestisci questi scenari comuni:

import requests

def upload_with_retry(video_path, title, platforms, max_retries=3):
    for attempt in range(max_retries):
        try:
            with open(video_path, "rb") as f:
                response = requests.post(
                    "https://api.upload-post.com/api/upload",
                    headers={"Autorizzazione": f"Apikey {API_KEY}"},
                    files={"video": f},
                    data={
                        "user": "mybrand",
                        "title": title,
                        "platform[]": platforms,
                        "async_upload": "true",
                    },
                    timeout=120
                )

            if response.status_code == 200:
                return response.json()
            elif response.status_code == 429:
                # Rate limited, check usage
                usage = response.json().get("usage", {})
                print(f"Rate limited. Used {usage.get('count')}/{usage.get('limit')}")
                return None
            elif response.status_code == 401:
                print("Invalid API key")
                return None
            else:
                print(f"Attempt {attempt + 1} failed: {response.status_code}")

        except requests.exceptions.Timeout:
            print(f"Attempt {attempt + 1} timed out, retrying...")

    print(f"Tutti i {max_retries} tentativi sono falliti per {video_path}")
    return None

Controllare lo storico degli upload

Puoi recuperare lo storico degli upload per verificare cosa e andato a buon fine o costruire una dashboard di reportistica:

response = requests.get(
    "https://api.upload-post.com/api/uploadposts/history?page=1&limit=20",
    headers={"Autorizzazione": f"Apikey {API_KEY}"}
)

for entry in response.json()["history"]:
    status = "OK" if entry["success"] else "FAILED"
    print(f"[{status}] {entry['platform']} - {entry['post_title']} - {entry['post_url']}")

Next steps

Ora che hai le basi, ecco alcune idee su cosa costruire dopo:

  • Collega il tuo script a un CMS o database in modo che i nuovi contenuti vengano pubblicati automaticamente
  • Usa l\'approccio di upload massivo per elaborare intere librerie di contenuti
  • Riutilizza video lunghi in clip brevi usando FFmpeg e l\'API di Upload-Post
  • Costruisci un\'integrazione white label se stai costruendo un prodotto SaaS che necessita di pubblicazione social
  • Esplora i nostri template n8n per workflow potenziati dall\'AI che generano e pubblicano contenuti automaticamente

Inizia ad automatizzare con Python oggi

Installa l\'SDK, prendi la tua API key e pubblica il tuo primo video in meno di 5 minuti. Il piano gratuito include 10 upload al mese.

pip install upload-post