关于 bluesky
通过随附的 Python CLI 管理 Bluesky 帖子的技能,可发布文本和图片,自动处理可点击的链接、话题标签与提及,也支持列出和删除帖子。
主要功能
- 01发布文本帖子
- 02添加并缩放图片
- 03生成链接、话题标签和提及标记
- 04列出近期帖子及互动情况
- 05删除帖子
适用场景
- 01向 Bluesky 发布文本动态
- 02发布带替代文本的图片
- 03查看近期帖子和互动
- 04通过 URI 删除帖子
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill bluesky安装后在 Claude Code 中输入/bluesky确认已加载。
附带文件scripts/bluesky.py
详细介绍
所有操作都通过随附的 CLI scripts/bluesky.py 完成
——该 CLI 独立运行(依赖 requests + Pillow,两者都已预装在沙盒中)。一次调用即可创建会话,自动计算可点击的 facets(链接、#话题标签、@提及,并使用正确的 UTF-8 字节偏移量);发布图片时,还会下载文件、调整大小并重新压缩,使其符合 Bluesky 约 1 MB 的 Blob 限制、调用 uploadBlob 上传,并构建 app.bsky.embed.images 嵌入内容——因此无需手动拼装脆弱的
curl + jq + heredoc(旧的内联方案总是被 Shell 引号问题弄坏,尤其是同时涉及图片和 facets 时)。
系统会注入三个连接器凭据:$BLUESKY_HANDLE
(例如 name.bsky.social)、$BLUESKY_APP_PASSWORD(从 Bluesky
设置 → 隐私与安全 → 应用密码获取的应用密码,不能使用登录密码)以及
$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 或账号邮箱)和有效的应用密码重新连接此连接器。
发布——一次调用即可发布文本、图片和链接
发布前请先向用户确认文本(发布内容会显示在用户的真实账号下)。文本长度不得超过 300 个字素。可点击的链接 / #话题标签 / @提及会自动转换为 facets——只需直接写入文本,无需计算字节偏移量。
# 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 -),即可避免 Shell 引号问题:
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 即表示成功。
注意事项
- 使用应用密码,而非账号密码: 使用真实登录密码创建会话可能会被拒绝或触发双重身份验证。请始终使用从设置 → 应用密码获取的应用密码。
- Facets 和图片大小调整均为自动操作——CLI 会计算链接 / #标签 / @提及的字节偏移量,并替你缩小超出限制的图片,使其符合约 1 MB 的 Blob 限制。
- 300 个字素,按用户感知到的字符计数(表情符号 = 1)。
- 速率限制: PDS 会限制每个账号的写入频率;批量发布时请留出间隔,否则会收到
429 {"error":"RateLimitExceeded"}。 - 自托管 PDS: 如果用户运行自己的 PDS,
$BLUESKY_SERVICE应指向该服务;所有 XRPC 调用都会发往该主机,而不是bsky.social。 - 每次调用 CLI 时都会创建一个新的短期会话,因此无需担心
accessJwt过期——只需重新运行命令即可。
记录输出
成功发布并获取实际结果 URL 后,请调用一次内置的
publish_artifact 工具,让用户能在我的输出中追踪此交付内容:
publish_artifact(kind="message", channel="bluesky", title="<title>", url="<the REAL returned URL>", status="delivered")
请使用实际返回的 URL,切勿伪造 URL。每个已发布项目仅调用一次,并且只能在确认交付后调用;如果发布失败,请跳过此操作(或使用 status="failed")。
请参阅 _shared/artifacts.md。