跳转至

Quickstart:逻辑 Profile、知乎/CSDN 登录与草稿

本页覆盖 ChatPost 的推荐日常路径:用逻辑 Profile(默认 test,可另建 product)发现配置、检查知乎/CSDN 网页登录态、打开登录 handoff、登出/清理;再通过独立 chatpost zhihu draft / chatpost csdn draft 入口 dry-run 或创建一个草稿。login/status/logout 不创建草稿、不调用发布适配器,也不会读取或导出 Cookie、LocalStorage、IndexedDB、session 或 token 原值。小红书保留同形 profiles/login/status/logout 接口,但当前不作为草稿验收主线。

0. 安装链路与职责边界

安装 ChatPost 会带上 Python 层依赖 chatupchatbrowser,但三者职责不同:

ChatUp       = 安装 / setup:Node、Playwright package、Chromium/Chrome 制品
ChatBrowser  = 浏览器运行态:backend、Profile metadata、loopback CDP session registry
ChatPost     = post 编排:逻辑 Profile -> 平台 -> 登录态 -> draft/create receipt
python -m pip install ChatPost
chatpost --version
chatpost --tree
chatpost --tree-brief
chatup playwright install 1.61.1 --browser chromium --output json -I
chatbrowser profile create zhihu-test \
  --path "$HOME/.chatarch/chatpost/profiles/test/zhihu" \
  --backend chatup-playwright \
  --label owner=chatpost \
  --label platform=zhihu \
  --label logical_profile=test \
  --output json

pip install ChatPost 负责安装 Python 包依赖;浏览器二进制仍由 chatup playwright install ... 准备;浏览器 Profile 路径和非敏感 metadata 由 chatbrowser profile create ... 登记。ChatPost 的 runner 可以通过 browser_profile = "zhihu-test" 引用 ChatBrowser Profile,并继续把 Wechatsync extension、bridge、receipt 等发布适配器字段留在 ChatPost/adapter 层。

0b. 设定变量

CHATPOST=chatpost
CHATPOST_HOME="${CHATPOST_HOME:-$HOME/.chatarch/chatpost}"
REGISTRY="${CHATPOST_ACCOUNT_REGISTRY:-$CHATPOST_HOME/accounts.toml}"
PROFILE=test

ChatPost 默认把本地状态放在 ChatArch 内部目录 ~/.chatarch/chatpost/:默认 registry 是 ~/.chatarch/chatpost/accounts.toml,runner/Profile/receipt 等后续状态也应放在这个 state root 下。--registry 只用于显式覆盖或任务级实验;不要把默认 accounts.toml 放到仓库根目录、当前工作目录或临时 project 目录。

accounts.toml 只保存非敏感 Profile metadata,例如 alias、platform、runner_config、profile 和 label。不要把 Cookie、LocalStorage、二维码 payload、验证码、手机号、密码、token 或 WebSocket UUID 写入 registry、config、日志或文档。相对 runner_config 路径按 registry 所在目录解析,因此默认情况下也会落在 ~/.chatarch/chatpost/ 内部。

推荐只维护两个逻辑 Profile:

profiles/
  test/
    zhihu/
    xhs/
    csdn/
  product/
    zhihu/
    xhs/
    csdn/

日常命令优先使用逻辑名,例如 chatpost zhihu status testchatpost csdn status test。registry 内部可以保留平台别名(如 zhihu-testxhs-testcsdn-test)作为兼容层,但用户不需要记这些别名。

1. 确认可见 CLI 和 Profile

"$CHATPOST" --tree

"$CHATPOST" platforms   --output json   -I

"$CHATPOST" profiles   --platform zhihu   --registry "$REGISTRY"   --output json   -I

"$CHATPOST" profiles   --platform xhs   --registry "$REGISTRY"   --output json   -I

"$CHATPOST" profiles   --platform csdn   --registry "$REGISTRY"   --output json   -I

"$CHATPOST" zhihu profiles   --registry "$REGISTRY"   --output json   -I

"$CHATPOST" xhs profiles   --registry "$REGISTRY"   --output json   -I

"$CHATPOST" csdn profiles   --registry "$REGISTRY"   --output json   -I

这些发现命令只读 registry,不启动浏览器,不读取登录态。等价真实命令名是 chatpost platformschatpost profileschatpost zhihu profileschatpost xhs profileschatpost csdn profiles

登录基础层的真实命令名是 chatpost zhihu statuschatpost zhihu loginchatpost zhihu logoutchatpost xhs statuschatpost xhs loginchatpost xhs logoutchatpost csdn statuschatpost csdn loginchatpost csdn logout

2. 检查当前网页登录态

"$CHATPOST" zhihu status "$PROFILE"   --registry "$REGISTRY"   --output json   -I

status 只做 browser-level 页面检查:打开/连接受控 Chromium Profile,通过知乎页面的 URL、DOM、可见账号入口判断状态。输出状态为:

  • LOGGED_IN:页面可见信息能确认已登录,可带 account_name / account_url
  • LOGGED_OUT:页面可见信息显示未登录;
  • UNKNOWN:页面无法可靠判断,且不会 fallback 到发布适配器。

3. 登录或复用已登录 Profile

"$CHATPOST" zhihu login "$PROFILE"   --registry "$REGISTRY"   --timeout 900   --output json   -I

行为约定:

  • 已登录:先做 browser-page status,确认已登录后直接返回 LOGGED_IN,不会发 QR、不会发登录链接;
  • 未登录:打开同一个 Profile 的知乎登录页,尽快输出 page-owned login_urlbrowser_opened handoff,然后保持浏览器等待人工完成登录;
  • 不读取或导出 Cookie、LocalStorage、IndexedDB、session、token;
  • 不调用发布适配器,不需要 adapter env,不需要发布 token;
  • 页面截图不是登录 handoff,不能冒充最终登录交付;
  • 机器验证、滑块、手机号和验证码都属于人工浏览器流程,CLI 不提供 --phone--code--otp--sms-code

JSON 输出是 JSON Lines:先输出可交互 handoff 事件,最后输出登录完成或超时事件。

4. 回读状态验收

"$CHATPOST" zhihu status "$PROFILE"   --registry "$REGISTRY"   --output json   -I

登录实践完成后,应看到 LOGGED_IN,并尽可能看到页面可见的 account_nameaccount_url

5. 登出/清理

"$CHATPOST" zhihu logout "$PROFILE"   --registry "$REGISTRY"   --output json   -I

logout 先做 browser-level status:未登录时返回 ALREADY_LOGGED_OUT;已登录时才清理知乎 origins 登录态。清理是浏览器命令,不读取任何 session 原值。

5b. 小红书接口保留(当前不作为验收主线)

小红书保留与知乎同形的平台入口:profiles/status/login/logout。当前默认推荐仍只验收知乎;小红书二维码来源需要后续单独修正普通站点登录页后再恢复验收。日常不要把小红书调试二维码当作可用登录结果。

XHS_PROFILE="$PROFILE"
XHS_QR="$CHATPOST_HOME/xhs-login-qrcode.png"
"$CHATPOST" xhs status "$XHS_PROFILE"   --registry "$REGISTRY"   --output json   -I
# 后续恢复 XHS 验收时再执行:
# "$CHATPOST" xhs login "$XHS_PROFILE"   --registry "$REGISTRY"   --timeout 900   --qrcode "$XHS_QR"   --output json   -I

当二维码成功生成时,首个 JSON Lines 事件形态为 event=login_handoffstatus=LOGIN_REQUIREDhandoff_kind=qrcode_imageqrcode_path=/path/to/png。如果页面没有暴露真实可解码二维码,返回 LOGIN_HANDOFF_UNAVAILABLE / reason=qrcode_not_found;如果小红书把当前网络判为风险,返回 LOGIN_BLOCKED / block_reason=network_risk。这些失败都不能伪装成可扫码二维码。

5c. CSDN 登录与状态

CSDN 保留与知乎同形的平台入口:profiles/status/login/logout。未登录时,CSDN 登录只输出二维码图片 artifact,不输出私有确认链接、二维码 token、Cookie 或 session。密码/SMS/人机验证属于人工浏览器流程;ChatPost 不绕过、不自动打码、不保存验证码内容。

CSDN_PROFILE="$PROFILE"
CSDN_QR="$CHATPOST_HOME/csdn-login-qrcode.png"
"$CHATPOST" csdn status "$CSDN_PROFILE"   --registry "$REGISTRY"   --output json   -I
"$CHATPOST" csdn login "$CSDN_PROFILE"   --registry "$REGISTRY"   --timeout 900   --qrcode "$CSDN_QR"   --output json   -I
"$CHATPOST" csdn status "$CSDN_PROFILE"   --registry "$REGISTRY"   --output json   -I

CSDN status 的验收依据必须来自同一受控 Profile 的页面可见状态或浏览器内用户接口结果;不能只看 URL/title,也不能从 Cookie/LocalStorage/IndexedDB/session/token 反推登录态。

常见停点

停点 处理
login 直接返回 LOGGED_IN 预期行为,说明 Profile 已登录。
xhs login 输出 qrcode_path 预期 handoff;把该 PNG 发给用户扫码,并保持同一登录命令/浏览器页继续轮询。
xhs login 返回 LOGIN_HANDOFF_UNAVAILABLE / qrcode_not_found 页面未暴露真实可解码二维码;不能把截图、切换图标或私有 artifact 冒充二维码。
zhihu login 输出 browser_opened 但没有 page-owned login_url 浏览器已打开等待人工登录;不要用截图或私有 artifact 冒充登录链接。
登录页需要滑块或验证码 停在人工浏览器流程,不把验证码写进 CLI 参数或日志。
login 返回 LOGIN_BLOCKED / block_reason=network_risk 当前出口被平台拒绝,不能生成可扫码二维码;换可靠网络或本机浏览器 profile 后再试。
csdn login 遇到安全验证 停在人工浏览器流程;不绕过、不自动打码、不把验证码写进 CLI 参数、日志或文档。
status 返回 UNKNOWN 只报告未知;不要 fallback 到发布适配器或读取 Cookie/token。

6. 知乎/CSDN 草稿 dry-run 与 create

chatpost zhihu draftchatpost csdn draft 都与浏览器级登录命令刻意分离。它们复用同一个逻辑 Profile,但只有 draft 流程会加载 Wechatsync、扩展、bridge 和私有 env 文件;login/status/logout 必须保持 browser-only。

ARTICLE=/absolute/path/to/article.md
chatpost zhihu draft "$PROFILE" "$ARTICLE" \
  --registry "$REGISTRY" \
  --dry-run \
  --output json \
  -I

真实 create 需要显式 receipt,并且只创建一个知乎草稿,不最终发布:

RECEIPT="$CHATPOST_HOME/runners/zhihu-test/run/zhihu-draft-receipt.json"
chatpost zhihu draft "$PROFILE" "$ARTICLE" \
  --registry "$REGISTRY" \
  --receipt "$RECEIPT" \
  --output json \
  -I

期望状态:dry-run 返回 DRY_RUN_OK;真实 create 返回 DRAFT_CREATED 并写 mode 0600 receipt。若返回 RESULT_UNKNOWN,不要自动重试,先读 receipt 和浏览器状态。

CSDN 使用同样的 Wechatsync draft 合同,但平台参数是 csdn。当前 Wechatsync CSDN adapter 保存的是草稿:请求使用 pubStatus="draft",返回 draftOnly=true;ChatPost 当前不提供 CSDN 公开 post/publish 命令。Markdown source 可以用 frontmatter cover 提供封面图,正文图片使用标准 Markdown 图片语法;创建草稿时会通过 CSDN image_upload 写入 CSDN 图床 URL 和 cover_images

---
title: CSDN rich draft demo
cover: data:image/png;base64,...
---

## 正文图片

![正文图片说明](data:image/png;base64,...)
ARTICLE=/absolute/path/to/article.md
chatpost csdn draft "$PROFILE" "$ARTICLE" \
  --registry "$REGISTRY" \
  --dry-run \
  --output json \
  -I

RECEIPT="$CHATPOST_HOME/runners/csdn-test/run/csdn-draft-receipt.json"
chatpost csdn draft "$PROFILE" "$ARTICLE" \
  --registry "$REGISTRY" \
  --receipt "$RECEIPT" \
  --output json \
  -I