当前浏览的是 v7 预览版文档(v7 尚未正式发布,API 可能随版本调整)。本页是 v7 新增内容,去 v6 正式版文档首页
@ikenxuan/amagi

小红书

x-s 的算法本体进不了浏览器 —— 这里只有形状检查;XYW 信封能拆一层 JSON

小红书签名验证

小红书要验的东西是一组头部:x-s、x-s-common、x-t、x-xray-traceid,部分接口再加 x-b3-traceid。验证器对每个头做形状检查,x-s 是 XYW_ 格式时还能拆开信封的一层 JSON。

前缀 / 长度 / 字符集 —— 算法本体在 Node 侧,进不了浏览器

签名输入

演示值由本实现产出(同仓内联的 xhshow 算法,Node 侧)

判定

全部头部的形状都对。

x-sXYW_ 格式(AES-128-CBC 信封;端点当前一律用 XYS_ —— 实测 XYW_ 会被 461 拒);信封里报的是 signSvn 56、signType x2、appId xhs-pc-web
x-s-common
x-t
x-xray-traceid
x-b3-traceid

这里只有形状检查。x-s 的算法本体是同仓 platforms/xiaohongshu/sign/xhshow/(@ikenxuan/xhshow-ts 的内联副本,依赖 Node 的 crypto 与 zlib),进不了浏览器 —— 所以这一页证明不了「算法对」,只能证明「形状对」。全量校验在 Node 侧跑它的测试

先说实话:这个平台的验证强度是四家里最弱的

x-s 的算法本体是 @ikenxuan/xhshow-ts 的内联副本(在同仓 platforms/xiaohongshu/sign/xhshow/),那条依赖链用了 Node 的 crypto 与 zlib,进不了浏览器 —— 而文档站的验证器必须跑纯代码。所以这一页证明不了「算法对」,只能证明「形状对」。全量校验在 Node 侧跑它的测试(v6 对照快照一字不变)。

形状本身仍有鉴别力:前缀区分两套协议、x-t 的时钟范围能暴露「拿秒当毫秒」这类错、traceid 的长度与字符集是硬约束。

两套 x-s 格式

端点当前一律用 XYS_

曾按「user_posted、user/otherinfo 等数据接口自 2026-03 起以 HTTP 406 拒收 XYS_、 必须换 XYW_」实现 —— 该说法未经线上验证、且已被真机实测推翻:2026-10-11 同一游客 cookie 下,user_posted 用 XYW_ 回 HTTP 461 空 data、用 XYS_ 回 200 + 真数据。 全部 13 个端点现在都走 XYS_;XYW_ 信封仍能被验证器识别与拆解,但照「必须用 XYW_」写会踩 461。

XYW_ 的信封是标准 base64 包着的一层 JSON,浏览器里就能拆:

{
  "signSvn": "56",
  "signType": "x2",
  "appId": "xhs-pc-web",
  "signVersion": "1",
  "payload": "<真正的签名载荷,不可还原>"
}

信封字段是签名器自己报告的元数据(算法版本、平台标识),payload 才是加密载荷。信封对不上口径(比如 appId 不是 xhs-pc-web)是能被形状检查抓到的错;payload 内部对不对,只有 Node 侧的测试知道。

各头部验什么

头部形状约束备注
x-sXYS_ / XYW_ 前缀 + 非空XYW 信封可拆一层 JSON
x-s-common非空压缩+编码的不透明串,底下没有明文可找
x-t13 位毫秒时间戳能暴露「拿秒当毫秒」
x-xray-traceid32 位十六进制追踪头;缺失会让部分接口 406
x-b3-traceid16 位十六进制userNoteList 等接口专用

amagi 侧怎么组织

九个签名器注册名(xhs-post / xhs-get / xhs-get-trace / xhs-post-rap / xhs-get-rap / xhs-live-get / xhs-get-xyw / xhs-post-xyw / xhs-get-xyw-trace)只做「注册名 → step 清单」的映射,算法唯一实现在 platforms/xiaohongshu/sign/steps.ts,依赖方向单向。签名路径取 signPath(接口路径,与完整 URL 无关);x-rap-param 例外,要 host + path。机制细节见签名如何组织。

下一步

最后更新于 2026-10-23

On this page