Entwickleranleitung

Social-Media-Posting mit Python automatisieren

Ob Sie eine Content-Pipeline für Ihr Startup aufbauen, Posts für Kunden automatisieren oder Social Publishing in Ihr SaaS-Produkt integrieren: Python macht es einfach. Dieses Tutorial führt Sie von Ihrem ersten Upload bis zu einem produktionsreifen Automatisierungsskript.

Warum Python für Social-Media-Automatisierung

Python ist die erste Wahl für Automatisierung. Es ist lesbar, hat ein riesiges Ökosystem und ist perfekt für Skripte, die nach Zeitplan laufen. Und was das programmatische Posten auf Social Media betrifft: Die Alternative zur Nutzung einer API wie Upload-Post ist, OAuth-Integrationen für jede Plattform selbst zu bauen. Das bedeutet, TikToks Content Posting API, Instagrams Graph API, YouTubes Data API und so weiter zu handhaben. Jede mit ihrem eigenen Authentifizierungsablauf, Rate-Limits und Eigenheiten.

Mit der Social Media Posting API machen Sie einen API-Aufruf und es postet auf alle zehn Plattformen. Das Python SDK macht das noch einfacher.

Umgebung einrichten

1. SDK installieren

pip install upload-post

2. API-Key holen

Erstellen Sie ein kostenloses Konto bei app.upload-post.com und generieren Sie einen API-Key im API-Schlüssel-Dashboard. Speichern Sie ihn als Umgebungsvariable:

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

3. Social-Media-Konten verbinden

Im Upload-Post Dashboard erstellen Sie ein Profil (z.B. "mybrand") und verbinden Ihre TikTok-, Instagram-, YouTube- und andere Konten, auf die Sie posten möchten. Den Profilnamen referenzieren Sie in Ihrem Code.

Ihr erster Upload: ein Video posten

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="Unser neues Produkt in Aktion",
    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)

Das ist ein funktionierendes Skript. Starten Sie es und Ihr Video geht auf drei Plattformen live. Jetzt erweitern wir die Möglichkeiten.

Fotos und Karussells posten

response = client.upload_photos(
    photos=["slide-1.jpg", "slide-2.jpg", "slide-3.jpg"],
    title="Sommerkollektion Lookbook",
    description="Jedes Stück, hergestellt in Portugal. Kaufen Sie den Link in der Bio.",
    user="mybrand",
    platforms=["instagram", "tiktok", "linkedin"]
)

print(response)

Instagram erstellt einen Karussell-Post, TikTok erstellt eine Slideshow und LinkedIn zeigt einen Multi-Bild-Post. Jede Plattform bekommt das Format, das sie bevorzugt.

Text-Content posten

Für reine Text-Posts (Twitter-Threads, LinkedIn-Updates oder Reddit-Beiträge):

response = client.upload_text(
    title="Wir haben gerade ein großes Update für unsere API veröffentlicht. Hier ist, was sich geändert hat...",
    user="mybrand",
    platforms=["x", "linkedin", "threads", "bluesky"]
)

print(response)

Wenn Ihr Text das Zeichenlimit einer Plattform überschreitet, handhabt die API das intelligent. Auf X wird Text über 280 Zeichen automatisch zu einem Thread. Auf Threads erfolgt die Aufteilung bei 500 Zeichen. Auf Bluesky bei 300.

Plattformspezifische Parameter verwenden

Der title Parameter setzt die Standard-Beschreibung für alle Plattformen, aber oft möchten Sie unterschiedliche Texte für jede. So passen Sie pro Plattform an:

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={"Authorization": f"Apikey {API_KEY}"},
        files={"video": video},
        data={
            "user": "mybrand",
            "title": "Check this out",
            # Platform specific titles
            "tiktok_title": "POV: Ihr Produkt verkauft sich von selbst #ecommerce #dropshipping",
            "instagram_title": "Neuer Drop. Link in der Bio für frühen Zugang.",
            "youtube_title": "Produkt-Demo | Vollständige Bewertung",
            "youtube_description": "In diesem Video zeigen wir Ihnen genau, wie es funktioniert...",
            "linkedin_title": "Wir freuen uns, unseren neuesten Produktlaunch mit der Community zu teilen.",
            # 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())

Dieses Beispiel nutzt die requests Bibliothek direkt anstatt des SDK, was Ihnen Zugriff auf jeden einzelnen API-Parameter gibt. Schauen Sie in die vollständige API-Referenz für alle verfügbaren Optionen pro Plattform.

Posts für später planen.

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="Guten Morgen! Frischer Inhalt für deinen Feed",
    user="mybrand",
    platforms=["tiktok", "instagram"],
    scheduled_date=tomorrow_9am.isoformat(),
    timezone="America/New_York"
)

print(f"Geplant! Job-ID: {response['job_id']}")
print(f"Wird veröffentlicht am: {response['scheduled_date']}")

Sie können bis zu 365 Tage im Voraus planen. Für mehr Details zur Planung und dem Warteschlangensystem lesen Sie unsere Planungs-Anleitung.

Vollständige Automatisierung: Ordner-Überwachung

Hier ist ein praktisches Skript, das einen Ordner auf neue Videodateien überwacht und sie automatisch hochlädt. Das ist ideal für Agenturen, die Kunden-Content in einem geteilten Ordner erhalten:

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)

Starten Sie dieses Skript im Hintergrund (oder als systemd Service) und jedes Mal, wenn jemand ein Video in den Ordner legt, wird es auf all Ihren verbundenen Plattformen veröffentlicht. Wenn Sie etwas Robusteres brauchen, ziehen Sie n8n oder Make.com für einen verwalteten Workflow in Betracht.

Direkt mit der API arbeiten (ohne SDK)

Wenn Sie das SDK nicht nutzen möchten oder mehr Kontrolle auf niedriger Ebene brauchen, können Sie die requests Bibliothek direkt verwenden. Hier ist das Äquivalent zum SDK-Upload:

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={"Authorization": f"Apikey {API_KEY}"},
        files={"video": ("video.mp4", f, "video/mp4")},
        data={
            "user": "mybrand",
            "title": "Gepostet mit Python-Anfragen.",
            "platform[]": ["tiktok", "instagram"],
        }
    )

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

API-Schlüssel validieren

Bevor Sie einen grossen Batch starten, ist es sinnvoll zu prüfen, dass Ihr Key funktioniert und Ihre Plan-Limits zu checken:

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

data = response.json()
print(f"E-Mail: {data['email']}")
print(f"Plan: {data['plan']}")

Best Practices für Fehlerbehandlung

Beim Erstellen von Produktionsskripten sollten Sie diese häufigen Szenarien behandeln:

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={"Authorization": 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"Alle {max_retries} Versuche für {video_path} sind fehlgeschlagen")
    return None

Upload-Verlauf prüfen

Sie können Ihren Upload-Verlauf abrufen, um zu verifizieren, was durchgegangen ist, oder ein Reporting-Dashboard aufzubauen:

response = requests.get(
    "https://api.upload-post.com/api/uploadposts/history?page=1&limit=20",
    headers={"Authorization": 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']}")

Nächste Schritte

Jetzt, da Sie die Grundlagen haben, hier einige Ideen, was Sie als Nächstes bauen können:

  • Verbinden Sie Ihr Skript mit einem CMS oder einer Datenbank, damit neue Inhalte automatisch veröffentlicht werden
  • Nutzen Sie den Bulk Upload Approach, um ganze Content-Bibliotheken zu verarbeiten
  • Verwerten Sie lange Videos in kurze Clips. mit FFmpeg und der Upload-Post API
  • Bauen Sie eine White-Label-Integration, wenn Sie ein SaaS-Produkt entwickeln, das Social Publishing braucht
  • Erkunden Sie unsere n8n Vorlagen für KI-gestützte Arbeitsabläufe, die Content automatisch generieren und veröffentlichen

Starten Sie heute mit der Python-Automatisierung

Installieren Sie das SDK, holen Sie sich Ihren API-Key und veröffentlichen Sie Ihr erstes Video in unter 5 Minuten. Der kostenlose Plan beinhaltet 10 Uploads pro Monat.

pip install upload-post