Un spécialiste du marketing peut trouver sur TikTok une vidéo dont l’auteur parle du produit recherché, mais transformer ce signal en contact vérifiable est plus difficile : le nom de l’auteur sur TikTok peut différer de celui utilisé sur IG, et le profil peut être privé ou n’avoir aucun lien confirmé avec cette personne. Le résultat pratique n’est pas une liste automatique de « prospects prêts à contacter », mais un tableau de vérification : vidéo d’origine, auteur TikTok, nom d’utilisateur IG présumé, réponse de l’API et statut pour la suite de l’examen.
Voici un processus Python minimal pour cette tâche. Il recherche des vidéos publiques à partir d’une expression clé, extrait les champs disponibles sur l’auteur et vérifie les profils IG uniquement si vous disposez déjà d’un nom d’utilisateur justifié à contrôler. L’API peut récupérer les données d’un profil à partir d’un nom d’utilisateur ; elle ne détermine pas automatiquement que deux comptes appartiennent à la même personne.
Quel résultat vaut-il la peine d’automatiser ?
Imaginez une équipe qui vend du matériel pour préparer du café à la maison et souhaite trouver des auteurs de vidéos publiques sur la préparation de boissons. La recherche manuelle est utile pour découvrir le contenu, mais lorsqu’on la répète, il devient difficile de conserver la vidéo qui a mené au contact, la provenance du nom de profil et ce qui a précisément été vérifié.

Le pipeline distingue trois actions : rechercher des vidéos sur TikTok, enregistrer les données observées et vérifier le profil IG présumé. L’analyste peut ainsi ouvrir un seul fichier CSV et retracer l’origine de chaque candidat. Les champs IG ne doivent être remplis qu’après avoir trouvé le nom d’utilisateur dans une description publique, un lien de l’auteur ou après vérification humaine à partir d’autres éléments accessibles.
Cette méthode convient à une agence, une équipe de recherche ou un spécialiste du marketing interne qui a besoin d’une petite liste reproductible pour une qualification manuelle. Elle conserve le contexte de la découverte sans transformer des noms ressemblants en affirmation d’identité.
Quelles données peut-on obtenir ?
La route TikTok documentée /searchVideo accepte le paramètre obligatoire keyword ; les paramètres count, date_posted, sort_by, region et cursor sont également disponibles. Les réponses observées comprennent notamment l’identifiant de la vidéo, sa description, sa date de publication, son lien, les données de l’auteur et les compteurs publics d’interactions. Les champs réellement disponibles peuvent varier ; le code ci-dessous utilise donc une lecture avec valeurs vides par défaut.
Pour IG, ce scénario utilise la route GET documentée /v1/user/by/username, avec le paramètre username. La réponse peut contenir le nom d’utilisateur, le nom affiché, le statut privé ou vérifié, le nombre de publications, d’abonnés et d’abonnements, ainsi que la biographie. Il s’agit d’informations que le spécialiste peut examiner pour prendre une décision, et non d’une note attribuée à l’auteur.
La documentation officielle de l’API TikTok décrit les paramètres de recherche, tandis que la documentation de l’API IG décrit les méthodes et paramètres IG. Les définitions intégrées de l’API jsonscraper précisent également les routes, les noms des paramètres et les formes de réponse observées ; les vérifications citées datent du 25 octobre 2026.
Configurez les clés et la liste des candidats
Enregistrez les clés API dans les variables d’environnement : JSONSCRAPER_TIKTOK_LICENSE_KEY et JSONSCRAPER_INSTAGRAM_LICENSE_KEY. Ne les insérez pas dans le code source, un fichier CSV ou les journaux des tâches. Installez la bibliothèque de requêtes avec python -m pip install requests. L’exemple suivant est conçu pour Python 3.8 ou une version ultérieure.
import csv
import os
import sys
from urllib.parse import urlencode
import requests
TIKTOK_KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
INSTAGRAM_KEY = os.environ.get("JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
if not TIKTOK_KEY or not INSTAGRAM_KEY:
sys.exit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY and JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
def get_json(base_url, path, params):
response = requests.get(
f"{base_url}{path}",
params=params,
timeout=30,
)
response.raise_for_status()
return response.json()
def extract_videos(payload):
"""Handle both observed TikTok search result locations."""
if payload.get("status") != "ok":
raise RuntimeError(f"TikTok API status: {payload.get('status')}")
tiktok = payload.get("tiktok") or {}
videos = list(tiktok.get("aweme_list") or [])
for item in tiktok.get("search_item_list") or []:
video = item.get("aweme_info")
if video:
videos.append(video)
unique = {}
for video in videos:
video_id = video.get("aweme_id")
if video_id:
unique[video_id] = video
return list(unique.values())
keyword = "домашний кофе"
tiktok_payload = get_json(
"https://tiktok.evelode.com",
"/searchVideo",
{
"license_key": TIKTOK_KEY,
"keyword": keyword,
"count": 20,
"date_posted": "this-month",
"sort_by": "relevance",
},
)
rows = []
for video in extract_videos(tiktok_payload):
author = video.get("author") or {}
stats = video.get("statistics") or {}
rows.append({
"tiktok_video_id": video.get("aweme_id", ""),
"tiktok_url": video.get("share_url", ""),
"video_description": video.get("desc", ""),
"created_at": video.get("create_time", ""),
"tiktok_username": author.get("unique_id", ""),
"tiktok_author_name": author.get("nickname", ""),
"tiktok_followers": author.get("follower_count", ""),
"views": stats.get("play_count", ""),
"likes": stats.get("digg_count", ""),
"instagram_username": "",
"instagram_status": "not checked",
"instagram_followers": "",
"instagram_is_private": "",
"manual_match_review": "required",
})
# Remplissez ce dictionnaire uniquement avec des noms d’utilisateur
# trouvés séparément et ajoutés après vérification manuelle de la source.
verified_instagram_usernames = {
# "tiktok_video_id": "instagram_username"
}
for row in rows:
username = verified_instagram_usernames.get(row["tiktok_video_id"])
if not username:
continue
ig_payload = get_json(
"https://ig.jsonscraper.com",
"/v1/user/by/username",
{
"license_key": INSTAGRAM_KEY,
"username": username,
},
)
if ig_payload.get("status") != "ok":
row["instagram_status"] = "api status: " + str(ig_payload.get("status"))
continue
profile = ig_payload.get("ig") or {}
row["instagram_username"] = profile.get("username", username)
row["instagram_status"] = "profile returned"
row["instagram_followers"] = profile.get("follower_count", "")
row["instagram_is_private"] = profile.get("is_private", "")
row["manual_match_review"] = "check relationship manually"
if rows:
with open("social_lead_checks.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
else:
print("No video rows returned for this query.")
Pourquoi le gestionnaire tient-il compte de deux structures de réponse ?
Les résultats de recherche TikTok peuvent se trouver à deux endroits : tiktok.aweme_list et tiktok.search_item_list[].aweme_info. Dans une réponse de recherche observée, la première liste pouvait être vide alors que des éléments figuraient dans la seconde. L’exemple réunit donc les deux sources et supprime les doublons à partir de aweme_id. Il vérifie d’abord le status externe, puis lit l’objet tiktok.

Le code n’enregistre que les champs réellement présents dans la réponse. Une valeur vide signifie que le champ était absent de l’objet reçu ; elle ne doit pas être interprétée comme une valeur nulle. Il est utile de conserver les liens et les descriptions des vidéos avec les métriques : sans cela, le tableau perd son contexte d’origine lorsqu’on le consulte plus tard.
Ajoutez la pagination uniquement si nécessaire
L’exemple interroge une seule page et traite uniquement les éléments renvoyés. Pour poursuivre la recherche, la documentation prévoit le paramètre cursor ; sa valeur est récupérée dans la réponse précédente. Conservez le curseur comme une valeur opaque et transmettez-le sans effectuer de calculs vous-même. Arrêtez la boucle lorsque la réponse indique qu’il n’y a pas de suite ou lorsque la limite définie par l’équipe est atteinte. La pagination élargit l’ensemble des résultats renvoyés, mais ne justifie pas de le présenter comme un recensement exhaustif de toutes les publications sur le sujet.
Avant d’ajouter une extraction automatisée, vérifiez la réponse réelle avec votre clé et choisissez un nombre raisonnable de pages. Conservez le JSON d’origine à côté de la ligne normalisée ou séparément, avec la date d’exécution : vous pourrez ainsi déterminer si un champ de réponse a changé et retraiter la collecte si le schéma évolue.
Comment utiliser le CSV pour la qualification
Dans le tableau, vous pouvez filtrer les lignes selon la présence d’un lien vidéo, d’une description, d’un auteur et d’un profil IG renseigné. Pour organiser la première vérification, des statuts simples sont utiles : « vidéo trouvée », « nom d’utilisateur IG trouvé », « profil renvoyé », « lien entre les comptes vérifié par une personne » et « exclu ». Ces statuts décrivent l’avancement de la vérification, et non la qualité ou les intentions de l’auteur.
Si la tâche exige un rapport reproductible, exécutez le script selon un calendrier et ajoutez une colonne distincte pour la date d’obtention des données. La comparaison des instantanés montrera alors ce qui a changé entre les exécutions dans les champs disponibles, par exemple le nombre d’abonnés du profil. Les métriques TikTok et IG doivent être conservées séparément, avec la plateforme et l’heure d’observation indiquées : il s’agit de contextes et de réponses API différents.
Pour un flux plus important, remplacez le CSV par une base de données dont la clé primaire combine la plateforme et l’identifiant de la vidéo. Conservez la requête textuelle d’origine, l’heure de collecte et la réponse brute. Il vaut mieux envoyer une notification Slack ou transmettre une ligne au CRM après confirmation manuelle du lien entre les profils, et non dès qu’un nom correspond.
Limites d’interprétation et utilisation sécurisée
Une recherche par expression clé renvoie les résultats trouvés par l’API, et non la liste complète des publications. Le nombre de vues, de mentions J’aime et d’abonnés est un instantané de la réponse au moment de la requête. Il peut servir à trier une liste de travail et à effectuer une vérification ultérieure, mais ne confirme à lui seul ni une intention commerciale, ni une audience, ni un consentement à être contacté.
Confirmez le lien entre les profils à partir d’indices publics explicites et consignez qui a effectué la vérification et à quel moment. Si le nom d’utilisateur IG provient d’un tableau tiers sans source vérifiable, laissez le statut « à vérifier ». Un profil privé ou des données manquantes doivent apparaître comme un résultat distinct de la vérification, sans tentative de combler les lacunes par des suppositions.
Utilisez les clés dans le coffre de secrets de l’environnement de travail, limitez l’accès aux exports et définissez une durée de conservation adaptée à l’objectif de la recherche. Ne transmettez au CRM que les champs nécessaires au travail manuel ultérieur et respectez les règles applicables des plateformes ainsi que les exigences relatives au traitement des données.
Résultat final
Après exécution, un CSV contiendra la liste des vidéos trouvées, leurs auteurs et les métriques disponibles, ainsi que des champs distincts pour la vérification IG. Le script peut être exécuté manuellement, selon un calendrier dans la CI ou via un nœud de requête HTTP d’une plateforme d’automatisation. Le principe pratique essentiel consiste à automatiser la collecte et la structuration des données, tout en laissant à une personne la vérification du lien entre les comptes.
Pour vérifier les routes et les paramètres disponibles, commencez par l’API TikTok Scraper et l’API IG Scraper. Les pages produit proposent des exemples de requêtes et des liens vers la documentation ; commencez par une petite requête avant d’intégrer la collecte à un processus permanent.