XHS(小红書)使用ガイド
TikHub OpenAPI(
https://api.tikhub.io)に基づいて整理した小紅書のAPIドキュメント。
目次
共通説明
a. 呼び出し戦略:複数シリーズの組み合わせ利用(重要)
小紅書のAPIで現在最も安定しているのは App V2 シリーズです。すべてのユーザーに対して「メインシリーズ + 1〜2 個の予備シリーズ」を組み合わせる戦略を強く推奨します。2〜3 個のシリーズを組み合わせて使うことで、全体の業務可用性を高められます。
b. 呼び出し優先順位:App V2(推奨)> App V1(フォールバック)> Web V3(第3候補)
App V2 が主推奨シリーズで、現時点で最も安定しており、データも最も完全です。最優先での利用を推奨します。App V1 は App V2 とフィールドの整合性が近く、第一予備のフォールバックとして適しています。Web V3 は企業ユーザー向けに開放された第3候補の Web 端末チャネルで、
xsec_token(共有リンクから抽出可能)が必要です。ただし返却されるデータの次元は App V2 / App V1 より少ないため、企業ユーザーであっても複数シリーズを適切に組み合わせて使うことを推奨します。Web V3 のみを使うのは避けてください。Web V2 / Web シリーズ は一部のAPIしか利用できず、安定性も必ずしも保証されないため、主力としては推奨しません。前述の3シリーズで要件を満たせない場合の補助としてのみ利用してください。
c. 一言アドバイス:1つのシリーズだけに依存しないでください。本番環境では少なくとも2シリーズを主従構成で用意することを推奨します。企業ユーザーが Web V3 を使う場合は、データ次元を補うために App V2 / App V1 を追加で組み合わせてください。
d. 返却フィールドの注意:App 系 API(App V2 / App V1)同士は構造が似ており、フィールド名も基本的に対応付け可能です。ただし Web 系 API(Web V3 / Web V2 / Web)の返却 JSON 構造はそれぞれ異なり、フィールド名、ネスト階層、データ次元が異なる場合があります。利用時は必ず各APIの実際の返却 JSON フィールドを確認してから、解析・マッピングを行ってください。
1. 単一ノート
小紅書のノートは2種類に分かれます:図文ノート(画像ノート) と 動画ノート。App V2 シリーズでは2種類それぞれに独立したエンドポイントがあり、データが最も完全です。Web V3 は同一APIで両タイプを処理し、レスポンスフィールドで区別します。
共通の推奨:まず App V2 シリーズを優先してください。企業ユーザーは
xsec_tokenを取得できる場面では Web V3 と組み合わせて利用できます。
総合例:3シリーズを組み合わせて単一ノート詳細を取得
以下は、メインシリーズ(App V2)→ 予備1(App V1)→ 予備2(Web V3) の組み合わせ呼び出しの考え方を示すサンプルコードです。優先順位に従って順番に試し、前のものが成功したらそのまま返し、失敗したら次へフォールバックします。
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9NOTE_ID = "697c0eee000000000a03c308"
10XSEC_TOKEN = "ABxxxxxxxxxxxxxx" # Required for Web V3, extract from share link / Web V3 需要,可从分享链接抽取
11IS_VIDEO = False # Note type: True=video note, False=image note / 笔记类型:True=视频笔记,False=图文笔记
12
13
14# --- Primary: App V2 / 主系列:App V2 ---
15def fetch_by_app_v2(note_id: str, is_video: bool):
16 if is_video:
17 path = "/api/v1/xiaohongshu/app_v2/get_video_note_detail"
18 else:
19 path = "/api/v1/xiaohongshu/app_v2/get_image_note_detail"
20 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
21 params={"note_id": note_id})
22
23
24# --- Fallback 1: App V1 (image notes only; no video download URL, not recommended for videos) / 备用 1:App V1(仅图文有效,视频不含下载链接,不建议用于视频)---
25def fetch_by_app_v1(note_id: str):
26 path = "/api/v1/xiaohongshu/app/get_note_info"
27 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
28 params={"note_id": note_id})
29
30
31# --- Fallback 2: Web V3 (enterprise users only, requires xsec_token) / 备用 2:Web V3(企业用户专用,需要 xsec_token)---
32def fetch_by_web_v3(note_id: str, xsec_token: str):
33 path = "/api/v1/xiaohongshu/web_v3/fetch_note_detail"
34 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
35 params={"note_id": note_id, "xsec_token": xsec_token})
36
37
38# --- Try all three series in order / 三系列依次尝试 ---
39def get_note_detail(note_id: str, xsec_token: str, is_video: bool):
40 # 1) Primary: App V2 / 主系列:App V2
41 try:
42 r = fetch_by_app_v2(note_id, is_video)
43 if r.ok and r.json().get("code") == 200:
44 return {"source": "app_v2", "data": r.json()}
45 except Exception as e:
46 print("App V2 调用失败:", e)
47
48 # 2) Fallback 1: App V1 (skip this step for video notes) / 备用 1:App V1(视频笔记建议跳过此步)
49 if not is_video:
50 try:
51 r = fetch_by_app_v1(note_id)
52 if r.ok and r.json().get("code") == 200:
53 return {"source": "app_v1", "data": r.json()}
54 except Exception as e:
55 print("App V1 调用失败:", e)
56
57 # 3) Fallback 2: Web V3 / 备用 2:Web V3
58 try:
59 r = fetch_by_web_v3(note_id, xsec_token)
60 if r.ok and r.json().get("code") == 200:
61 return {"source": "web_v3", "data": r.json()}
62 except Exception as e:
63 print("Web V3 调用失败:", e)
64
65 return None
66
67
68result = get_note_detail(NOTE_ID, XSEC_TOKEN, IS_VIDEO)
69print(result)補足:上記の成功判定(
code == 200)は説明用の書き方です。実際には各シリーズの返却JSONフィールドに基づいて判定してください。シリーズごとに返却構造が異なるため、各シリーズごとに個別の解析ロジックを実装することを推奨します。
1.1 画像ノート(図文ノート)
1.1.1 [App V2] 図文ノート詳細を取得 ⭐ 推奨
図文ノートの完全な詳細データ(画像URL、タイトル、本文、タグ、インタラクションデータなど)を取得します。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_image_note_detail - 公式ドキュメント:docs.tikhub.io/420136391e0
- パラメータ:
note_id(string, 任意):ノートID、例:"697c0eee000000000a03c308"share_text(string, 任意):小紅書の共有リンク(APP / Web 端末対応)- どちらか一方を指定。優先は
note_id。両方指定した場合はnote_idを優先
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
5
6url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_image_note_detail"
7params = {
8 "note_id": "697c0eee000000000a03c308",
9 # "share_text": "https://www.xiaohongshu.com/discovery/item/...",
10}
11r = requests.get(url, headers=HEADERS, params=params)
12print(r.json())1.1.2 [App V1] ノート情報を取得 V1(図文のみ、動画ダウンロードリンクなし)
App V1 のノートAPIは、図文ノートのみに対応します。返却内容に動画ダウンロードリンクは含まれないため、動画ノートには使用しないでください。動画ノートは App V2 の get_video_note_detail を使用してください。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_note_info - 公式ドキュメント:docs.tikhub.io/310965839e0
- パラメータ:
note_id(string, 任意)share_text(string, 任意)- どちらか一方を指定。優先は
note_id
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_note_info"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4}
5r = requests.get(url, headers=HEADERS, params=params)
6print(r.json())1.1.3 [Web V3] ノート詳細を取得(図文/動画共通)
Web V3 のエンドポイントで、図文/動画共通です。xsec_token(共有リンクから抽出、上記「補助ツールAPI」を参照)が必要です。
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_note_detail - 公式ドキュメント:docs.tikhub.io/438852168e0
- パラメータ:
note_id(string, 必須)xsec_token(string, 必須)
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_note_detail"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "xsec_token": "ABxxxxxxxxxxxxxx",
5}
6r = requests.get(url, headers=HEADERS, params=params)
7print(r.json())1.2 動画ノート
動画ノートには App V1 の
get_note_infoを使用しないでください。このAPIの返却内容には動画ダウンロードリンクが含まれません。以下の App V2 または Web V3 を使用してください。
1.2.1 [App V2] 動画ノート詳細を取得 ⭐ 推奨
動画ノートの完全な詳細データ(動画URL、カバー、長さ、タイトル、本文、インタラクションデータなど)を取得します。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_video_note_detail - 公式ドキュメント:docs.tikhub.io/420136392e0
- パラメータ:
note_id(string, 任意):例:"697c0eee000000000a03c308"share_text(string, 任意)- どちらか一方を指定。優先は
note_id
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_video_note_detail"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 # "share_text": "https://www.xiaohongshu.com/discovery/item/...",
5}
6r = requests.get(url, headers=HEADERS, params=params)
7print(r.json())1.2.2 [Web V3] ノート詳細を取得(動画共通)
図文と同じエンドポイントで、note_id + xsec_token を指定して呼び出せばOKです。
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_note_detail - 公式ドキュメント:docs.tikhub.io/438852168e0
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_note_detail"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "xsec_token": "ABxxxxxxxxxxxxxx",
5}
6r = requests.get(url, headers=HEADERS, params=params)
7print(r.json())2. ユーザー情報
user_id を通じて、小紅書ユーザーの公開プロフィール(ニックネーム、アバター、自己紹介、フォロワー数、フォロー数、ノート数など)を取得します。3シリーズすべてにユーザー情報APIがあります。App V2 のフィールドが最も充実しており、App V1 / Web V3 は予備として適しています。
共通の推奨:まず App V2 シリーズを優先してください。
user_idのみ取得できる場合でも App V1 / Web V3 を利用できます。
💡
user_idの取得方法が分からない? まず/api/v1/xiaohongshu/app/get_user_id_and_xsec_tokenという補助ツールAPI(公式ドキュメント)を使い、任意の小紅書ユーザープロフィール共有リンク(長リンク/短リンクどちらでも可)を渡すと、user_idとxsec_tokenを解析できます。その後、下記のユーザー情報APIに渡してください。詳細は下の 2.3 を参照してください。
総合例:3シリーズを組み合わせてユーザー情報を取得
以下は、メインシリーズ(App V2)→ 予備1(App V1)→ 予備2(Web V3) の組み合わせ呼び出しの考え方を示すサンプルコードです。優先順位に従って順番に試し、前のものが成功したらそのまま返し、失敗したら次へフォールバックします。
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9USER_ID = "61b46d790000000010008153"
10
11
12# --- Primary: App V2 / 主系列:App V2 ---
13def fetch_user_by_app_v2(user_id: str):
14 path = "/api/v1/xiaohongshu/app_v2/get_user_info"
15 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
16 params={"user_id": user_id})
17
18
19# --- Fallback 1: App V1 / 备用 1:App V1 ---
20def fetch_user_by_app_v1(user_id: str):
21 path = "/api/v1/xiaohongshu/app/get_user_info"
22 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
23 params={"user_id": user_id})
24
25
26# --- Fallback 2: Web V3 / 备用 2:Web V3 ---
27def fetch_user_by_web_v3(user_id: str):
28 path = "/api/v1/xiaohongshu/web_v3/fetch_user_info"
29 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
30 params={"user_id": user_id})
31
32
33# --- Try all three series in order / 三系列依次尝试 ---
34def get_user_info(user_id: str):
35 # 1) Primary: App V2 / 主系列:App V2
36 try:
37 r = fetch_user_by_app_v2(user_id)
38 if r.ok and r.json().get("code") == 200:
39 return {"source": "app_v2", "data": r.json()}
40 except Exception as e:
41 print("App V2 调用失败:", e)
42
43 # 2) Fallback 1: App V1 / 备用 1:App V1
44 try:
45 r = fetch_user_by_app_v1(user_id)
46 if r.ok and r.json().get("code") == 200:
47 return {"source": "app_v1", "data": r.json()}
48 except Exception as e:
49 print("App V1 调用失败:", e)
50
51 # 3) Fallback 2: Web V3 / 备用 2:Web V3
52 try:
53 r = fetch_user_by_web_v3(user_id)
54 if r.ok and r.json().get("code") == 200:
55 return {"source": "web_v3", "data": r.json()}
56 except Exception as e:
57 print("Web V3 调用失败:", e)
58
59 return None
60
61
62result = get_user_info(USER_ID)
63print(result)補足:上記の成功判定(
code == 200)は説明用の書き方です。実際には各シリーズの返却JSONフィールドに基づいて判定してください。シリーズごとに返却構造が異なるため、各シリーズごとに個別の解析ロジックを実装することを推奨します。
2.1 [App V2] ユーザー情報を取得 ⭐ 推奨
指定ユーザーの詳細情報を取得します。ニックネーム、アバター、自己紹介、フォロワー数、フォロー数、ノート数などを含みます。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_user_info - 公式ドキュメント:docs.tikhub.io/420136395e0
- パラメータ:
user_id(string, 任意):ユーザーID、例:"61b46d790000000010008153"share_text(string, 任意):小紅書ユーザーの共有リンク(APP / Web 端末対応)- どちらか一方を指定。優先は
user_id。両方指定した場合はuser_idを優先
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
5
6url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_user_info"
7params = {
8 "user_id": "61b46d790000000010008153",
9 # "share_text": "https://www.xiaohongshu.com/user/profile/...",
10}
11r = requests.get(url, headers=HEADERS, params=params)
12print(r.json())2.2 [App V1] ユーザー情報を取得
App V1 のユーザー情報APIです。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_user_info - 公式ドキュメント:docs.tikhub.io/310965845e0
- パラメータ:
user_id(string, 必須)
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_user_info"
2params = {
3 "user_id": "61b46d790000000010008153",
4}
5r = requests.get(url, headers=HEADERS, params=params)
6print(r.json())2.3 [App V1] 補助ツール:ユーザー共有リンクから user_id と xsec_token を抽出
手元にユーザープロフィール共有リンクしかない場合(長リンク/短リンク両対応)、まずこのAPIで user_id と xsec_token を解析し、その後で上記のユーザー情報APIを呼び出してください。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_user_id_and_xsec_token - 公式ドキュメント:docs.tikhub.io/364605901e0
- パラメータ:
share_link(string, 必須):小紅書ユーザーの共有リンク
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_user_id_and_xsec_token"
2params = {
3 "share_link": "https://xhslink.com/m/xxxxx",
4}
5r = requests.get(url, headers=HEADERS, params=params)
6print(r.json())
7# Example response fields / 返回示例字段:
8# {
9# "data": {
10# "user_id": "61b46d790000000010008153",
11# "xsec_token": "ABxxxxxxxxxxxxxx"
12# }
13# }2.4 [Web V3] ユーザー情報を取得
Web V3 のユーザー公開プロフィールAPIです。user_id だけで利用できます。
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_user_info - 公式ドキュメント:docs.tikhub.io/438852177e0
- パラメータ:
user_id(string, 必須)
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_user_info"
2params = {
3 "user_id": "61b46d790000000010008153",
4}
5r = requests.get(url, headers=HEADERS, params=params)
6print(r.json())3. ユーザー作品
user_id に基づいて、そのユーザーが投稿したノート一覧(図文/動画混在)を取得します。すべてのAPIはカーソルページネーション(cursor)を使用します。App V2 シリーズでは追加で「ユーザーの公開お気に入りノート一覧」API(faved notes)も提供されます。App V1 / Web V3 は「公開済みノート」のみを対象とします。
共通の推奨:まず App V2 シリーズを優先してください。
user_idのみ取得できる場合でも App V1 / Web V3 を利用できます。💡
user_idの取得方法が分からない?上記 2.3 の補助ツールAPI(公式ドキュメント)を参照してください。
総合例:3シリーズを組み合わせてユーザーの公開ノートを取得
以下は、メインシリーズ(App V2)→ 予備1(App V1)→ 予備2(Web V3) の組み合わせ呼び出しの考え方を示すサンプルコードです。優先順位に従って順番に試し、前のものが成功したらそのまま返し、失敗したら次へフォールバックします。
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9USER_ID = "61b46d790000000010008153"
10CURSOR = "" # Empty for first request; pass previous response's cursor for pagination / 首次请求留空;翻页时传上一次返回的 cursor
11
12
13# --- Primary: App V2 / 主系列:App V2 ---
14def fetch_user_notes_app_v2(user_id: str, cursor: str = ""):
15 path = "/api/v1/xiaohongshu/app_v2/get_user_posted_notes"
16 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
17 params={"user_id": user_id, "cursor": cursor})
18
19
20# --- Fallback 1: App V1 / 备用 1:App V1 ---
21def fetch_user_notes_app_v1(user_id: str, cursor: str = ""):
22 path = "/api/v1/xiaohongshu/app/get_user_notes"
23 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
24 params={"user_id": user_id, "cursor": cursor})
25
26
27# --- Fallback 2: Web V3 / 备用 2:Web V3 ---
28def fetch_user_notes_web_v3(user_id: str, cursor: str = "", num: int = 30):
29 path = "/api/v1/xiaohongshu/web_v3/fetch_user_notes"
30 return requests.get(f"{BASE_URL}{path}", headers=HEADERS,
31 params={"user_id": user_id, "cursor": cursor, "num": num})
32
33
34# --- Try all three series in order / 三系列依次尝试 ---
35def get_user_notes(user_id: str, cursor: str = ""):
36 # 1) Primary: App V2 / 主系列:App V2
37 try:
38 r = fetch_user_notes_app_v2(user_id, cursor)
39 if r.ok and r.json().get("code") == 200:
40 return {"source": "app_v2", "data": r.json()}
41 except Exception as e:
42 print("App V2 调用失败:", e)
43
44 # 2) Fallback 1: App V1 / 备用 1:App V1
45 try:
46 r = fetch_user_notes_app_v1(user_id, cursor)
47 if r.ok and r.json().get("code") == 200:
48 return {"source": "app_v1", "data": r.json()}
49 except Exception as e:
50 print("App V1 调用失败:", e)
51
52 # 3) Fallback 2: Web V3 / 备用 2:Web V3
53 try:
54 r = fetch_user_notes_web_v3(user_id, cursor)
55 if r.ok and r.json().get("code") == 200:
56 return {"source": "web_v3", "data": r.json()}
57 except Exception as e:
58 print("Web V3 调用失败:", e)
59
60 return None
61
62
63result = get_user_notes(USER_ID, CURSOR)
64print(result)補足:上記の成功判定(
code == 200)は説明用の書き方です。実際には各シリーズの返却JSONフィールドに基づいて判定してください。シリーズごとに返却構造が異なるため、各シリーズごとに個別の解析ロジックを実装することを推奨します。
3.1 [App V2] ユーザーの公開ノート一覧を取得 ⭐ 推奨
指定ユーザーが公開したノート一覧を取得します。カーソルページネーションを使用します。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_user_posted_notes - 公式ドキュメント:docs.tikhub.io/420136396e0
- パラメータ:
user_id(string, 任意):ユーザーID、例:"61b46d790000000010008153"share_text(string, 任意):小紅書ユーザーの共有リンク(APP / Web 端末対応)- どちらか一方を指定。優先は
user_id。両方指定した場合はuser_idを優先 cursor(string, 任意):ページングカーソル。初回リクエストでは空欄。ページ送り時は前回レスポンス中のnotesリストの最後のノートのcursorを取得(パス例:$.data.data.notes[-1].cursor)
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
5
6url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_user_posted_notes"
7params = {
8 "user_id": "61b46d790000000010008153",
9 "cursor": "", # Empty for first request / 首次留空
10}
11r = requests.get(url, headers=HEADERS, params=params)
12print(r.json())3.2 [App V2] ユーザーの公開お気に入りノート一覧を取得(App V2 のみ)
指定ユーザーが公開お気に入りしたノート一覧を取得します(ユーザー自身が投稿したものではなく、ta がお気に入り登録したコンテンツ)。カーソルページネーションを使用します。このAPIはApp V2 のみ提供され、App V1 / Web V3 には対応機能がありません。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_user_faved_notes - 公式ドキュメント:docs.tikhub.io/420136397e0
- パラメータ:
user_id(string, 任意):例:"5a8cf39111be10466d285d6b"share_text(string, 任意)- どちらか一方を指定。優先は
user_id cursor(string, 任意):ページングカーソル。初回は空欄。ページ送り時は前ページの最後のノートのnote_idを渡す
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_user_faved_notes"
2params = {
3 "user_id": "5a8cf39111be10466d285d6b",
4 "cursor": "",
5}
6r = requests.get(url, headers=HEADERS, params=params)
7print(r.json())3.3 [App V1] ユーザー作品一覧を取得
App V1 のユーザー作品APIです。公開済みノートのみを対象とし、カーソルページネーションを使用します。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_user_notes - 公式ドキュメント:docs.tikhub.io/310965846e0
- パラメータ:
user_id(string, 必須)cursor(string, 任意):初回は空欄。ページ送り時は前ページのnotesリストの最後のノートのnote_idを取得
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_user_notes"
2params = {
3 "user_id": "61b46d790000000010008153",
4 "cursor": "",
5}
6r = requests.get(url, headers=HEADERS, params=params)
7print(r.json())返却構造(主要フィールド):
notes[]:ノート配列。各項目にはnote_id、type(normal=図文 /video=動画)、display_title、desc、liked_count、cover、userなどを含むcursor:次ページのカーソルhas_more:さらにデータがあるかどうか
3.4 [Web V3] ユーザーノート一覧を取得
Web V3 のユーザー作品APIです。カーソルページネーションを使用し、1ページあたりの件数を指定できます(最大 30)。
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_user_notes - 公式ドキュメント:docs.tikhub.io/438852178e0
- パラメータ:
user_id(string, 必須)cursor(string, 任意):ページングカーソルnum(integer, 任意):1ページあたりの件数。デフォルト 30、最大 30
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_user_notes"
2params = {
3 "user_id": "61b46d790000000010008153",
4 "cursor": "",
5 "num": 30,
6}
7r = requests.get(url, headers=HEADERS, params=params)
8print(r.json())4. コメント
小紅書のコメントは2層に分かれます:一次コメント(ノート下のコメント一覧) と 二次コメント(特定コメントへの返信/子コメント一覧)。3シリーズすべてにこの2層のAPIがあります。App V2 のフィールドが最も豊富で、App V1 / Web V3 は予備として適しています。
共通の推奨:まず App V2 シリーズを優先してください。Web V3 のAPIには
xsec_tokenが必要です(共有リンクから抽出可能。上記 1. 単一ノート の総合例 / 2.3 の補助ツールAPIを参照)。
4.1 一次コメント(ノート下のコメント一覧)
総合例:3シリーズを組み合わせて一次コメントを取得
以下は、メインシリーズ(App V2)→ 予備1(App V1)→ 予備2(Web V3) の組み合わせ呼び出しの考え方を示すサンプルコードです。
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9NOTE_ID = "697c0eee000000000a03c308"
10XSEC_TOKEN = "ABxxxxxxxxxxxxxx" # Required for Web V3 / Web V3 需要
11
12
13# --- Primary: App V2 / 主系列:App V2 ---
14def fetch_comments_app_v2(note_id: str, cursor: str = "", index: int = 0):
15 path = "/api/v1/xiaohongshu/app_v2/get_note_comments"
16 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
17 "note_id": note_id,
18 "cursor": cursor,
19 "index": index,
20 "pageArea": "UNFOLDED",
21 "sort_strategy": "latest_v2",
22 })
23
24
25# --- Fallback 1: App V1 / 备用 1:App V1 ---
26def fetch_comments_app_v1(note_id: str, start: str = ""):
27 path = "/api/v1/xiaohongshu/app/get_note_comments"
28 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
29 "note_id": note_id,
30 "start": start,
31 "sort_strategy": 1,
32 })
33
34
35# --- Fallback 2: Web V3 / 备用 2:Web V3 ---
36def fetch_comments_web_v3(note_id: str, xsec_token: str, cursor: str = ""):
37 path = "/api/v1/xiaohongshu/web_v3/fetch_note_comments"
38 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
39 "note_id": note_id,
40 "xsec_token": xsec_token,
41 "cursor": cursor,
42 })
43
44
45# --- Try all three series in order / 三系列依次尝试 ---
46def get_note_comments(note_id: str, xsec_token: str):
47 try:
48 r = fetch_comments_app_v2(note_id)
49 if r.ok and r.json().get("code") == 200:
50 return {"source": "app_v2", "data": r.json()}
51 except Exception as e:
52 print("App V2 调用失败:", e)
53
54 try:
55 r = fetch_comments_app_v1(note_id)
56 if r.ok and r.json().get("code") == 200:
57 return {"source": "app_v1", "data": r.json()}
58 except Exception as e:
59 print("App V1 调用失败:", e)
60
61 try:
62 r = fetch_comments_web_v3(note_id, xsec_token)
63 if r.ok and r.json().get("code") == 200:
64 return {"source": "web_v3", "data": r.json()}
65 except Exception as e:
66 print("Web V3 调用失败:", e)
67
68 return None
69
70
71result = get_note_comments(NOTE_ID, XSEC_TOKEN)
72print(result)補足:上記の成功判定(
code == 200)は説明用の書き方です。実際には各シリーズの返却JSONフィールドに基づいて判定してください。
4.1.1 [App V2] ノートコメント一覧を取得 ⭐ 推奨
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_note_comments - 公式ドキュメント:docs.tikhub.io/420136394e0
- パラメータ:
note_id(string, 任意):ノートIDshare_text(string, 任意):共有リンク(note_idとどちらか一方。優先はnote_id)cursor(string, 任意):ページングカーソル。初回は空欄index(integer, 任意):コメントインデックス。初回は0を指定pageArea(string, 任意):折りたたみ状態、UNFOLDED(デフォルト)/FOLDEDsort_strategy(string, 任意):並び順、default/latest_v2(デフォルト) /like_count
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_note_comments"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "cursor": "",
5 "index": 0,
6 "pageArea": "UNFOLDED",
7 "sort_strategy": "latest_v2",
8}
9r = requests.get(url, headers=HEADERS, params=params)
10print(r.json())4.1.2 [App V1] ノートコメントを取得
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_note_comments - 公式ドキュメント:docs.tikhub.io/310965840e0
- パラメータ:
note_id(string, 必須)start(string, 任意):ページングカーソル。初回は空欄。2つの形式に対応 —— シンプル形式(例:"682b0133000000001c03618d")、または JSON 形式(例:{"cursor":"...","index":2,"pageArea":"UNFOLDED"})sort_strategy(integer, 任意):1-デフォルト並び順(デフォルト)/2-最新コメント
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_note_comments"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "start": "",
5 "sort_strategy": 1,
6}
7r = requests.get(url, headers=HEADERS, params=params)
8print(r.json())4.1.3 [Web V3] ノートコメントを取得
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_note_comments - 公式ドキュメント:docs.tikhub.io/438852169e0
- パラメータ:
note_id(string, 必須)xsec_token(string, 必須):共有リンクから抽出可能cursor(string, 任意):ページングカーソル
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_note_comments"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "xsec_token": "ABxxxxxxxxxxxxxx",
5 "cursor": "",
6}
7r = requests.get(url, headers=HEADERS, params=params)
8print(r.json())4.2 二次コメント(子コメント / 返信一覧)
特定の一次コメント下にあるすべての返信(子コメント)を取得します。こちらも3シリーズで対応しています。なお、Web V3 ではこのパラメータ名は root_comment_id、他の2シリーズでは comment_id です。
総合例:3シリーズを組み合わせて子コメントを取得
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9NOTE_ID = "699916e6000000001d0253da"
10COMMENT_ID = "PARENT_COMMENT_ID" # Top-level comment ID / 一级评论 ID
11XSEC_TOKEN = "ABxxxxxxxxxxxxxx" # Required for Web V3 / Web V3 需要
12
13
14def fetch_sub_app_v2(note_id, comment_id, cursor="", index=1):
15 path = "/api/v1/xiaohongshu/app_v2/get_note_sub_comments"
16 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
17 "note_id": note_id,
18 "comment_id": comment_id,
19 "cursor": cursor,
20 "index": index,
21 })
22
23
24def fetch_sub_app_v1(note_id, comment_id, start=""):
25 path = "/api/v1/xiaohongshu/app/get_sub_comments"
26 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
27 "note_id": note_id,
28 "comment_id": comment_id,
29 "start": start,
30 })
31
32
33def fetch_sub_web_v3(note_id, root_comment_id, xsec_token, cursor="", num=10):
34 path = "/api/v1/xiaohongshu/web_v3/fetch_sub_comments"
35 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
36 "note_id": note_id,
37 "root_comment_id": root_comment_id,
38 "xsec_token": xsec_token,
39 "cursor": cursor,
40 "num": num,
41 })
42
43
44def get_sub_comments(note_id, comment_id, xsec_token):
45 try:
46 r = fetch_sub_app_v2(note_id, comment_id)
47 if r.ok and r.json().get("code") == 200:
48 return {"source": "app_v2", "data": r.json()}
49 except Exception as e:
50 print("App V2 调用失败:", e)
51
52 try:
53 r = fetch_sub_app_v1(note_id, comment_id)
54 if r.ok and r.json().get("code") == 200:
55 return {"source": "app_v1", "data": r.json()}
56 except Exception as e:
57 print("App V1 调用失败:", e)
58
59 try:
60 r = fetch_sub_web_v3(note_id, comment_id, xsec_token)
61 if r.ok and r.json().get("code") == 200:
62 return {"source": "web_v3", "data": r.json()}
63 except Exception as e:
64 print("Web V3 调用失败:", e)
65
66 return None
67
68
69result = get_sub_comments(NOTE_ID, COMMENT_ID, XSEC_TOKEN)
70print(result)4.2.1 [App V2] ノート二次コメント一覧を取得 ⭐ 推奨
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_note_sub_comments - 公式ドキュメント:docs.tikhub.io/420748830e0
- パラメータ:
note_id(string, 任意)share_text(string, 任意)(note_idとどちらか一方。優先はnote_id)comment_id(string, 必須):親コメントIDcursor(string, 任意):初回は空欄。ページ送り時は$.data.cursorから取得index(integer, 任意):初回は1を指定。ページ送り時は$.data.cursorから取得
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_note_sub_comments"
2params = {
3 "note_id": "699916e6000000001d0253da",
4 "comment_id": "PARENT_COMMENT_ID",
5 "cursor": "",
6 "index": 1,
7}
8r = requests.get(url, headers=HEADERS, params=params)
9print(r.json())4.2.2 [App V1] 子コメントを取得
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_sub_comments - 公式ドキュメント:docs.tikhub.io/310965841e0
- パラメータ:
note_id(string, 必須)comment_id(string, 必須):一次コメントIDstart(string, 任意):ページングカーソル。前ページの最後の子コメントIDから取得(例:"6806642d000000001f01991b")
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_sub_comments"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "comment_id": "PARENT_COMMENT_ID",
5 "start": "",
6}
7r = requests.get(url, headers=HEADERS, params=params)
8print(r.json())4.2.3 [Web V3] 子コメントを取得
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_sub_comments - 公式ドキュメント:docs.tikhub.io/438852170e0
- パラメータ:
note_id(string, 必須)root_comment_id(string, 必須):親コメントIDxsec_token(string, 必須)num(integer, 任意):返却件数、デフォルト10cursor(string, 任意):ページングカーソル
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_sub_comments"
2params = {
3 "note_id": "697c0eee000000000a03c308",
4 "root_comment_id": "PARENT_COMMENT_ID",
5 "xsec_token": "ABxxxxxxxxxxxxxx",
6 "num": 10,
7 "cursor": "",
8}
9r = requests.get(url, headers=HEADERS, params=params)
10print(r.json())5. 検索
小紅書の検索は2種類に分かれます:ノート検索 と ユーザー検索。
- ノート検索:App V2 / App V1 / Web V3 の3シリーズすべてで提供されます。App V2 のフィールドが最も豊富です(並び順、ノート種別、期間フィルタ、AIモードなどに対応)。
- ユーザー検索:App V2 と Web V3 のみ提供され、App V1 にはユーザー検索APIがありません。
共通の推奨:まず App V2 シリーズを優先してください。ページ送り時は初回検索で返された
search_id/session_idを忘れずに付与してください(シリーズごとにパラメータ名が少し異なります)。
5.1 ノート検索
総合例:3シリーズを組み合わせてノートを検索
以下は、メインシリーズ(App V2)→ 予備1(App V1)→ 予備2(Web V3) の組み合わせ呼び出しの考え方を示すサンプルコードです。
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9KEYWORD = "美食推荐"
10PAGE = 1
11
12
13# --- Primary: App V2 / 主系列:App V2 ---
14def search_notes_app_v2(keyword: str, page: int = 1):
15 path = "/api/v1/xiaohongshu/app_v2/search_notes"
16 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
17 "keyword": keyword,
18 "page": page,
19 "sort_type": "general",
20 "note_type": "不限",
21 "time_filter": "不限",
22 })
23
24
25# --- Fallback 1: App V1 / 备用 1:App V1 ---
26def search_notes_app_v1(keyword: str, page: int = 1):
27 path = "/api/v1/xiaohongshu/app/search_notes"
28 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
29 "keyword": keyword,
30 "page": page,
31 "sort_type": "general",
32 "filter_note_type": "不限",
33 "filter_note_time": "不限",
34 })
35
36
37# --- Fallback 2: Web V3 / 备用 2:Web V3 ---
38def search_notes_web_v3(keyword: str, page: int = 1):
39 path = "/api/v1/xiaohongshu/web_v3/fetch_search_notes"
40 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
41 "keyword": keyword,
42 "page": page,
43 "sort": "general",
44 "note_type": 0,
45 })
46
47
48def search_notes(keyword: str, page: int = 1):
49 try:
50 r = search_notes_app_v2(keyword, page)
51 if r.ok and r.json().get("code") == 200:
52 return {"source": "app_v2", "data": r.json()}
53 except Exception as e:
54 print("App V2 调用失败:", e)
55
56 try:
57 r = search_notes_app_v1(keyword, page)
58 if r.ok and r.json().get("code") == 200:
59 return {"source": "app_v1", "data": r.json()}
60 except Exception as e:
61 print("App V1 调用失败:", e)
62
63 try:
64 r = search_notes_web_v3(keyword, page)
65 if r.ok and r.json().get("code") == 200:
66 return {"source": "web_v3", "data": r.json()}
67 except Exception as e:
68 print("Web V3 调用失败:", e)
69
70 return None
71
72
73result = search_notes(KEYWORD, PAGE)
74print(result)補足:上記の成功判定(
code == 200)は説明用の書き方です。実際には各シリーズの返却JSONフィールドに基づいて判定してください。ページ送り時は、初回レスポンス内のsearch_id/session_idをそのまま返却先に渡すことを忘れないでください。
5.1.1 [App V2] ノート検索 ⭐ 推奨
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/search_notes - 公式ドキュメント:docs.tikhub.io/420136398e0
- パラメータ:
keyword(string, 必須):検索キーワード、例:"美食推荐"page(integer, 任意):ページ番号、1から開始sort_type(string, 任意):並び順、general(総合、デフォルト)/time_descending(最新)/popularity_descending(いいね数が多い)/comment_descending(コメント数が多い)/collect_descending(お気に入り数が多い)/english_preferred(英語優先)note_type(string, 任意):ノート種別、不限(デフォルト)/视频笔记/普通笔记/直播笔记time_filter(string, 任意):投稿時期、不限(デフォルト)/一天内/一周内/半年内search_id(string, 任意):ページ送り時は初回レスポンスの値を渡すsearch_session_id(string, 任意):ページ送り時は初回レスポンスの値を渡すsource(string, 任意):ソース、デフォルトexplore_feedai_mode(integer, 任意):AIモード、0(オフ、デフォルト)/1(オン)
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/search_notes"
2params = {
3 "keyword": "美食推荐",
4 "page": 1,
5 "sort_type": "general",
6 "note_type": "不限",
7 "time_filter": "不限",
8 # Pass search_id and search_session_id from first response for pagination / 翻页时需要带上首次响应里的 search_id 和 search_session_id
9 # "search_id": "...",
10 # "search_session_id": "...",
11}
12r = requests.get(url, headers=HEADERS, params=params)
13print(r.json())5.1.2 [App V1] ノート検索
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/search_notes - 公式ドキュメント:docs.tikhub.io/310965843e0
- パラメータ:
keyword(string, 必須)page(integer, 必須):ページ番号、1から開始search_id(string, 任意):ページ送り時は初回レスポンスの値を渡すsession_id(string, 任意):ページ送り時は初回レスポンスの値を渡すsort_type(string, 任意):general(デフォルト)/time_descending/popularity_descending/comment_descending/collect_descendingfilter_note_type(string, 任意):不限(デフォルト)/视频笔记/普通笔记filter_note_time(string, 任意):不限(デフォルト)/一天内/一周内/半年内
1url = f"{BASE_URL}/api/v1/xiaohongshu/app/search_notes"
2params = {
3 "keyword": "美食推荐",
4 "page": 1,
5 "sort_type": "general",
6 "filter_note_type": "不限",
7 "filter_note_time": "不限",
8}
9r = requests.get(url, headers=HEADERS, params=params)
10print(r.json())5.1.3 [Web V3] ノート検索
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_search_notes - 公式ドキュメント:docs.tikhub.io/438852171e0
- パラメータ:
keyword(string, 必須)page(integer, 任意):デフォルト1sort(string, 任意):general(総合、デフォルト)/time_descending(最新)/popularity_descending(人気順)note_type(integer, 任意):0=すべて(デフォルト)/1=図文 /2=動画
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_search_notes"
2params = {
3 "keyword": "美食推荐",
4 "page": 1,
5 "sort": "general",
6 "note_type": 0,
7}
8r = requests.get(url, headers=HEADERS, params=params)
9print(r.json())5.2 ユーザー検索
⚠️ 注意:App V1 にはユーザー検索APIがありません。本節は App V2 と Web V3 の2シリーズのみです。
総合例:2シリーズを組み合わせてユーザーを検索
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {
5 "Authorization": "Bearer YOUR_API_KEY",
6 "accept": "application/json",
7}
8
9KEYWORD = "美食博主"
10PAGE = 1
11
12
13# --- Primary: App V2 / 主系列:App V2 ---
14def search_users_app_v2(keyword: str, page: int = 1, search_id: str = ""):
15 path = "/api/v1/xiaohongshu/app_v2/search_users"
16 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
17 "keyword": keyword,
18 "page": page,
19 "search_id": search_id,
20 })
21
22
23# --- Fallback: Web V3 / 备用:Web V3 ---
24def search_users_web_v3(keyword: str, page: int = 1):
25 path = "/api/v1/xiaohongshu/web_v3/fetch_search_users"
26 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
27 "keyword": keyword,
28 "page": page,
29 })
30
31
32def search_users(keyword: str, page: int = 1):
33 try:
34 r = search_users_app_v2(keyword, page)
35 if r.ok and r.json().get("code") == 200:
36 return {"source": "app_v2", "data": r.json()}
37 except Exception as e:
38 print("App V2 调用失败:", e)
39
40 try:
41 r = search_users_web_v3(keyword, page)
42 if r.ok and r.json().get("code") == 200:
43 return {"source": "web_v3", "data": r.json()}
44 except Exception as e:
45 print("Web V3 调用失败:", e)
46
47 return None
48
49
50result = search_users(KEYWORD, PAGE)
51print(result)5.2.1 [App V2] ユーザー検索 ⭐ 推奨
1ページあたり固定で20件返却され、ページングに対応しています。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/search_users - 公式ドキュメント:docs.tikhub.io/420136399e0
- パラメータ:
keyword(string, 必須):検索キーワード、例:"美食博主"page(integer, 任意):ページ番号、1から開始search_id(string, 任意):ページ送り時は初回レスポンスの値を渡すsource(string, 任意):ソース、デフォルトexplore_feed
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/search_users"
2params = {
3 "keyword": "美食博主",
4 "page": 1,
5 # Pass search_id from first response for pagination / 翻页时带上首次响应里的 search_id
6 # "search_id": "...",
7}
8r = requests.get(url, headers=HEADERS, params=params)
9print(r.json())5.2.2 [Web V3] ユーザー検索
- 方法:GET
- パス:
/api/v1/xiaohongshu/web_v3/fetch_search_users - 公式ドキュメント:docs.tikhub.io/438852172e0
- パラメータ:
keyword(string, 必須)page(integer, 任意):デフォルト1
1url = f"{BASE_URL}/api/v1/xiaohongshu/web_v3/fetch_search_users"
2params = {
3 "keyword": "口红",
4 "page": 1,
5}
6r = requests.get(url, headers=HEADERS, params=params)
7print(r.json())6. 話題
小紅書の話題関連APIは2つに分かれます:話題詳細 と 話題下のノート一覧。
⚠️ 重要な注意:
- Web V3 シリーズには話題APIがありません。本節は App V2 と App V1 の2シリーズのみです。
- App V1 の旧API
/api/v1/xiaohongshu/app/get_notes_by_topicは廃止済みです。本節のget_topic_notesを使用してください。- すべてのAPIは
page_id(話題/ハッシュタグID)を一意識別子として使用します。
6.1 話題詳細
App V2 のみが話題詳細API(話題名、閲覧数、議論数、共有情報など)を提供します。App V1 / Web V3 には対応機能がありません。
6.1.1 [App V2] 話題詳細を取得 ⭐ App V2 のみ
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_topic_info - 公式ドキュメント:docs.tikhub.io/420136407e0
- パラメータ:
page_id(string, 必須):話題ページID、例:"5c1cc866febed9000184b7c1"source(string, 任意):ソース、デフォルトnormalnote_id(string, 任意):ソースノートID。ノートから話題へ遷移する場合に指定可能
1import requests
2
3BASE_URL = "https://api.tikhub.io"
4HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
5
6url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_topic_info"
7params = {
8 "page_id": "5c1cc866febed9000184b7c1",
9 "source": "normal",
10 # "note_id": "...", # Optional: pass when navigating from a note / 从笔记跳转过来时可带
11}
12r = requests.get(url, headers=HEADERS, params=params)
13print(r.json())
14# Response contains page_info (name/views/discussions), tabs, share_info, etc. / 返回包含 page_info(名称/浏览量/讨论数)、tabs、share_info 等6.2 話題ノート一覧(話題下のノート)
特定の話題/ハッシュタグ下のノート一覧を取得します。App V2 と App V1 の両方が提供していますが、パラメータとページングフィールドに大きな差があるため、それぞれに合わせた実装が必要です。
総合例:2シリーズを組み合わせて話題ノートを取得
1import requests
2import time
3
4BASE_URL = "https://api.tikhub.io"
5HEADERS = {
6 "Authorization": "Bearer YOUR_API_KEY",
7 "accept": "application/json",
8}
9
10PAGE_ID = "5c1cc866febed9000184b7c1"
11
12
13# --- Primary: App V2 / 主系列:App V2 ---
14def topic_feed_app_v2(page_id: str, sort: str = "trend"):
15 path = "/api/v1/xiaohongshu/app_v2/get_topic_feed"
16 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
17 "page_id": page_id,
18 "sort": sort, # trend (hottest) / time (latest) | trend(最热) / time(最新)
19 })
20
21
22# --- Fallback: App V1 / 备用:App V1 ---
23def topic_notes_app_v1(page_id: str, sort: str = "hot"):
24 path = "/api/v1/xiaohongshu/app/get_topic_notes"
25 return requests.get(f"{BASE_URL}{path}", headers=HEADERS, params={
26 "page_id": page_id,
27 "first_load_time": str(int(time.time() * 1000)), # Millisecond timestamp / 毫秒级时间戳
28 "sort": sort, # hot (general) / time (latest) / trend (hottest) | hot(综合) / time(最新) / trend(最热)
29 })
30
31
32def get_topic_notes(page_id: str):
33 try:
34 r = topic_feed_app_v2(page_id)
35 if r.ok and r.json().get("code") == 200:
36 return {"source": "app_v2", "data": r.json()}
37 except Exception as e:
38 print("App V2 调用失败:", e)
39
40 try:
41 r = topic_notes_app_v1(page_id)
42 if r.ok and r.json().get("code") == 200:
43 return {"source": "app_v1", "data": r.json()}
44 except Exception as e:
45 print("App V1 调用失败:", e)
46
47 return None
48
49
50result = get_topic_notes(PAGE_ID)
51print(result)補足:上記の成功判定(
code == 200)は説明用の書き方です。実際には各シリーズの返却JSONフィールドに基づいて判定してください。ページ送り時は対応するカーソルフィールドをそのまま返却先に渡してください(2シリーズでフィールドが異なります。詳細は下記参照)。
6.2.1 [App V2] 話題ノート一覧を取得 ⭐ 推奨
- 方法:GET
- パス:
/api/v1/xiaohongshu/app_v2/get_topic_feed - 公式ドキュメント:docs.tikhub.io/420136408e0
- パラメータ:
page_id(string, 必須):話題ページIDsort(string, 任意):trend(人気順、デフォルト)/time(最新)cursor_score(string, 任意):ページングカーソルのスコア。ページ送り時は前ページ最後の item のcursor_scoreを渡すlast_note_id(string, 任意):ページ送り時は前ページ最後のノートID(items[-1].id)を渡すlast_note_ct(string, 任意):ページ送り時は前ページ最後のノート作成時刻(items[-1].create_time)を渡すsession_id(string, 任意):セッションID。ページ送り時も同一を維持first_load_time(string, 任意):初回読み込み時刻のタイムスタンプ。ページ送り時も同一を維持source(string, 任意):ソース、デフォルトnormal
1url = f"{BASE_URL}/api/v1/xiaohongshu/app_v2/get_topic_feed"
2
3# First request: pass only page_id and sort / 首次请求:只传 page_id 和 sort
4params = {
5 "page_id": "5c1cc866febed9000184b7c1",
6 "sort": "trend",
7}
8r = requests.get(url, headers=HEADERS, params=params)
9data = r.json()
10print(data)
11
12# Next page: pass through the following fields from the first response / 翻页请求:从首次响应中取下列字段透传
13# items = data["data"]["items"]
14# next_params = {
15# "page_id": "5c1cc866febed9000184b7c1",
16# "sort": "trend",
17# "cursor_score": items[-1]["cursor_score"],
18# "last_note_id": items[-1]["id"],
19# "last_note_ct": items[-1]["create_time"],
20# "session_id": data["data"]["session_id"],
21# "first_load_time": data["data"]["first_load_time"],
22# }6.2.2 [App V1] 話題タグに基づいて作品を取得(廃止済みの get_notes_by_topic の代替)
⚠️ App V1 の旧API
/api/v1/xiaohongshu/app/get_notes_by_topicは廃止済みです。本APIを直接使用してください。
- 方法:GET
- パス:
/api/v1/xiaohongshu/app/get_topic_notes - 公式ドキュメント:docs.tikhub.io/454758056e0
- パラメータ:
page_id(string, 必須):話題タグIDfirst_load_time(string, 必須):初回リクエスト時刻(ミリ秒)、Pythonでの取得:int(time.time() * 1000)sort(string, 任意):hot(総合、デフォルト)/time(最新)/trend(人気順)last_note_ct(string, 任意):ページ送り時は前ページ最後のノートのcreate_timeを渡すlast_note_id(string, 任意):ページ送り時は前ページ最後のノートIDを渡すcursor_score(string, 任意):ページ送り時は前ページ最後のノートのcursor_scoreを渡すsession_id(string, 任意):セッションID。初回はサーバー側で生成され、ページ送り時に返却する
1import time
2
3url = f"{BASE_URL}/api/v1/xiaohongshu/app/get_topic_notes"
4
5# First request / 首次请求
6params = {
7 "page_id": "5c1cc866febed9000184b7c1",
8 "first_load_time": str(int(time.time() * 1000)),
9 "sort": "hot",
10}
11r = requests.get(url, headers=HEADERS, params=params)
12data = r.json()
13print(data)
14
15# Next page: keep page_id / first_load_time unchanged, pass session_id and last_* through / 翻页请求:保持 page_id / first_load_time 不变,把 session_id 和 last_* 透传
16# notes = data["data"]["notes"]
17# next_params = {
18# "page_id": "5c1cc866febed9000184b7c1",
19# "first_load_time": params["first_load_time"],
20# "sort": "hot",
21# "session_id": data["data"]["session_id"],
22# "last_note_id": notes[-1]["id"],
23# "last_note_ct": notes[-1]["note"]["create_time"],
24# "cursor_score": notes[-1].get("cursor_score", ""),
25# }