用途
hashnode 技能用于在用户自己的 Hashnode 博客上发布、保存草稿和读取文章。它通过用户自己的登录 Cookie(BYOC)完成认证,无需 Hashnode Pro 订阅。
背景:Hashnode 于 2026-05-13 将其公开 GraphQL API 移入付费 Pro 计划,因此个人访问令牌(Personal Access Token)已无法免费发布。本技能改为驱动 Hashnode 网页编辑器使用的同一套第一方 REST API(https://hashnode.com/api/...),由用户的登录会话 Cookie 认证——这是免费的,且不需要 Pro 计划。
主要能力
- 列出用户的博客(出版物),同时验证 Cookie 是否有效。
- 创建并保存私有草稿:支持标题、副标题、封面图、标签和 Markdown 正文。
- 发布文章到用户的真实博客。
- 删除草稿或已发布文章。
该技能已于 2026-07-12 在真实连接的博客上完成端到端验证:列出出版物、创建并保存草稿(标题/副标题/封面/标签/Markdown)、发布、删除——全部通过 Cookie 认证,无需 Pro。
认证与安全
连接器将 Cookie jar 注入为环境变量 HASHNODE_COOKIES(一个 JSON 数组;会话 Cookie 为 hashnode-session)。该变量属于敏感信息,拥有完整账户访问权限,绝不能回显或打印。
若出现认证错误,说明 Cookie 已过期,应让用户在 https://studio.acedata.cloud/console/connectors 重新连接,不要循环重试。
使用方式
设置时锚定到本技能自带的脚本:
# $SKILL_DIR can point at another skill loaded this turn — anchor on our script.
H="$SKILL_DIR/scripts/hashnode.py"; [ -f "$H" ] || H=$(find /tmp -maxdepth 8 -path '*/skills/*/hashnode/scripts/hashnode.py' 2>/dev/null | head -1)
[ -f "$H" ] || { echo "hashnode script not found (SKILL_DIR=$SKILL_DIR)" >&2; exit 1; }
python3 "$H" publications # list the user's blogs (verifies the cookie)
读取出版物:
python3 "$H" publications # {publications:[{id,title,url}]}
保存私有草稿(安全、非公开):
python3 "$H" draft \
--title "My Title" \
--subtitle "Optional subtitle" \
--content-file article.md \
--cover "https://cdn.example.com/cover.jpg" \
--tags ai,apis
# → {draft_id, editor_url}. Nothing is public yet.
- --content-file 是 Markdown 正文(长文建议用文件;短内容可用 --content 内联字符串)。内联图片和链接就是普通 Markdown。
- --cover 设置页眉/封面图(同时用作 OG 图)。
- --tags 是逗号分隔的 slug(ai,apis,web-development),会自动解析为真实的 Hashnode 标签 id(最多 5 个)。
- --publication <id> 仅在账户有多个博客时需要。
发布(门控:除非末尾加 --confirm,否则为 dry-run):
python3 "$H" publish --title "My Title" --content-file article.md --cover "https://…" --tags ai,apis # dry-run
python3 "$H" publish --title "My Title" --content-file article.md --cover "https://…" --tags ai,apis --confirm # LIVE
# → {ok, url} (or {ok:false, warning:"…automoderation removed…"} — rewrite editorially)
确认发布后文章会立即公开在用户的真实博客上。务必先展示最终标题和正文,获得用户明确同意,然后把 --confirm 作为最后一个参数运行。
删除草稿或文章(门控):
python3 "$H" delete --id <draftOrPostId> # dry-run
python3 "$H" delete --id <draftOrPostId> --confirm # delete
适用场景与限制
⚠️ 非 Pro 博客受自动审核——写社论式内容,不要写广告。
这是最重要的一条规则。非 Pro 出版物受 Hashnode 自动审核约束:明显推广性的文章(夸张语言、"free credits!!"、同一 CTA 链接重复 3–4 次)会在几秒内被自动移除——发布调用仍返回成功,但线上 URL 随后会 404。(Pro 在此处的一个好处就是"免受自动审核移除"。)
要保持文章在线,应写真正有用的 how-to / 指南,顺带介绍产品:
- 教育性框架和具体标题(例如 "… (Beginner's Guide)")。
- 最多几个得体的链接,不要重复同一 CTA。
- 不要 "limited-time!! grab now!!" 这类营销口吻。
publish 会在发布后重新抓取线上 URL,如果文章被审核移除会返回警告——若看到该警告,应改写为社论式内容并重新发布。
其他注意事项:
- 无 Pro、无 PAT。本技能使用 Cookie 认证的 hashnode.com/api/* 编辑器 API,而非 gql-beta.hashnode.com(后者需要付费 Pro 计划)。
- 自动审核(见上)是免费博客上的主要失败模式——保持社论式内容。
- 这是用户的真实博客。任何发布/删除前都要确认。
- 绝不打印 HASHNODE_COOKIES——它拥有完整账户访问权限。
- 第一方内部 API——Hashnode 更新编辑器时它可能变化;如果某个调用意外返回 HTML/404,应作为上游漂移上报。
记录输出
成功发布并获得线上结果 URL 后,调用内置的 publish_artifact 工具一次,以便用户在 My Outputs 中跟踪该交付物:
publish_artifact(kind="article", channel="hashnode", title="<title>", url="<the REAL returned URL>", status="delivered")
使用真实返回的 URL——绝不编造。每个已发布条目调用一次,仅在交付确认后调用;若发布失败则跳过(或使用 status="failed")。参见 _shared/artifacts.md。