August 28, 2025
939 Views
Default

Guide d'utilisation de l'API TikHub Xiaohongshu

TikHub propose trois types d’interfaces Xiaohongshu : App, Web v2 et l’ancienne version Web. Parmi elles, la série App est la plus stable, tandis que la série Web v2 bénéficie de la vitesse de correction la plus rapide. Cet article détaille les fonctionnalités, la priorité et les meilleures pratiques de chaque interface, afin de vous aider à choisir l’interface la plus stable et fiable et à améliorer l’efficacité de la collecte de données.

Guide d’utilisation de XHS (Xiaohongshu)

Documentation des interfaces Xiaohongshu organisée à partir de TikHub OpenAPI (https://api.tikhub.io).

Sommaire


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_token est 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.

python
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_id prévaut
python
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
python
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)
python
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_info de 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
python
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.

python
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’extraire user_id et xsec_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.

python
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_id prévaut
python
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)
python
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
python
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)
python
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.

python
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_id prévaut
    • cursor (string, optionnel) : curseur de pagination, laisser vide lors de la première requête ; lors du passage à la page suivante, prendre le notes de la dernière note de la liste cursor dans la réponse précédente (exemple de chemin : $.data.data.notes[-1].cursor)
python
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 le note_id de la dernière note de la page précédente
python
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 le notes de la dernière note de la liste note_id de la page précédente
python
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 contient note_id, type (normal=image / video=vidéo), display_title, desc, liked_count, cover, user, etc.
  • cursor : curseur de la page suivante
  • has_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 pagination
    • num (integer, optionnel) : nombre d’éléments par page, 30 par défaut, maximum 30
python
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).

python
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 note
    • share_text (string, optionnel) : lien de partage (l’un ou l’autre avec note_id, privilégier note_id)
    • cursor (string, optionnel) : curseur de pagination, laisser vide lors de la première requête
    • index (integer, optionnel) : index du commentaire, transmettre 0 lors de la première requête
    • pageArea (string, optionnel) : état de repli, UNFOLDED (par défaut) / FOLDED
    • sort_strategy (string, optionnel) : tri, default / latest_v2 (par défaut) / like_count
python
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
python
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 partage
    • cursor (string, optionnel) : curseur de pagination
python
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

python
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 avec note_id, privilégier note_id)
    • comment_id (string, obligatoire) : ID du commentaire parent
    • cursor (string, optionnel) : laisser vide lors de la première requête, à récupérer dans $.data.cursor lors du passage à la page suivante
    • index (integer, optionnel) : transmettre 1 lors de la première requête, à récupérer dans $.data.cursor lors du passage à la page suivante
python
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 niveau
    • start (string, optionnel) : curseur de pagination, à prendre à partir de l’ID du dernier sous-commentaire de la page précédente (par exemple "6806642d000000001f01991b")
python
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 parent
    • xsec_token (string, obligatoire)
    • num (integer, optionnel) : nombre de résultats renvoyés, par défaut 10
    • cursor (string, optionnel) : curseur de pagination
python
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_id renvoyé 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).

python
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 renvoyer search_id / session_id de 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 de 1
    • sort_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 suivante
    • search_session_id (string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivante
    • source (string, optionnel) : source, par défaut explore_feed
    • ai_mode (integer, optionnel) : mode IA, 0 (désactivé, par défaut) / 1 (activé)
python
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 de 1
    • search_id (string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivante
    • session_id (string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivante
    • sort_type (string, optionnel) : general (par défaut) / time_descending / popularity_descending / comment_descending / collect_descending
    • filter_note_type (string, optionnel) : 不限 (par défaut) / 视频笔记 / 普通笔记
    • filter_note_time (string, optionnel) : 不限 (par défaut) / 一天内 / 一周内 / 半年内
python
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éfaut 1
    • sort (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
python
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

python
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 de 1
    • search_id (string, optionnel) : transmettre la valeur de la première réponse lors du passage à la page suivante
    • source (string, optionnel) : source, par défaut explore_feed
python
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éfaut 1
python
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_topic est obsolète ; veuillez utiliser à la place get_topic_notes de 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éfaut normal
    • note_id (string, optionnel) : ID de la note source, peut être transmis lors d’une redirection depuis une note vers un sujet
python
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

python
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 sujet
    • sort (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 transmettre cursor_score du dernier item de la page précédente
    • last_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 pagination
    • first_load_time (string, optionnel) : horodatage de premier chargement, à conserver identique lors de la pagination
    • source (string, optionnel) : source, par défaut normal
python
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_topic est 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 sujet
    • first_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, transmettre create_time de la dernière note de la page précédente
    • last_note_id (string, optionnel) : lors du passage à la page suivante, transmettre l’ID de la dernière note de la page précédente
    • cursor_score (string, optionnel) : lors du passage à la page suivante, transmettre cursor_score de la dernière note de la page précédente
    • session_id (string, optionnel) : ID de session, généré par le serveur lors de la première requête, à renvoyer lors de la pagination
python
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# }

Enjoyed this article?

Share it with your friends and colleagues!

Default
Last updated: May 15, 2026
相关文章
正在检查服务状态...
Guide d'utilisation de l'API TikHub Xiaohongshu - TikHub.io