ブログ

· 1分で読めます

APIでBlueskyに投稿する(予約も)— 10行でできる方法

アプリからRESTを1回呼ぶだけで、Blueskyへの投稿と予約投稿ができます。開発者アプリの登録は不要。cURL、JavaScript、Pythonの例付きです。

Blueskyは、自動化しやすいSNSのひとつです。登録する開発者アプリもなく、審査の行列もありません。ただ「簡単」でも、セッション、レコードの形式、リンクやメンション用のfacet、画像blobは自分で扱う必要があり、Blueskyには予約投稿そのものがありません。

このガイドでは、Hapiを使い、RESTを1回呼ぶだけでBlueskyへ投稿し、予約もする方法を説明します。同じリクエストで、XとLinkedInへ同時に出すこともできます。

手順1: Blueskyでアプリパスワードを作る

Blueskyで Settings → Privacy and security → App passwords → Add app password を開きます(日本語UIなら「設定 → プライバシーとセキュリティ → アプリパスワード」)。hapi のような名前を付けて、表示されたパスワードをコピーします。

アプリパスワードでは、アカウントのパスワード変更やアカウント削除はできません。連携に渡す認証情報として、これで十分です。

手順2: Hapiでアカウントを連携する

Hapiのアカウントを無料で作成し、ダッシュボードの Accounts → Connect → Bluesky を開いて、ハンドルとアプリパスワードを貼り付けます。認証情報は保存時に暗号化され(AES-256-GCM)、ブラウザへ返されることはありません。

続いて API keys でAPIキーを作成します。表示は一度だけなので、環境変数に入れておきます。

bash
export HAPI_API_KEY="hapi_live_..."

手順3: 投稿する

cURL

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Hello Bluesky, posted from an API 🦋",
    "platforms": ["bluesky"]
  }'

JavaScript

js
const res = await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    content: "Hello Bluesky, posted from an API 🦋",
    platforms: ["bluesky"],
  }),
});
console.log(await res.json());

Python

python
import os, requests

res = requests.post(
    "https://hapi.tools/v1/posts",
    headers={"Authorization": f"Bearer {os.environ['HAPI_API_KEY']}"},
    json={"content": "Hello Bluesky, posted from an API 🦋", "platforms": ["bluesky"]},
)
print(res.json())

以上です。201 が返り、投稿とアカウントごとのステータスが手に入ります。

手順4: あとで公開するよう予約する

Blueskyは予約投稿に対応していないので、通常はジョブの実行基盤を自前で用意することになります。Hapiなら scheduledAt を足すだけです。

json
{
  "content": "This goes out Monday morning",
  "platforms": ["bluesky"],
  "scheduledAt": "2026-11-16T09:00:00-03:00"
}

Hapiのスケジューラーが時刻どおりに公開し、署名付きの post.published(失敗したときは post.failed)Webhookを送ります。アプリ側で結果が分かります。

手順5: Bluesky、X、LinkedInへ一度に投稿する

リクエストは同じで、プラットフォームを足します。

json
{
  "content": "We just shipped v2 🚀",
  "platforms": ["bluesky", "x", "linkedin"],
  "platformOptions": {
    "bluesky": { "content": "We just shipped v2 🚀 (Bluesky gets the short version)" }
  }
}

platformOptions で、ネットワークごとに文面を変えられます。Blueskyは300文字までなので、短い版を渡すのに向いています。

リトライで二重投稿しない

通信は途切れます。Idempotency-Key ヘッダーを付けると、Hapiは複製を作らず、最初の投稿を返します。

bash
-H "Idempotency-Key: release-v2-announcement"

呼び出すのがAIエージェントなら、これはさらに重要です。

自前で作らなくて済んだもの

  • AT Protocolに対するセッションの作成と更新
  • リンクやメンションのfacetを手で組み立てること
  • 画像blobのアップロードと、レコードへの添付
  • スケジューラー、リトライ、失敗の通知

15日間のトライアルを始める → $5のトライアルには、15日間で連携アカウント5件と投稿300件が含まれます。