Guide d’utilisation de XHS (Xiaohongshu)
Documentation des interfaces Xiaohongshu organisée à partir de TikHub OpenAPI (
https://api.tikhub.io).
Sommaire
- 1. Note unique
- 2. Informations utilisateur
- 3. Contenu de l’utilisateur
- 4. Commentaires
- 5. Recherche
- 6. Sujets
Notes générales
a. Stratégie d’appel : utiliser plusieurs séries en combinaison (important)
L’interface Xiaohongshu la plus stable à l’heure actuelle est la série App V2. Il est fortement recommandé à tous les utilisateurs d’adopter une stratégie combinant "série principale + 1 à 2 séries de secours", en utilisant 2 à 3 séries ensemble afin d’améliorer la disponibilité globale du service.
b. Priorité d’appel : App V2 (recommandé) > App V1 (solution de repli) > Web V3 (troisième option)
App V2 est la série principale recommandée ; c’est actuellement la plus stable et celle qui fournit les données les plus complètes, elle doit donc être privilégiée. App V1 a une structure de champs proche de App V2 et convient comme premier secours. Web V3 est un canal Web de secours ouvert aux utilisateurs professionnels ; il nécessite
xsec_token(extrait à partir d’un lien de partage), mais le volume de données renvoyé est inférieur à celui de App V2 / App V1. Ainsi, même pour les utilisateurs professionnels, il est conseillé de combiner raisonnablement plusieurs séries et de ne pas utiliser uniquement Web V3. Web V2 / Web ne propose qu’une petite partie des interfaces et sa stabilité n’est pas forcément garantie ; il n’est pas recommandé comme solution principale, et ne doit servir qu’en complément lorsque les trois séries précédentes ne répondent pas aux besoins.
c. Conseil en une phrase : ne misez pas tout sur une seule série. En production, il est recommandé de configurer au moins 2 séries en principal/secondaire ; pour les utilisateurs professionnels utilisant Web V3, ajoutez App V2 / App V1 afin de compléter les dimensions de données.
d. Indication sur les champs de retour : les interfaces de la série App (App V2 / App V1) ont des structures similaires, et les noms de champs peuvent pratiquement se correspondre ; en revanche, les interfaces de la série Web (Web V3 / Web V2 / Web) renvoient des structures JSON différentes, et les noms de champs, niveaux d’imbrication et dimensions de données peuvent varier. Lors de l’utilisation, veuillez impérativement vérifier d’abord les champs JSON réellement renvoyés par chaque interface, puis effectuer l’analyse et le mapping.
1. Note unique
Les notes Xiaohongshu se divisent en deux catégories : notes image (notes illustrées) et notes vidéo. La série App V2 fournit des points de terminaison distincts pour les deux types, avec les données les plus complètes ; Web V3 traite les deux types via la même interface, en les distinguant par les champs de réponse.
Recommandation générale : privilégier la série App V2 ; pour les utilisateurs professionnels, lorsque
xsec_tokenest disponible, Web V3 peut être utilisé en combinaison.
Exemple complet : combinaison des trois séries pour obtenir les détails d’une note unique
Ci-dessous, un exemple de code illustratif montrant la logique d’appel combinée série principale (App V2) → secours 1 (App V1) → secours 2 (Web V3), en essayant successivement selon la priorité ; si la première réussit, on retourne immédiatement le résultat, sinon on passe au niveau suivant.
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)Astuce : la condition de succès ci-dessus (
code == 200) est une écriture illustrative ; en pratique, veuillez juger selon les champs JSON renvoyés par chaque série. Les structures de retour diffèrent d’une série à l’autre, il est recommandé d’écrire une logique d’analyse séparée pour chaque série.
1.1 Note image (note illustrée)
1.1.1 [App V2] Obtenir les détails d’une note illustrée ⭐ Recommandé
Obtenir les données complètes des détails d’une note illustrée (adresse des images, titre, texte, tags, données d’interaction, etc.).
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_image_note_detail - Documentation officielle : docs.tikhub.io/420136391e0
- Paramètres :
note_id(string, optionnel) : ID de la note, par exemple"697c0eee000000000a03c308"share_text(string, optionnel) : lien de partage Xiaohongshu (prise en charge des versions APP / Web)- L’un ou l’autre ; privilégier
note_id; si les deux sont fournis,note_idprévaut
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] Obtenir les informations de la note V1 (image uniquement, sans lien de téléchargement vidéo)
L’interface de note de App V1 est uniquement applicable aux notes illustrées. La réponse ne contient pas de lien de téléchargement vidéo, donc ne l’utilisez pas pour les notes vidéo ; pour les notes vidéo, utilisez plutôt get_video_note_detail de App V2.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_note_info - Documentation officielle : docs.tikhub.io/310965839e0
- Paramètres :
note_id(string, optionnel)share_text(string, optionnel)- L’un ou l’autre, privilégier
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] Obtenir les détails de la note (commun image/vidéo)
Point de terminaison Web V3, commun aux notes image et vidéo. Nécessite xsec_token (extrait du lien de partage, voir l’« interface d’outils associée » ci-dessus).
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_note_detail - Documentation officielle : docs.tikhub.io/438852168e0
- Paramètres :
note_id(string, obligatoire)xsec_token(string, obligatoire)
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 Note vidéo
N’utilisez pas
get_note_infode App V1 pour les notes vidéo ; cette interface ne renvoie pas de lien de téléchargement vidéo. Veuillez utiliser App V2 ou Web V3 ci-dessous.
1.2.1 [App V2] Obtenir les détails d’une note vidéo ⭐ Recommandé
Obtenir les données complètes des détails d’une note vidéo (adresse de la vidéo, couverture, durée, titre, texte, données d’interaction, etc.).
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_video_note_detail - Documentation officielle : docs.tikhub.io/420136392e0
- Paramètres :
note_id(string, optionnel) : par exemple"697c0eee000000000a03c308"share_text(string, optionnel)- L’un ou l’autre, privilégier
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] Obtenir les détails de la note (commun aux vidéos)
Même point de terminaison que pour les notes illustrées, à appeler avec note_id + xsec_token.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_note_detail - Documentation officielle : 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. Informations utilisateur
Obtenir les informations publiques d’un utilisateur Xiaohongshu via user_id (pseudo, avatar, bio, nombre d’abonnés, nombre d’abonnements, nombre de notes, etc.). Les trois séries fournissent une interface d’informations utilisateur ; App V2 a les champs les plus complets, App V1 / Web V3 conviennent comme secours.
Recommandation générale : privilégier la série App V2 ; si vous n’avez que
user_id, vous pouvez aussi passer par App V1 / Web V3.
💡 Vous ne savez pas comment obtenir
user_id? Vous pouvez d’abord utiliser cette interface d’outil/api/v1/xiaohongshu/app/get_user_id_and_xsec_token(voir la documentation officielle), en y passant n’importe quel lien de partage de page d’accueil utilisateur Xiaohongshu (lien long ou court), afin d’extraireuser_idetxsec_token, puis les fournir à l’interface d’informations utilisateur ci-dessous. Voir 2.3 ci-dessous.
Exemple complet : combinaison des trois séries pour obtenir les informations utilisateur
Ci-dessous, un exemple de code illustratif montrant la logique d’appel combinée série principale (App V2) → secours 1 (App V1) → secours 2 (Web V3), en essayant successivement selon la priorité ; si la première réussit, on retourne immédiatement le résultat, sinon on passe au niveau suivant.
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)Astuce : la condition de succès ci-dessus (
code == 200) est une écriture illustrative ; en pratique, veuillez juger selon les champs JSON renvoyés par chaque série. Les structures de retour diffèrent d’une série à l’autre, il est recommandé d’écrire une logique d’analyse séparée pour chaque série.
2.1 [App V2] Obtenir les informations utilisateur ⭐ Recommandé
Obtenir les informations détaillées d’un utilisateur spécifié, y compris le pseudo, l’avatar, la bio, le nombre d’abonnés, le nombre d’abonnements, le nombre de notes, etc.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_user_info - Documentation officielle : docs.tikhub.io/420136395e0
- Paramètres :
user_id(string, optionnel) : ID utilisateur, par exemple"61b46d790000000010008153"share_text(string, optionnel) : lien de partage utilisateur Xiaohongshu (prise en charge des versions APP / Web)- L’un ou l’autre ; privilégier
user_id; si les deux sont fournis,user_idprévaut
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] Obtenir les informations utilisateur
Interface d’informations utilisateur de App V1.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_user_info - Documentation officielle : docs.tikhub.io/310965845e0
- Paramètres :
user_id(string, obligatoire)
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] Outil associé : extraire user_id et xsec_token à partir d’un lien de partage utilisateur
Si vous n’avez qu’un lien de partage de page d’accueil utilisateur (les liens longs et courts sont pris en charge), vous pouvez d’abord utiliser cette interface pour extraire user_id et xsec_token, puis appeler l’interface d’informations utilisateur ci-dessus.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_user_id_and_xsec_token - Documentation officielle : docs.tikhub.io/364605901e0
- Paramètres :
share_link(string, obligatoire) : lien de partage utilisateur Xiaohongshu
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] Obtenir les informations utilisateur
Interface de profil public utilisateur de Web V3, ne nécessitant que user_id.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_user_info - Documentation officielle : docs.tikhub.io/438852177e0
- Paramètres :
user_id(string, obligatoire)
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. Contenu de l’utilisateur
Récupérer la liste des notes publiées par cet utilisateur via user_id (mélange image/vidéo), toutes les interfaces utilisent la pagination par curseur (cursor). La série App V2 fournit en plus une interface « liste des notes favorites publiques de l’utilisateur » (faved notes), tandis que App V1 / Web V3 ne couvrent que les « notes publiées ».
Recommandation générale : privilégier la série App V2 ; si vous n’avez que
user_id, vous pouvez aussi passer par App V1 / Web V3.💡 Vous ne savez pas comment obtenir
user_id? Référez-vous à l’interface d’outil de 2.3 ci-dessus (documentation officielle).
Exemple complet : combinaison des trois séries pour obtenir les notes publiées d’un utilisateur
Ci-dessous, un exemple de code illustratif montrant la logique d’appel combinée série principale (App V2) → secours 1 (App V1) → secours 2 (Web V3), en essayant successivement selon la priorité ; si la première réussit, on retourne immédiatement le résultat, sinon on passe au niveau suivant.
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)Astuce : la condition de succès ci-dessus (
code == 200) est une écriture illustrative ; en pratique, veuillez juger selon les champs JSON renvoyés par chaque série. Les structures de retour diffèrent d’une série à l’autre, il est recommandé d’écrire une logique d’analyse séparée pour chaque série.
3.1 [App V2] Obtenir la liste des notes publiées par l’utilisateur ⭐ Recommandé
Obtenir la liste des notes publiées par l’utilisateur spécifié, avec pagination par curseur.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_user_posted_notes - Documentation officielle : docs.tikhub.io/420136396e0
- Paramètres :
user_id(string, optionnel) : ID utilisateur, par exemple"61b46d790000000010008153"share_text(string, optionnel) : lien de partage utilisateur Xiaohongshu (prise en charge des versions APP / Web)- L’un ou l’autre ; privilégier
user_id; si les deux sont fournis,user_idprévaut cursor(string, optionnel) : curseur de pagination, laisser vide lors de la première requête ; lors du passage à la page suivante, prendre lenotesde la dernière note de la listecursordans la réponse précédente (exemple de chemin :$.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] Obtenir la liste des notes favorites publiques de l’utilisateur (App V2 uniquement)
Obtenir la liste des notes favorites publiques de l’utilisateur spécifié (ce ne sont pas les notes qu’il a publiées lui-même, mais le contenu qu’il a ajouté à ses favoris), avec pagination par curseur. Cette interface est uniquement fournie par App V2 ; App V1 / Web V3 ne disposent pas de cette capacité.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_user_faved_notes - Documentation officielle : docs.tikhub.io/420136397e0
- Paramètres :
user_id(string, optionnel) : par exemple"5a8cf39111be10466d285d6b"share_text(string, optionnel)- L’un ou l’autre, privilégier
user_id cursor(string, optionnel) : curseur de pagination, laisser vide lors de la première requête ; lors du passage à la page suivante, transmettre lenote_idde la dernière note de la page précédente
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] Obtenir la liste des contenus de l’utilisateur
Interface de contenu utilisateur de App V1, couvrant uniquement les notes publiées, avec pagination par curseur.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_user_notes - Documentation officielle : docs.tikhub.io/310965846e0
- Paramètres :
user_id(string, obligatoire)cursor(string, optionnel) : laisser vide lors de la première requête ; lors du passage à la page suivante, prendre lenotesde la dernière note de la listenote_idde la page précédente
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())Structure de retour (champs clés) :
notes[]: tableau de notes, chaque élément contientnote_id,type(normal=image /video=vidéo),display_title,desc,liked_count,cover,user, etc.cursor: curseur de la page suivantehas_more: indique s’il reste davantage de données
3.4 [Web V3] Obtenir la liste des notes de l’utilisateur
Interface de contenu utilisateur de Web V3, avec pagination par curseur, permettant de spécifier le nombre d’éléments par page (maximum 30).
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_user_notes - Documentation officielle : docs.tikhub.io/438852178e0
- Paramètres :
user_id(string, obligatoire)cursor(string, optionnel) : curseur de paginationnum(integer, optionnel) : nombre d’éléments par page, 30 par défaut, maximum 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. Commentaires
Les commentaires Xiaohongshu se divisent en deux niveaux : commentaires de premier niveau (liste des commentaires sous la note) et commentaires de second niveau (réponses / liste des sous-commentaires sous un commentaire donné). Les trois séries fournissent ces deux niveaux d’interface ; App V2 a les champs les plus riches, App V1 / Web V3 conviennent comme secours.
Recommandation générale : privilégier la série App V2 ; l’interface Web V3 nécessite
xsec_token(extrait à partir d’un lien de partage, voir l’exemple complet de 1. Note unique / l’interface d’outil de 2.3).
4.1 Commentaires de premier niveau (liste des commentaires sous la note)
Exemple complet : combinaison des trois séries pour obtenir les commentaires de premier niveau
Ci-dessous, un exemple de code illustratif montrant la logique d’appel combinée série principale (App V2) → secours 1 (App V1) → secours 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)Astuce : la condition de succès ci-dessus (
code == 200) est une écriture illustrative ; en pratique, veuillez juger selon les champs JSON renvoyés par chaque série.
4.1.1 [App V2] Obtenir la liste des commentaires de la note ⭐ Recommandé
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_note_comments - Documentation officielle : docs.tikhub.io/420136394e0
- Paramètres :
note_id(string, optionnel) : ID de la noteshare_text(string, optionnel) : lien de partage (l’un ou l’autre avecnote_id, privilégiernote_id)cursor(string, optionnel) : curseur de pagination, laisser vide lors de la première requêteindex(integer, optionnel) : index du commentaire, transmettre0lors de la première requêtepageArea(string, optionnel) : état de repli,UNFOLDED(par défaut) /FOLDEDsort_strategy(string, optionnel) : tri,default/latest_v2(par défaut) /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] Obtenir les commentaires de la note
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_note_comments - Documentation officielle : docs.tikhub.io/310965840e0
- Paramètres :
note_id(string, obligatoire)start(string, optionnel) : curseur de pagination, laisser vide lors de la première requête ; prend en charge deux formats — format simple (par ex."682b0133000000001c03618d") ou format JSON (par ex.{"cursor":"...","index":2,"pageArea":"UNFOLDED"})sort_strategy(integer, optionnel) :1-tri par défaut (par défaut) /2-commentaires les plus récents
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] Obtenir les commentaires de la note
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_note_comments - Documentation officielle : docs.tikhub.io/438852169e0
- Paramètres :
note_id(string, obligatoire)xsec_token(string, obligatoire) : peut être extrait du lien de partagecursor(string, optionnel) : curseur de pagination
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 Commentaires de second niveau (sous-commentaires / liste des réponses)
Obtenir toutes les réponses sous un commentaire de premier niveau donné ; les trois séries couvrent également ce cas. Attention, dans Web V3, le paramètre s’appelle root_comment_id, alors que dans les deux autres séries il s’appelle comment_id.
Exemple complet : combinaison des trois séries pour obtenir les sous-commentaires
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] Obtenir la liste des commentaires de second niveau de la note ⭐ Recommandé
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_note_sub_comments - Documentation officielle : docs.tikhub.io/420748830e0
- Paramètres :
note_id(string, optionnel)share_text(string, optionnel) (l’un ou l’autre avecnote_id, privilégiernote_id)comment_id(string, obligatoire) : ID du commentaire parentcursor(string, optionnel) : laisser vide lors de la première requête, à récupérer dans$.data.cursorlors du passage à la page suivanteindex(integer, optionnel) : transmettre1lors de la première requête, à récupérer dans$.data.cursorlors du passage à la page suivante
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] Obtenir les sous-commentaires
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_sub_comments - Documentation officielle : docs.tikhub.io/310965841e0
- Paramètres :
note_id(string, obligatoire)comment_id(string, obligatoire) : ID du commentaire de premier niveaustart(string, optionnel) : curseur de pagination, à prendre à partir de l’ID du dernier sous-commentaire de la page précédente (par exemple"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] Obtenir les sous-commentaires
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_sub_comments - Documentation officielle : docs.tikhub.io/438852170e0
- Paramètres :
note_id(string, obligatoire)root_comment_id(string, obligatoire) : ID du commentaire parentxsec_token(string, obligatoire)num(integer, optionnel) : nombre de résultats renvoyés, par défaut10cursor(string, optionnel) : curseur de pagination
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. Recherche
La recherche Xiaohongshu se divise en deux catégories : recherche de notes et recherche d’utilisateurs.
- Recherche de notes : les trois séries App V2 / App V1 / Web V3 la proposent, App V2 ayant les champs les plus riches (prise en charge du tri, du type de note, du filtrage temporel, du mode IA, etc.).
- Recherche d’utilisateurs : seules App V2 et Web V3 la proposent, App V1 ne dispose pas d’interface de recherche d’utilisateurs.
Recommandation générale : privilégier la série App V2 ; lors de la pagination, n’oubliez pas de transmettre
search_id/session_idrenvoyé lors de la première recherche (les noms de paramètres diffèrent légèrement selon les séries).
5.1 Rechercher des notes
Exemple complet : combinaison des trois séries pour rechercher des notes
Ci-dessous, un exemple de code illustratif montrant la logique d’appel combinée série principale (App V2) → secours 1 (App V1) → secours 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)Astuce : la condition de succès ci-dessus (
code == 200) est une écriture illustrative ; en pratique, veuillez juger selon les champs JSON renvoyés par chaque série. Lors de la pagination, n’oubliez pas de renvoyersearch_id/session_idde la première réponse.
5.1.1 [App V2] Rechercher des notes ⭐ Recommandé
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/search_notes - Documentation officielle : docs.tikhub.io/420136398e0
- Paramètres :
keyword(string, obligatoire) : mot-clé de recherche, par exemple"美食推荐"page(integer, optionnel) : numéro de page, à partir de1sort_type(string, optionnel) : tri,general(global, par défaut) /time_descending(plus récent) /popularity_descending(plus de likes) /comment_descending(plus de commentaires) /collect_descending(plus de favoris) /english_preferred(anglais prioritaire)note_type(string, optionnel) : type de note,不限(par défaut) /视频笔记/普通笔记/直播笔记time_filter(string, optionnel) : date de publication,不限(par défaut) /一天内/一周内/半年内search_id(string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivantesearch_session_id(string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivantesource(string, optionnel) : source, par défautexplore_feedai_mode(integer, optionnel) : mode IA,0(désactivé, par défaut) /1(activé)
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] Rechercher des notes
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/search_notes - Documentation officielle : docs.tikhub.io/310965843e0
- Paramètres :
keyword(string, obligatoire)page(integer, obligatoire) : numéro de page, à partir de1search_id(string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivantesession_id(string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivantesort_type(string, optionnel) :general(par défaut) /time_descending/popularity_descending/comment_descending/collect_descendingfilter_note_type(string, optionnel) :不限(par défaut) /视频笔记/普通笔记filter_note_time(string, optionnel) :不限(par défaut) /一天内/一周内/半年内
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] Rechercher des notes
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_search_notes - Documentation officielle : docs.tikhub.io/438852171e0
- Paramètres :
keyword(string, obligatoire)page(integer, optionnel) : par défaut1sort(string, optionnel) :general(global, par défaut) /time_descending(plus récent) /popularity_descending(plus populaire)note_type(integer, optionnel) :0=tout (par défaut) /1=image /2=vidéo
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 Rechercher des utilisateurs
⚠️ Attention : App V1 ne dispose pas d’interface de recherche d’utilisateurs ; cette section ne concerne que les séries App V2 et Web V3.
Exemple complet : combinaison des deux séries pour rechercher des utilisateurs
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] Rechercher des utilisateurs ⭐ Recommandé
Renvoie 20 résultats par page de manière fixe, avec prise en charge de la pagination.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/search_users - Documentation officielle : docs.tikhub.io/420136399e0
- Paramètres :
keyword(string, obligatoire) : mot-clé de recherche, par exemple"美食博主"page(integer, optionnel) : numéro de page, à partir de1search_id(string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivantesource(string, optionnel) : source, par défautexplore_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] Rechercher des utilisateurs
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/web_v3/fetch_search_users - Documentation officielle : docs.tikhub.io/438852172e0
- Paramètres :
keyword(string, obligatoire)page(integer, optionnel) : par défaut1
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. Sujets
Les interfaces liées aux sujets Xiaohongshu se divisent en deux parties : détails du sujet et liste des notes sous le sujet.
⚠️ Important :
- La série Web V3 ne dispose pas d’interface de sujet ; cette section ne concerne que les séries App V2 et App V1.
- L’ancienne interface de App V1
/api/v1/xiaohongshu/app/get_notes_by_topicest obsolète ; veuillez utiliser à la placeget_topic_notesde cette section.- Toutes les interfaces utilisent
page_id(ID du sujet / tag du sujet) comme identifiant unique.
6.1 Détails du sujet
Seule App V2 fournit l’interface de détails du sujet (nom du sujet, nombre de vues, nombre de discussions, informations de partage, etc.). App V1 / Web V3 ne disposent pas de cette capacité.
6.1.1 [App V2] Obtenir les détails du sujet ⭐ App V2 uniquement
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_topic_info - Documentation officielle : docs.tikhub.io/420136407e0
- Paramètres :
page_id(string, obligatoire) : ID de la page du sujet, par exemple"5c1cc866febed9000184b7c1"source(string, optionnel) : source, par défautnormalnote_id(string, optionnel) : ID de la note source, peut être transmis lors d’une redirection depuis une note vers un sujet
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 Liste des notes du sujet (notes sous le sujet)
Obtenir la liste des notes sous un certain sujet / tag de sujet. App V2 et App V1 la fournissent toutes deux, mais les paramètres et les champs de pagination diffèrent beaucoup et nécessitent une adaptation séparée.
Exemple complet : combinaison des deux séries pour obtenir les notes du sujet
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)Astuce : la condition de succès ci-dessus (
code == 200) est une écriture illustrative ; en pratique, veuillez juger selon les champs JSON renvoyés par chaque série. Lors de la pagination, n’oubliez pas de renvoyer le champ curseur correspondant (les champs diffèrent entre les deux séries, voir ci-dessous).
6.2.1 [App V2] Obtenir la liste des notes du sujet ⭐ Recommandé
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app_v2/get_topic_feed - Documentation officielle : docs.tikhub.io/420136408e0
- Paramètres :
page_id(string, obligatoire) : ID de la page du sujetsort(string, optionnel) :trend(plus populaire, par défaut) /time(plus récent)cursor_score(string, optionnel) : score du curseur de pagination, lors du passage à la page suivante transmettrecursor_scoredu dernier item de la page précédentelast_note_id(string, optionnel) : lors du passage à la page suivante, transmettre l’ID de la dernière note de la page précédente (items[-1].id)last_note_ct(string, optionnel) : lors du passage à la page suivante, transmettre l’heure de création de la dernière note de la page précédente (items[-1].create_time)session_id(string, optionnel) : ID de session, à conserver identique lors de la paginationfirst_load_time(string, optionnel) : horodatage de premier chargement, à conserver identique lors de la paginationsource(string, optionnel) : source, par défautnormal
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] Obtenir les contenus via le tag du sujet (remplace l’interface obsolète get_notes_by_topic)
⚠️ L’ancienne interface de App V1
/api/v1/xiaohongshu/app/get_notes_by_topicest obsolète ; veuillez utiliser directement cette interface.
- Méthode : GET
- Chemin :
/api/v1/xiaohongshu/app/get_topic_notes - Documentation officielle : docs.tikhub.io/454758056e0
- Paramètres :
page_id(string, obligatoire) : ID du tag du sujetfirst_load_time(string, obligatoire) : horodatage de la première requête (en millisecondes), récupération Python :int(time.time() * 1000)sort(string, optionnel) :hot(global, par défaut) /time(plus récent) /trend(plus populaire)last_note_ct(string, optionnel) : lors du passage à la page suivante, transmettrecreate_timede la dernière note de la page précédentelast_note_id(string, optionnel) : lors du passage à la page suivante, transmettre l’ID de la dernière note de la page précédentecursor_score(string, optionnel) : lors du passage à la page suivante, transmettrecursor_scorede la dernière note de la page précédentesession_id(string, optionnel) : ID de session, généré par le serveur lors de la première requête, à renvoyer lors de la pagination
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# }