Wenn deine Content-Pipeline in Python läuft, ob Scraper, Datenjob oder LLM-Workflow, sollte Veröffentlichen nicht heißen, auf etwas anderes auszuweichen.
Installieren und authentifizieren
pip install bulkpublish
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
Der Client liest den Schlüssel auch aus BULKPUBLISH_API_KEY in der Umgebung, was die bessere Gewohnheit ist:
import os
from bulkpublish import BulkPublish
bp = BulkPublish(os.environ["BULKPUBLISH_API_KEY"])
Zuerst einen Entwurf erstellen
post = bp.posts.create(
content="Launching our new product today!",
channels=[
{"channelId": 1, "platform": "x"},
{"channelId": 2, "platform": "linkedin"},
],
status="draft",
)
Entwürfe sind in der App sichtbar, sodass du sehen kannst, was dein Code tatsächlich erzeugt hat, bevor es ein Publikum tut. Wechsle zu "scheduled", sobald du zufrieden bist.
Such deine Kanal-IDs, statt sie fest einzubauen:
channels = bp.channels.list()
Einen planen
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 ist ISO-8601 und timezone ein IANA-Name. Gib die Zeitzone bei allem Wiederkehrenden explizit an, sonst wandert deine Veröffentlichungszeit zweimal im Jahr um eine Stunde, wenn die Zeitumstellung greift.
Plattformspezifische Anforderungen
Das ist der Teil, der überrascht. Manche Plattformen brauchen Felder, die andere nicht brauchen, und platform_specific ist der Ort dafür. YouTube zum Beispiel verlangt einen Titel mit 1 bis 100 Zeichen.
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",
)
Fehlt ein erforderliches plattformspezifisches Feld, wird der Beitrag schon bei der Erstellung abgelehnt, statt später leise zu scheitern. Fang diese Ausnahme ab und protokolliere sie, denn in einer automatisierten Pipeline schaut niemand auf den Bildschirm.
Unterschiedlicher Text pro Plattform
platform_content nimmt Überschreibungen pro Plattform entgegen, wodurch ein einziger Aufruf mehrere Netzwerke bedient, ohne überall identischen Text zu versenden:
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",
)
Lohnt sich zu nutzen. Eine Pipeline, die identischen Text an fünfzehn Netzwerke sendet, ist genau das, was automatisiertes Posten offensichtlich macht.
Ratenlimits
| Free | Pro | Business | |
|---|---|---|---|
| API-Anfragen/Tag | 30 | 5.000 | 50.000 |
| API-Schlüssel | 1 | 5 | 10 |
| Die 30 Anfragen pro Tag bei Free sind zum Ausprobieren der API gedacht. Eine echte Pipeline braucht einen bezahlten Tarif, und eine Schleife ohne Backoff verbrennt das kostenlose Kontingent in Sekunden. |
Wenn ein LLM den Inhalt schreibt
Zwei Regeln, die in Python mehr zählen als anderswo, weil genau dort diese Pipelines meist leben.
Erstelle Entwürfe, keine veröffentlichten Beiträge, zumindest bis du es eine Weile beobachtet hast. Generierter Text ist auf eine Art selbstbewusst falsch, wie ein menschlicher Entwurf es nicht ist.
Lass das Modell niemals eine Tatsachenbehauptung über ein Produkt aufstellen. Preise und Limits ändern sich, und ein Modell produziert bereitwillig einen plausiblen Wert. Alles Faktische kommt aus einer Quelle.
Die Kurzfassung
pip install bulkpublish, mit deinem Schlüssel aus der Umgebung konstruieren, bp.posts.create aufrufen. Nutz platform_specific für erforderliche plattformspezifische Felder wie YouTube-Titel, platform_content für unterschiedlichen Text pro Netzwerk, gib bei allem Geplanten eine Zeitzone an und fang mit Entwürfen an.