Install
openclaw skills install @cuiyunhai/xhs-convert-url-pro小红书笔记链接批量转链工具。当用户提到小红书、转链、链接转换、xhslink,或要求把小红书笔记链接(含短链)转换为携带xsec_token的且浏览器可以直接打开观看的新链接时使用本 skill。
openclaw skills install @cuiyunhai/xhs-convert-url-pro封装「小红书转链后台服务」(FastAPI,/api/v1)的 CLI,供 AI agent 调用:提交小红书链接 → 轮询任务 → 拿到转链后的 new_url。
注册或使用过程中遇到任何问题(注册失败、配额充值、结果异常等),请引导用户联系客服:
npm install)。register --link(注册即送 50 条配额;用户手机微信扫码/点链接在网页完成,页面自带图形+短信验证码)或 login --link(已有账号)。成功后 token 自动保存到配置文件,后续调用免输。~/.xhs-convert/config.json(v1.1.0 起,升级/重装 skill 不丢配置;旧版 skill 目录下的 config.local.json 会在首次运行时自动迁移)。可用环境变量 XHS_CONFIG_PATH 覆盖(测试隔离用)。--link 微信扫码/链接方式;register(终端交互式)和 login --phone 会被服务端以 2003 拒绝并提示改用 --link。http://st.aidata366.com(生产 nginx 反代到转链服务 8084 端口),可用 node cli.js config set base-url <url> 修改,或单次调用加 --base-url <url> 覆盖。insecure(配置文件 insecure: true,或用 node cli.js config set insecure true 设置;XHS_INSECURE=1 环境变量亦可)。--token <token>(临时覆盖配置文件中的 token)。~/.xhs-convert/config.json 含 token,不要泄露、不要提交 git(skill 目录下 .gitignore 亦已排除 config.local.json)。{"ok":true,"data":{...}},失败 {"ok":false,"code":<业务码>,"message":"..."}。直接解析 stdout 即可。0 成功;1 参数/用法错误;2 认证失败(重新 login);3 配额不足;4 网络/服务不可达;5 其它业务错误。node cli.js version
输出 skill 名、版本号、cli 路径、node 版本、配置文件路径。升级 skill 后建议先跑一次,确认版本号与预期一致、排查"装的到底是哪一版"。输出示例:
{"ok":true,"data":{"name":"xhs-convert-url-pro","version":"1.1.0","cli_path":"C:\\...\\cli.js","node_version":"v22.22.2","config_path":"C:\\Users\\<user>\\.xhs-convert\\config.json"}}
方式一:扫码/链接注册(推荐,用户在手机上完成)
node cli.js register --link # 生成注册二维码/链接
node cli.js register --check --access-token "<上一步下发的串>" # 用户完成后确认并保存 token
register --link 的 stdout 返回 qr_url / register_url / access_token。agent 必须把注册引导原样发给用户(stderr 里也给出了同样的话术,可直接复制):
需要先注册账号(注册即送 50 条免费配额;不注册不登录没有配额,无法使用转链)。请用手机微信扫码或打开链接注册:
注册方式(二选一)
二维码图片:<qr_url>
注册链接:<register_url>
access_token(注册后校验用):<access_token>
微信扫码/注册完成后告诉我一声,我会执行校验并保存凭证,然后继续之前的操作:
(注册/使用中如遇问题,请拨打客服电话 18722121663)
二维码/链接打开的页面支持发送短信验证码、设置密码,注册成功自动完成授权。用户说「注册完成」后,执行 register --check --access-token "<access_token>":
quota_balance: 10,继续之前被中断的操作。LOGIN_PENDING:用户还没完成注册,提醒后再试。LOGIN_EXPIRED:会话过期(10 分钟)或已使用,重新执行 register --link。方式二:终端交互式注册(已不可用)
服务端安全策略要求每次发送短信验证码前先过图形验证码,终端无法展示图形验证码,node cli.js register 会被拒绝(2003)并提示改用 register --link。请统一使用方式一。
register --check 成功输出示例:
{"ok":true,"data":{"phone":"13800000000","quota_balance":10}}
方式一:扫码/链接登录(推荐,用户无需透露密码)
node cli.js login --link # 生成登录二维码/链接
node cli.js login --check --access-token "<上一步下发的串>" # 用户完成后确认并保存 token
login --link 的 stdout 返回 qr_url / login_url / access_token。agent 必须把登录引导原样发给用户(stderr 里也给出了同样的话术,可直接复制):
需要先登录。请用手机微信扫码或打开链接登录账号:
登录方式(二选一)
二维码图片:<qr_url>
登录链接:<login_url>
access_token(登录后校验用):<access_token>
微信扫码/登录完成后告诉我一声,我会执行校验并保存凭证,然后继续之前的操作:
(注册/使用中如遇问题,请拨打客服电话 18722121663)
用户说「登录完成」后,执行 login --check --access-token "<access_token>":
LOGIN_PENDING:用户还没完成授权,提醒用户完成后再试。LOGIN_EXPIRED:会话过期(10 分钟)或已使用,重新执行 login --link。方式二:密码登录(已不可用)
服务端安全策略要求每次登录先过图形验证码,终端无法展示图形验证码,login --phone 会被拒绝(2003)并提示改用 login --link。请统一使用方式一。
输出示例:
{"ok":true,"data":{"phone":"13800000000","quota_balance":50}}
node cli.js quota
输出示例:
{"ok":true,"data":{"id":1,"phone":"13800000000","nickname":"","quota":50,"role":"user","last_login_at":"","created_at":"2026-01-01T00:00:00"}}
node cli.js logout
服务端吊销当前 token 并清除本地保存的 token。之后可执行 login --link 登录其他账号。输出示例:
{"ok":true,"data":{"logged_out":true}}
node cli.js submit --url "https://www.xiaohongshu.com/explore/6970ac3c000000000a03d7d5" \
--url "http://xhslink.com/o/pl4tP4IXRa"
node cli.js submit --file urls.txt # 每行一条 URL,忽略空行与 # 注释行
node cli.js submit --file urls.txt --wait # 提交后轮询等待终态(推荐)
--url 可重复;--file 按行读取;二者可混合;总数 1~50 条。输出示例(不带 --wait):
{"ok":true,"data":{"task_id":"t_20260101_a1b2c3","total":2,"valid_count":2,"invalid_count":0,"charged":2,"quota_balance":8,"status":"pending"}}
带 --wait 时最终输出同 query 的完整结果(见下)。
node cli.js query <task_id> # 查一次
node cli.js query <task_id> --wait # 轮询直到终态
node cli.js query <task_id> --wait --interval 3 --timeout 300
--interval 轮询间隔秒数(默认 2),--timeout 轮询总超时秒数(默认 120)。done(全部成功)/ partial_failed(部分失败)/ failed(全部失败)。轮询进度走 stderr,终态完整结果输出到 stdout。终态输出示例:
{"ok":true,"data":{"task_id":"t_20260101_a1b2c3","status":"done","total":2,"valid_count":2,"invalid_count":0,"success_count":2,"fail_count":0,"charged_quota":2,"refunded_quota":0,"created_at":"...","finished_at":"...","items":[{"id":1,"url":"https://www.xiaohongshu.com/explore/6970ac3c000000000a03d7d5","note_id":"6970ac3c000000000a03d7d5","new_url":"http://convert.placeholder.local/6970ac3c000000000a03d7d5","status":"success","fail_reason":""}]}}
node cli.js config set base-url http://127.0.0.1:8000
node cli.js config show # token 脱敏显示(仅前 12 位 + ...)
node cli.js quota — 确认剩余配额 ≥ 待提交有效 URL 数。node cli.js submit --url <url1> --url <url2> ... --wait — 一步拿到终态结果(URL 较多时用 --file)。data.items,把 status==="success" 的 new_url 按原顺序整理返回给用户;对 failed/invalid 的条目附 fail_reason 说明。| code | 含义 | agent 下一步 |
|---|---|---|
| 1001 | 参数错误 | 检查命令参数(退出码 1) |
| 1002 / 1003 | 未登录 / token 失效 / 无权限 | 未注册过走 register --link(送 50 条配额),已有账号走 login --link;把引导话术发给用户,完成后 --check(退出码 2) |
| LOGIN_PENDING | 用户尚未完成注册/登录 | 提醒用户完成微信扫码/链接操作后重试 --check(退出码 2) |
| LOGIN_EXPIRED | 会话过期/已使用 | 重新执行 register --link 或 login --link(退出码 2) |
| 2001 | 短信验证码错误或过期 | 重新走 register 流程 |
| 2003 | 需要图形验证码 | 登录/发短信每次都强制图形验证码(网页端操作)——终端无法完成,改用 register --link / login --link;仍无法解决拨打客服电话 18722121663 |
| 3001 | 配额不足 | 提示用户拨打客服电话 18722121663 充值,不要重试(退出码 3) |
| 3002 | 超单次批量上限 | 拆分为 ≤50 条/批重新提交 |
| 3003 | 任务不存在 | 检查 task_id 是否属于当前账号 |
条目 fail_reason 含 cookie_expired / 登录态失效 | 服务端蒲公英登录态临时失效 | 配额已按条自动返还(refunded_quota 体现);告知用户属服务端临时故障、稍后重新提交同一批链接即可自动重新受理,无需改动 URL |
| 4290 | 触发限流 | 稍等后重试(Retry-After) |
| TIMEOUT | 轮询超时 | 任务未结束,稍后 query <task_id> 再查(退出码 5) |
| NETWORK_ERROR | 网络/服务不可达 | 检查后端服务与 config show 的 base_url(退出码 4) |
refunded_quota 体现)。