10 个平台的 web 端全部用 TypeScript 移植自 cv-cat 的开源项目,请求与上游逐字节对拍。 统一的命令语法与 JSON 输出、按 平台 × 端 × 账号 隔离的登录态、给 AI Agent 用的技能与 llms.txt。
12 KiB
登录
各平台的 web 端不登录几乎看不到内容,所以 catbus 在 web 端除 auth 以外的命令都需要登录。未登录时命令报 AUTH_REQUIRED(退出码 3),hint 里就是该执行的登录命令。
catbus <platform> auth login [-a <账号名>] [--method qrcode|sms|password|cookie] [--scope <子站点>]
规范见 AGENTS.md 5.2、5.3。
各平台支持的方式
| 平台 | 扫码 | 短信 | 账密 | cookie | 默认 |
|---|---|---|---|---|---|
| xhs | ✓ | ✓ | ✓ | qrcode | |
| douyin | ✓ | ✓ | ✓ | qrcode | |
| tiktok | ✓ | cookie | |||
| bilibili | ✓ | ✓ | ✓ | ✓ | qrcode |
| kuaishou | ✓ | ✓ | ✓ | qrcode | |
| ✓ | cookie | ||||
| xianyu | ✓ | ✓ | qrcode | ||
| taobao | ✓ | cookie | |||
| jd | ✓ | ✓ | ✓ | qrcode | |
| x | ✓ | cookie |
表格来自注册表,以 catbus <platform> auth login --help 为准。不支持的方式报 UNSUPPORTED,hint 列出可选的方式。
扫码
catbus bilibili auth login
catbus xhs auth login --method qrcode
- 二维码画在终端(stderr)上,同时保存成 PNG:
~/.catbus/cache/<platform>/qrcode.png(权限 0600),终端显示不全时打开这张图扫。 - 用对应的 App 扫码,并在手机上确认。扫码后终端会提示「已扫码,请在手机上确认」。
- 要在几分钟内完成(各平台 2~5 分钟不等),超时或二维码失效时报
AUTH_REQUIRED,重新执行即可。 - 小红书:扫码确认后,服务端可能要求做一次人机验证(HTTP 471),catbus 和上游都还不能自动通过,会报
RISK_CONTROL,hint建议改用 cookie 导入。见 小红书的已知限制。
短信
在终端里(stdin 和 stderr 都是 TTY)一步完成:先发验证码,再提示输入。
catbus kuaishou auth login --method sms --phone 13800000000
在脚本或 Agent 里(非 TTY)分两步,中间态保存在 ~/.catbus/cache/<platform>/,10 分钟内有效:
catbus kuaishou auth login --method sms --phone 13800000000 # 发验证码,data 为 {"sent": true, "phone": "..."}
catbus kuaishou auth login --method sms --code 123456 # 用验证码完成登录
两步要用同一个 -a(不给时都是默认账号)。
平台差异:
- bilibili:发验证码前要过极验。catbus 先自动识别;识别不过时,在终端里会在本机起一个验证页面(
127.0.0.1),在浏览器里手动完成后自动继续;非 TTY 下报RISK_CONTROL,建议改用扫码。 - jd:部分账号在验证码之后还要求「额外安全验证」,会再发一条短信。TTY 下直接提示输入;非 TTY 下报
AUTH_REQUIRED,hint是用新验证码继续的命令(--code <验证码>)。 - douyin:
--sso改走login.douyin.com页的 SSO 链(与上游的DY_PHONE_LOGIN_PROFILE=sso相同),只用于--method sms。 - xhs:短信登录可能同样遇到 471 人机验证。
账密(仅 bilibili)
密码只从 stdin 读取,不接受命令行参数,避免留在 shell 历史里。TTY 下隐藏输入:
catbus bilibili auth login --method password --username <手机号或邮箱> --password-stdin
脚本里从管道传入:
printf '%s' "$BILI_PASSWORD" | catbus bilibili auth login --method password --username <手机号或邮箱> --password-stdin
登录前同样要过极验,处理方式同短信。
导入浏览器 cookie
tiktok、weibo、taobao、x 只能用这种方式;其他平台在扫码被风控时也可以用它。
怎么复制
document.cookie 拿不到 HttpOnly 的 cookie(例如小红书的 web_session、B 站的 SESSDATA、抖音的 sessionid),而它们恰恰是登录态本身,所以一定要从请求头里复制:
- 用浏览器打开平台网站并登录(见下表的网址)。
- 打开 DevTools(F12 或 ⌥⌘I),切到 Network(网络) 面板,刷新页面。
- 点开任意一个发往该网站域名的请求(文档请求或接口请求都行),在 Request Headers(请求标头) 里找到
Cookie,复制它的完整值。 - 导入:
catbus weibo auth login --cookie "SUB=...; SUBP=...; ..."
默认方式不是 cookie 的平台(扫码为默认)要加 --method cookie:
catbus xhs auth login --method cookie --cookie "a1=...; web_session=...; ..."
cookie 写在命令行里会留在 shell 历史中,更推荐从文件或 stdin 读:
catbus x auth login --cookie @x-cookie.txt # 从文件读,读完可以删掉这个文件
pbpaste | catbus x auth login --cookie - # 从 stdin 读(macOS 剪贴板)
--cookie 接受:
a=1; b=2形式的 Cookie 请求头(开头带Cookie:也可以);- 浏览器扩展导出的 cookie JSON 数组(
[{"name": ..., "value": ..., "domain": ...}]),会保留各自的 domain 和过期时间; - douyin、tiktok 另外接受一个 JSON 对象,一并导入写操作需要的设备数据,见下文。
导入后 catbus 会在线校验一次(取当前用户),cookie 无效或过期时报 AUTH_REQUIRED,不保存。
各平台要从哪里复制、至少要有哪些 cookie
| 平台 | 网址 | catbus 会检查的 cookie |
|---|---|---|
| xhs | https://www.xiaohongshu.com | a1(52 位)、web_session |
| douyin | https://www.douyin.com | sessionid |
| tiktok | https://www.tiktok.com | sessionid / sid_tt / multi_sids 之一 |
| bilibili | https://www.bilibili.com | SESSDATA;写操作还要 bili_jct |
| kuaishou | https://www.kuaishou.com | 在线校验 |
| https://weibo.com | SUB |
|
| xianyu | https://www.goofish.com | unb,以及 _m_h5_tk、cookie2 |
| taobao | https://www.taobao.com | unb,以及 _m_h5_tk、cookie2 |
| jd | https://www.jd.com | thor(或 pt_key)与 pin |
| x | https://x.com | auth_token、ct0 |
缺少时报 USAGE 并说明缺了哪个。复制整条 Cookie 请求头最省事,不要自己挑。
抖音:连同 ticket 与设备素材一起导入
抖音的写操作(发布、评论、点赞、私信等)除了 cookie,还要 bd-ticket-guard 凭证,而且要和 cookie 属于同一次登录。扫码或短信登录时 catbus 会自动拿到这些,所以写操作优先用扫码登录。
只有 cookie 时只读命令正常,写操作会在本地被拦下并报 AUTH_REQUIRED。已经有配套凭证时,可以用一个 JSON 对象导入(格式对应上游 DouyinAuth.from_cookie 的参数):
{
"cookie": "<浏览器的完整 Cookie,或 cookie JSON 数组>",
"ticket": "...",
"ts_sign": "...",
"client_cert": "...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"dtrait_blob": "..."
}
catbus douyin auth login --method cookie --cookie @dy.json
cookie(也可以写成cookies)必填,其余可选。- dtrait 设备素材(
dtrait_blob、dtrait_profile、session_dtrait):不给时按随包的设备档案现算。想用自己浏览器的设备指纹时再导入:dtrait_blob是抓到的内层 blob,dtrait_profile是设备档案对象(结构同static/douyin/dtrait_profile.json),两者都给时dtrait_blob优先。 - JSON 里出现任何一个 dtrait 键时,这一组整体替换,值为
null表示清掉;一个都没有时沿用同名账号已有的。之后再扫码登录同名账号,也会继承已有的 dtrait 素材。
已知问题:目前即使凭证齐全,抖音的发布仍返回空响应(上游同样失败),点赞在缺设备素材时还会导致登录态被踢。详见 抖音的已知限制。
TikTok:导入浏览器会话 JSON
TikTok 只能导入 cookie。只导入 Cookie 字符串时,缺的设备数据会在本地补齐,只读命令可以正常使用;但点赞、收藏、评论、发布、私信、直播发言等写操作需要浏览器 security-sdk 的 ticket-guard 数据,catbus 在本地拦下并报 AUTH_REQUIRED,提示用会话 JSON 重新登录。
会话 JSON 是一个扁平对象,字段名与上游 TiktokApis 的 .tiktok-runtime.json 相同(见上游 README 的「发布 Demo」一节),必须来自同一次已登录的浏览器会话:
{
"cookie": "<完整的 Cookie 请求头>",
"document_cookie": "...",
"device_id": "...",
"odin_id": "...",
"user_agent": "...",
"local_storage": { "...": "..." },
"session_storage": { "...": "..." },
"browser_metrics": { "...": "..." },
"ticket_guard_private_key": "-----BEGIN PRIVATE KEY-----\n...",
"ticket_guard_encrypt_ticket": "...",
"ticket_guard_ts_sign": "...",
"ticket_guard_version": "...",
"ticket_guard_iteration_version": "..."
}
catbus tiktok auth login --cookie @tiktok-session.json
cookie必须是 Cookie 字符串,其余字段原样存进凭证文件的device。- 写操作至少要有
ticket_guard_private_key、ticket_guard_encrypt_ticket、ticket_guard_ts_sign;缺哪个,报错里会列出来。 device_id不给时,catbus 依次从 localStorage 的 Tea 缓存、multi_sids里找,再没有就请求一次首页取服务端分配的值。
多账号
每个平台、每个端可以存多个账号,用 -a <账号名> 区分:
catbus xhs auth login -a work # 登录到账号 work
catbus xhs item search 咖啡 -a work # 用 work 执行
catbus xhs auth use work # 设为当前账号
catbus xhs auth list # 本平台的账号
catbus auth list # 所有平台、所有端的账号
- 身份的选择顺序:
-a <name>> 当前账号 > 未登录。-a指定的账号不存在时报AUTH_REQUIRED,hint为catbus <p> auth login -a <name>。 - 不带
-a登录时:有当前账号就登录到当前账号,否则登录到default。第一次登录的账号自动成为当前账号。 - 账号名只能用小写字母、数字、
_和-,以字母或数字开头,最长 32 位。guest是保留名。 - 如果这个名字下已经存了另一个用户,登录报
USAGE,新凭证不保存:换一个-a,或者先auth logout。
子站点(--scope)
有的平台的创作者中心、直播等子站点有单独的登录态:
- 能自动换取的,不需要再登录:例如小红书的创作者中心,第一次用到(
item list、item publish等)时用主站的登录态自动换取;失效后也会自动重新换取。 - 需要单独登录的,用
--scope登录到同一个账号的对应分区。目前只有小红书声明了creator:
catbus xhs auth login --scope creator # 扫码登录创作者中心
catbus xhs auth login --scope creator --method sms --phone 13800000000
catbus xhs auth login --scope creator --method cookie --cookie @creator-cookie.txt
命令缺少需要的 scope 时报 AUTH_REQUIRED,hint 里带上 --scope。
查看、刷新与登出
catbus xhs auth status # 在线校验,返回 {logged_in, user, method, expires_at}
catbus xhs auth logout # 登出当前账号
catbus xhs auth logout -a work
auth status未登录或已失效时返回logged_in: false,不报错;expires_at取自登录 cookie 的过期时间,取不到时为 null。- 平台返回登录失效时,命令报
AUTH_EXPIRED(退出码 3),hint是重新登录的命令。 - 会自动刷新的 token(例如 B 站的 refresh_token)和响应里的 Set-Cookie,会自动合并回凭证文件。
auth logout删除本地凭证文件,并清除指向它的当前账号。bilibili 和 kuaishou 会同时调用服务端登出;服务端登出失败时只删本地凭证。
凭证保存在哪里
~/.catbus/auth/<platform>/<endpoint>/<account>.json
- 目录权限 0700、文件 0600(Windows 依赖用户目录本身的 ACL),写入都是原子的。
- 凭证只保存在本机,catbus 不会上传到任何地方。不要把这个目录提交到 git、打包分享,或贴到 issue 里。
- 可以用
CATBUS_HOME换一个数据目录,见 configuration.md。