Pythonからソーシャルメディア投稿を公開する方法

Pythonからソーシャルメディア投稿を公開する方法

Pythonから15のネットワークへ投稿・予約する方法。実際に動くサンプル、 プラットフォームごとに本当に必須なフィールド、驚きを避けるコツを解説します。

コンテンツのパイプラインがPythonにあるなら、それがスクレイパーでもデータジョブでもLLMのワークフローでも、公開のために別の何かを呼び出す必要はないはずです。

インストールと認証

pip install bulkpublish
from bulkpublish import BulkPublish

bp = BulkPublish("bp_your_key_here")

クライアントは環境変数のBULKPUBLISH_API_KEYも読み込みます。こちらのほうが良い習慣です。

import os
from bulkpublish import BulkPublish

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

まず下書きを作る

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

下書きはアプリ内で見えるため、視聴者の前に出る前に、自分のコードが実際に何を作ったのかを確認できます。問題なければ"scheduled"に切り替えましょう。

チャンネルIDはハードコーディングせずに調べてください。

channels = bp.channels.list()

予約投稿する

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形式で、timezoneはIANA名です。繰り返し投稿する場合はタイムゾーンを明示的に渡してください。そうしないと、夏時間が切り替わるたびに投稿時刻が1時間ずつずれていきます。

プラットフォームごとの必須項目

ここが人を驚かせる部分です。プラットフォームによっては他にはないフィールドが必要で、それらはplatform_specificに入れます。たとえばYouTubeでは、1〜100文字のタイトルが必須です。

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",
)

プラットフォームごとの必須フィールドが欠けている場合、投稿は後で静かに失敗するのではなく、作成時点で拒否されます。この例外をキャッチしてログに残してください。自動化されたパイプラインでは、誰も画面を見ていないからです。

プラットフォームごとに異なる文面

platform_contentはプラットフォームごとの上書きを受け取ります。これにより、1回の呼び出しで複数のネットワークに、どこにも同じ文面を送ることなく公開できます。

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",
)

使う価値があります。15のネットワークに同一の文面を配信するパイプラインは、自動投稿だと一目で分かってしまうものです。

レート制限

FreeProBusiness
APIリクエスト/日305,00050,000
APIキー1510
Freeの1日30リクエストはAPIを評価するためのものです。実際のパイプラインには有料プランが必要で、バックオフのないループはこの無料枠を数秒で使い切ってしまいます。

LLMがコンテンツを書く場合

Pythonでは他のどこよりも重要になる2つのルールがあります。こうしたパイプラインは通常ここに存在するからです。

**公開済みの投稿ではなく下書きを作成してください。**少なくともしばらく様子を見るまでは。生成されたテキストは、人間の下書きとは違った形で自信満々に間違っていることがあります。

**モデルに製品についての事実を述べさせないでください。**価格や制限は変わりますし、モデルは平気でもっともらしい値を作り出します。事実に関わることはすべて情報源から取得してください。

まとめ

pip install bulkpublishを実行し、環境変数からキーを取得してクライアントを作成し、bp.posts.createを呼び出します。YouTubeのタイトルのようにプラットフォームごとに必須のフィールドにはplatform_specificを、ネットワークごとに異なる文面にはplatform_contentを使い、予約投稿にはタイムゾーンを渡し、下書きから始めましょう。