← ClaudeAtlas

blueskylisted

Publish (with optional images), delete and read your own posts on Bluesky via the AT Protocol (XRPC). Use when the user wants to post to their Bluesky account (text or 带图 / with a picture), cross-post an article as a short dev-focused post, attach an image, delete a post, or list their own recent posts with engagement stats (reposts, likes, replies). Auth uses the user's handle plus an App Password.
AceDataCloud/Skills · ★ 13 · AI & Automation · score 73
Install: claude install-skill AceDataCloud/Skills
Everything runs through the shipped CLI [`scripts/bluesky.py`](scripts/bluesky.py) — self-contained (`requests` + `Pillow`, both preinstalled in the sandbox). One call creates the session, auto-computes clickable **facets** (links, #hashtags, @mentions with correct UTF-8 byte offsets), and for image posts downloads the file, **resizes/recompresses it to Bluesky's ~1 MB blob limit**, `uploadBlob`s it and builds the `app.bsky.embed.images` embed — so there's no fragile `curl + jq + heredoc` to hand-assemble (the old inline recipe kept breaking on shell quoting, especially once an image + facets were involved). Three connector credentials are injected: `$BLUESKY_HANDLE` (e.g. `name.bsky.social`), `$BLUESKY_APP_PASSWORD` (an App Password from Bluesky **Settings → Privacy and Security → App Passwords**, NOT the login password) and `$BLUESKY_SERVICE` (PDS base URL, default `https://bsky.social`). The CLI reads them from the env — never echo them. ```sh # $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} ``` If `whoami` fails with `session_failed` / `AuthenticationRequired`,