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