当前浏览的是 v7 预览版文档(v7 尚未正式发布,API 可能随版本调整)。查看对应的 v6 正式版文档
@ikenxuan/amagi

小红书 SDK 方法

小红书平台的 13 个 SDK 方法,由端点注册表派生

本页 13 个方法由端点注册表生成:参数表、摘要与废弃标记都取自 端点声明。同一批端点的 HTTP 形态(路径、query 参数、响应信封、在线调用)见 HTTP 端点参考。

调用形式与单次请求配置

Client 上的绑定 Fetcher 是 client.<平台>.fetcher.<方法>(options, requestConfig?):cookie 已随 Client 绑好,第二个参数只作用于当前这一次调用,并与 Client 的实例级请求配置合并 —— 单次配置优先,headers 单独合并。

直接导出的裸 Fetcher 是 <平台>Fetcher.<方法>(options, cookie?, requestConfig?):没有实例级配置,cookie 按次传,第三个参数直接作用于当前请求。amagi.<平台>Fetcher 与同名的命名导出(import { bilibiliFetcher } from '@ikenxuan/amagi')是同一个对象。

两种形态都由端点注册表派生、走同一条执行管线、返回同一种信封,所以本页列出的方法名与参数对两者都成立。

requestConfig.headers 里任意大小写的 Cookie(Cookie / cookie / COOKIE)都会替换本次调用实际使用的 cookie:绑定形态覆盖 Client 上绑定的那份,裸 Fetcher 形态覆盖第二个参数。这次调用用哪份 Cookie,只写这一处就够。

小红书的签名要从 Cookie 里读 a1,覆盖成空串会落到游客会话(只拿得到上游允许匿名读取的内容);要换成另一份登录态,就覆盖成仍含 a1 的那一份:

const  = await ...(
  { : 'n1', : 'tk' },
  { : { : 'a1=xxx; web_session=xxx' } }
)

它只影响这一次请求,不改 Client 实例,也不影响同一实例后续的调用。

v7 的 Cookie 头按大小写不敏感匹配,覆盖只写在 headers 一处即可。

读取返回值:取 data

方法永不抛异常,返回的是信封:成功支有 data,失败支有 error,两支都有 message 与 meta,顶层没有 code。本页所有示例统一用 if (result.success) 收窄之后再读 result.data —— 四种读法里只有它既不必额外 import,收窄后的 data 又不带 | undefined:

读法拿到的 data
if (result.success)T(本页示例统一用这种)
直接读 result.data(不收窄)T | undefined
list.filter(isSuccess)T(数组回调里没有 if 可用)
unwrap(result)T,失败时抛 AmagiThrownError

四种读法的完整说明、失败分支的字段与三条逃生舱见响应类型。

大整数 ID 与响应类型

默认 JSON 解析会把超出 JavaScript 安全整数范围的裸整数保留为十进制字符串,防止直播间、作品等 ID 被四舍五入。普通安全整数、浮点数和指数写法保持原样;显式文本响应和自定义 transformResponse 仍由调用方控制。响应 ID 的类型因此可能是 string | number,需要统一存储时可用 String(id);不要先调用 Number() 再拼接请求。

新增端点只声明已有证据支持的响应字段;缺少完整成功响应样本的字段使用 unknown,使用前应检查对象、数组或字符串等实际结构。

已收录的端点在未提供 Cookie 时会初始化游客会话,并沿用当前请求的 User-Agent 和传输配置。同一客户端、UA 和请求配置下复用五分钟,并合并并发初始化;初始化失败后,下一次调用可以重试。不同客户端、代理、请求头或适配器等配置分别缓存;裸 Fetcher 也按其请求配置隔离。游客会话只能访问上游允许匿名读取的数据,需要登录的内容仍须传入有效登录 Cookie。

显式传入 web_session 或 userId 时,请保留与它配套的 a1。缺少 a1 会返回 error.kind: 'auth'、error.code: 'COOKIE_MISSING',并且不发送请求。client.xiaohongshu.request 自定义请求不执行端点的游客初始化,调用方仍需提供有效的 a1。

本页之外:自定义请求

本页是已收录的端点方法。要请求 amagi 尚未收录的接口,用 client.xiaohongshu.request(默认签名器按 method 选择:POST → xhs-post,其余 → xhs-get)。小红书那份 apiUrls 返回的是 { Url, Body, apiPath } 三段,三个键对应 url / config.data / amagi.signPath:

const  = ...({ : 'note-id', : 'xsec_xxx' })
const  = await ...({
  : 'POST',
  : .,
  : .,
  : { : . }
})

详见自定义请求。

Fetcher 方法

fetchHomeFeed

首页推荐笔记列表。端点 xiaohongshu.homeFeed,同一端点的 HTTP 形态。

取首页推荐流笔记。翻页要手动:把上一页响应的 cursor_score 传回来。

参数类型必填说明
cursor_scorestring否翻页游标;首页不传,续页传上一页的值
numnumber否单次请求的笔记条数,默认 27
refresh_typenumber否刷新类型,默认 1
note_indexnumber否笔记索引,默认 0
categorystring否内容分类,默认首页推荐流
search_keystring否搜索关键词,默认空字符串
unread_begin_note_idstring否未读区间起点笔记 ID
unread_end_note_idstring否未读区间终点笔记 ID
unread_note_countnumber否未读笔记数,默认 0
need_numnumber否需要的笔记数量,默认 8
need_filter_imagestring | boolean否是否过滤图片,默认 false
const  = await ...({
  : 20
})

if (.) {
  .(.)
}

fetchNoteDetail

笔记详细信息。端点 xiaohongshu.noteDetail,同一端点的 HTTP 形态。

取笔记正文与互动数据。要评论区用 noteComments。

参数类型必填说明
note_idstring是笔记 ID;从笔记分享链接里取
xsec_tokenstring是反爬令牌,随笔记分享链接下发;与发放它的会话绑定 —— 游客下换会话即 461,须同会话现取或带上原游客 CK
const  = await ...({
  : '64xxxxxxxx',
  : 'xsec_xxx'
})

if (.) {
  .(.)
}

xsec_token 可以从笔记的分享链接里取,形如 xsec_xxx。

fetchNoteComments

笔记评论列表。端点 xiaohongshu.noteComments,同一端点的 HTTP 形态。

取笔记评论列表。number 指定目标条数,翻页由端点自动完成。游客身份下平台对本接口限流较紧:超限回 HTTP 461(伪装成成功的空壳),退避需分钟级、秒级无效;而且不传 number 会触发翻页、多烧一次请求 —— 传具体小值可把请求数降到 1。

支持声明式翻页:用 number 指定需要的条数,单页上限 50 条,游标的带入与停止条件由端点声明处理。

参数类型必填说明
note_idstring是笔记 ID;从笔记分享链接里取
xsec_tokenstring是反爬令牌,随笔记分享链接下发;与发放它的会话绑定 —— 游客下换会话即 461,须同会话现取或带上原游客 CK
numbernumber否目标条数;不传时按单页上限翻页取满,而不是只取一页 —— 游客下翻页必被拒且多烧一次请求,传具体小值可降到 1 次
const  = await ...({
  : '64xxxxxxxx',
  : 'xsec_xxx'
})

if (.) {
  .(.)
}

v6 的 cursor 参数已由声明式翻页接管(小红书的 string 游标与抖音的 number 游标,语义差异收敛在端点声明里),调用方只说明要多少条。

fetchUserProfile

用户主页信息。端点 xiaohongshu.userProfile,同一端点的 HTTP 形态。

取用户主页的资料与统计。笔记列表见 userNoteList。

参数类型必填说明
user_idstring是用户 ID,从主页地址里取
xsec_tokenstring否反爬令牌,随用户主页分享链接下发;游客必传、有效登录 CK 可省;与发放它的会话绑定(游客下换会话即 461)
xsec_sourcestring否反爬来源,默认 pc_feed;仅在带 xsec_token 时发出
const  = await ...({
  : '5xxxxxxxxx'
})

if (.) {
  .(.)
}

用户资料改用 JSON 接口,平台响应包含 data.basic_info、data.interactions 与 data.tab_public。SDK 的 result.data 是这份原始响应,所以资料位于 result.data.data。读取旧主页 HTML 初始状态路径的调用方需相应调整。

import amagi from '@ikenxuan/amagi'
const client = amagi({ cookies: { xiaohongshu: 'a1=...' } })
// ---cut---
const result = await client.xiaohongshu.fetcher.fetchUserProfile({ user_id: 'user-id' })
if (result.success) {
  const profile = result.data.data
  const nickname = profile?.basic_info?.nickname
  if (typeof nickname === 'string') console.log(nickname)
  console.log(profile?.interactions, profile?.tab_public)
}

这些字段目前是可选协议字段,未确认的内部结构保持 unknown;应像上例一样检查后再使用。

fetchUserNoteList

用户笔记列表。端点 xiaohongshu.userNoteList,同一端点的 HTTP 形态。

取用户的笔记列表。翻页要手动:cursor 传上一页最后一条的 ID。

参数类型必填说明
user_idstring是用户 ID
xsec_tokenstring否反爬令牌,随用户主页分享链接下发;游客必传、有效登录 CK 可省;与发放它的会话绑定(游客下换会话即 461)
xsec_sourcestring否反爬来源,默认 pc_feed
cursorstring否翻页游标;传上一页最后一条的 ID,首页不传
numnumber否单次请求的笔记条数,默认 30
const  = await ...({
  : '5xxxxxxxxx'
})

if (.) {
  .(.)
}

用户主页签发的 xsec_token 仍为必填,并与 xsec_source 一起传给上游。不要将笔记详情的 token 当作用户主页 token 使用。

fetchEmojiList

表情列表。端点 xiaohongshu.emojiList,同一端点的 HTTP 形态。

取小红书表情列表,无参数。

无参数。

const  = await ...({})

if (.) {
  .(.)
}

searchNotes

笔记搜索结果列表。端点 xiaohongshu.searchNotes,同一端点的 HTTP 形态。

按关键词搜笔记。翻页手动传 page,并复用相同的 search_id / session_id;可指定排序和笔记类型。

参数类型必填说明
keywordstring是搜索关键词
pagenumber否页码,从 1 开始,默认 1
page_sizenumber否每页条数,默认 20
sort'general' | 'popularity_descending' | 'time_descending'否排序,默认综合
note_typenumber否笔记类型:0 全部,1 视频,2 图文
search_idstring否搜索标识;翻页时复用
session_idstring否搜索会话标识;翻页时复用
const  = await ...({
  : '关键词'
})

if (.) {
  .(.)
}

可传 sort(general / popularity_descending / time_descending)与 note_type(0 全部、1 视频、2 图文)。接口使用手动页码 page;同一轮搜索翻页时,复用 search_id 与 session_id,每页的请求标识由 SDK 自动生成。

import amagi, { xiaohongshuUtils } from '@ikenxuan/amagi'
const client = amagi({ cookies: { xiaohongshu: 'a1=...' } })
const search = {
  keyword: '旅行',
  search_id: xiaohongshuUtils.sign.getSearchId(),
  session_id: xiaohongshuUtils.sign.getSearchSessionId()
}
const firstPage = await client.xiaohongshu.fetcher.searchNotes({ ...search, page: 1 })
const secondPage = await client.xiaohongshu.fetcher.searchNotes({ ...search, page: 2 })

searchUser

搜索用户结果列表。端点 xiaohongshu.searchUser,同一端点的 HTTP 形态。

按关键词或小红书号搜用户,返回 user_id 等。翻页手动传 page。

参数类型必填说明
keywordstring是搜索关键词或小红书号
pagenumber否页码,从 1 开始,默认 1
page_sizenumber否每页条数,默认 15
const  = await ...({
  : '关键词'
})

if (.) {
  .(.)
}

公开方法名是 searchUser,与 searchNotes 一致。支持关键词或小红书号查询,手动传 page / page_size 翻页。该接口的 code: 1000 只有同时出现 success: true 时才作为成功处理,其他接口沿用各自的业务码判定。

fetchSearchHotList

搜索热榜。端点 xiaohongshu.searchHotList,同一端点的 HTTP 形态。

取小红书当前搜索热榜,无参数。

无参数。

const  = await ...({})

if (.) {
  .(.)
}

无业务参数,可调用 client.xiaohongshu.fetcher.fetchSearchHotList()。返回上游当前热榜;没有完整录制证据的条目字段保留为 unknown,使用前应自行收窄。

fetchSubComments

子评论(楼中楼)列表。端点 xiaohongshu.subComments,同一端点的 HTTP 形态。

展开某条一级评论下的回复。number 指定目标条数,翻页自动完成。

支持声明式翻页:用 number 指定需要的条数,单页上限 10 条,游标的带入与停止条件由端点声明处理。

参数类型必填说明
note_idstring是笔记 ID
root_comment_idstring是要展开的一级评论 ID
xsec_tokenstring是反爬令牌,随笔记分享链接下发
numbernumber否目标条数,默认一页
const  = await ...({
  : '64xxxxxxxx',
  : '',
  : 'xsec_xxx'
})

if (.) {
  .(.)
}

root_comment_id 是要展开的一级评论 ID,note_id 与 xsec_token 来自同一篇笔记。传入 number 指定目标回复数,SDK 每页最多请求 10 条并自动推进游标。无需传 v6 补丁里的 num 或 cursor。

fetchLiveRoom

直播间信息。端点 xiaohongshu.liveRoom,同一端点的 HTTP 形态。

取指定直播间的当前信息。variant=h5 走 h5 接口,否则走 web;web 端请提供 request_user_id 或含 userId 的 Cookie。

参数类型必填说明
room_idstring是直播间 ID
variant'h5' | 'web'否端类型,默认 web
request_user_idstring否请求方用户 ID;web 默认从 Cookie 的 userId 读取,h5 不使用
sourcestring否来源标识,默认按端类型取(web=web_live)
client_typenumber否客户端类型,web 端默认 1
const  = await ...({
  : ''
})

if (.) {
  .(.)
}

room_id 使用字符串,避免 JavaScript 大整数精度丢失。默认 variant: 'web',request_user_id 可显式传入,也可从 Cookie 的 userId 读取;variant: 'h5' 不使用这个参数。两种接口的返回字段可能不同,协议类型只声明已有证据支持的共同字段。

fetchLiveStatus

直播状态。端点 xiaohongshu.liveStatus,同一端点的 HTTP 形态。

轮询指定直播间是否在播,返回体极小。

参数类型必填说明
room_idstring是直播间 ID
scenestring否场景标识,默认 share_out_of_app
const  = await ...({
  : ''
})

if (.) {
  .(.)
}

传入字符串 room_id 查询直播状态,默认 scene: 'share_out_of_app'。是否在播需读取上游返回的状态字段;HTTP 请求成功本身不代表直播正在进行。

fetchLiveSquare

直播广场。端点 xiaohongshu.liveSquare,同一端点的 HTTP 形态。

取直播广场推荐列表,参数均可选。

参数类型必填说明
sourcenumber否来源标识,默认 13
categorystring否分类,默认 0(全部)
pre_sourcestring否前置来源,真机首屏为空
sizenumber否每页数量,默认 27
extra_infounknown | string否附加信息;HTTP query 可传 JSON 字符串,默认 {"image_formats":["jpg","webp","avif"]}
cursor_scorestring否分页游标分数,翻页时才带
const  = await ...({
  : 0
})

if (.) {
  .(.)
}

无必填参数,默认获取 27 条推荐直播间。需要翻页时手动传入上游返回的 cursor_score;它不是 v7 的 number 自动分页端点。extra_info 在 SDK 中可传对象,通过 HTTP query 调用时可传 URL 编码后的 JSON 对象字符串。

注意事项

小红书对签名与 Cookie 的要求较高:登录 Cookie 要保留有效的 a1、xsec_token 要传对、 请求间隔别太密。

  • note_id 与 xsec_token 都可以从笔记的分享链接里提取
  • 部分接口需要登录状态才能拿到完整数据
  • 反爬较严格,建议控制请求频率

小红书的签名工具(xiaohongshuUtils.sign 的 extractA1FromCookie / getSearchId / generateXT 等)见工具集。

On this page