bluesky について
同梱の Python CLI で Bluesky の投稿を管理するスキルです。テキストや画像の投稿、クリック可能なリンク・ハッシュタグ・メンションの処理に加え、投稿の一覧表示と削除に対応します。
主な機能
- 01テキスト投稿
- 02画像の添付とリサイズ
- 03リンク・ハッシュタグ・メンションの処理
- 04最近の投稿と反応の一覧表示
- 05投稿の削除
活用シーン
- 01Bluesky にテキストを投稿
- 02代替テキスト付き画像を投稿
- 03最近の投稿と反応を確認
- 04URI を指定して投稿を削除
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill blueskyインストール後、Claude Code で/blueskyを入力して読み込まれたか確認します。
同梱ファイルscripts/bluesky.py
詳細
すべて、同梱の CLI scripts/bluesky.py を通じて実行します
— サンドボックスに事前インストール済みの requests と Pillow だけで動作する自己完結型です。1 回の呼び出しでセッションを作成し、クリック可能な ファセット(リンク、#ハッシュタグ、正しい UTF-8 バイトオフセットを持つ @メンション)を自動計算します。画像を投稿する場合は、ファイルをダウンロードし、Bluesky の約 1 MB の blob 上限に収まるようにリサイズ/再圧縮してから uploadBlob し、app.bsky.embed.images の埋め込みを作成します。そのため、手作業で組み立てる、壊れやすい curl + jq + heredoc は不要です(以前のインラインレシピはシェルのクォート処理で頻繁に失敗しており、特に画像とファセットを併用する場合に問題がありました)。
コネクターの認証情報 3 つが注入されます:$BLUESKY_HANDLE
(例:name.bsky.social)、$BLUESKY_APP_PASSWORD(Bluesky の Settings → Privacy and Security → App Passwords で発行したアプリパスワード。ログインパスワードではありません)、および $BLUESKY_SERVICE(PDS のベース URL。デフォルトは https://bsky.social)です。CLI はこれらを環境変数から読み取ります。決して出力しないでください。
# $SKILL_DIR can point at another skill loaded this turn — anchor on our own
# script (re-run this at the top of every fresh-shell Bash block below).
BSKY="$SKILL_DIR/scripts/bluesky.py"; [ -f "$BSKY" ] || BSKY=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/bluesky.py' 2>/dev/null | head -1)
[ -f "$BSKY" ] || { echo "bluesky script not found (SKILL_DIR=$SKILL_DIR)" >&2; exit 1; }
python3 "$BSKY" whoami # verify the session → {did, handle, service}
whoami が session_failed/AuthenticationRequired で失敗する場合は、識別子またはアプリパスワードが間違っています。最も多い原因は、ドメインのないハンドルです。デフォルトの PDS では、CLI がドメインのないユーザー名に .bsky.social を自動で追加します。それでも失敗する場合は、ユーザーに正しいアプリパスワードと、完全なハンドル(name.bsky.social、カスタムドメイン、DID、またはアカウントのメールアドレス)でコネクターを再接続してもらう必要があります。
投稿 — テキスト、画像、リンクを 1 回で
投稿する前に、テキストをユーザーに確認してください(ユーザーの実際のアカウントから公開されます)。テキストは 300 書記素以下です。クリック可能なリンク/#ハッシュタグ/@メンションはファセットに自動変換されるため、テキストにそのまま記述できます。バイトオフセットを計算する必要はありません。
# plain text post
python3 "$BSKY" post --text "Hello Bluesky 👋 shipping with the AT Protocol"
# 带图发送 / post WITH an image (URL or local path) — the image is downloaded,
# resized to fit the blob limit, uploaded and embedded automatically:
python3 "$BSKY" post \
--text "Stop wiring 3 image APIs. One endpoint → posters, cards, mockups. https://platform.acedata.cloud/documents/openai-images-generations-integration #AI #API" \
--image "https://cdn.acedata.cloud/xxxx.png" --alt "AI image API hero"
# up to 4 images, each with its own --alt (paired by order)
python3 "$BSKY" post --text "gallery" --image a.png --alt "one" --image b.png --alt "two"
複数行のテキストや絵文字をたくさん使う場合は、シェルのクォート処理を避けるため、テキストをファイルに書き込んで --text-file を使うか、--text - 経由でパイプしてください。
cat > /tmp/post.txt <<'EOF'
Line one 🎨
Line two with a link https://platform.acedata.cloud #AI
EOF
python3 "$BSKY" post --text-file /tmp/post.txt --image "https://cdn.acedata.cloud/xxxx.png"
成功すると、
{"posted":true,"uri":"at://…","url":"https://bsky.app/profile/<handle>/post/<rkey>", ...}
が出力されます。url は共有可能な公開リンクです。そのままユーザーに渡してください。
最近の投稿とエンゲージメントを一覧表示
python3 "$BSKY" list --limit 20 # default filter: posts_no_replies
python3 "$BSKY" list --limit 50 --filter posts_with_media
--filter:posts_no_replies | posts_with_replies | posts_with_media |
posts_and_author_threads。--limit の最大値は 100 です。
投稿を削除
python3 "$BSKY" delete --uri "at://did:plc:xxxx/app.bsky.feed.post/3kabc123xyz"
完全な at://… の投稿 uri(list または以前の post から取得)を渡してください。CLI が rkey を抽出します。結果が空、または deleted:true であれば成功です。
注意点
- アカウントのパスワードではなく、アプリパスワードを使用してください: 実際のログインパスワードでセッションを作成すると、拒否されたり、2FA が作動したりすることがあります。必ず Settings → App Passwords から取得したアプリパスワードを使用してください。
- ファセットと画像のリサイズは自動です — CLI がリンク/#タグ/@メンションのバイトオフセットを計算し、大きすぎる画像を約 1 MB の blob 上限に収まるよう縮小します。
- 300 書記素。ユーザーが認識する文字数で数えます(絵文字は 1 文字です)。
- レート制限: PDS はアカウントごとの書き込みをレート制限します。一括投稿は間隔を空けてください。そうしないと
429 {"error":"RateLimitExceeded"}が返されます。 - セルフホストの PDS: ユーザーが独自の PDS を運用している場合、
$BLUESKY_SERVICEはその PDS を指します。すべての XRPC 呼び出しはbsky.socialではなく、そのホストを対象とします。 - CLI は呼び出しのたびに有効期間の短い新しいセッションを作成するため、
accessJwtの期限切れを心配する必要はありません。コマンドを再度実行してください。
出力を記録
公開に成功し、公開済みの結果 URL を取得した後、組み込みの publish_artifact ツールを 1 回呼び出してください。ユーザーがこの成果物を My Outputs で追跡できるようになります。
publish_artifact(kind="message", channel="bluesky", title="<title>", url="<the REAL returned URL>", status="delivered")
実際に返された URL を使用してください。決して URL を捏造しないでください。公開が確認された後に限り、公開した項目ごとに 1 回呼び出します。公開に失敗した場合は呼び出さないか、status="failed" を使用してください。
_shared/artifacts.md を参照してください。