Vous pouvez analyser la stratégie de contenu TikTok d'un concurrent en récupérant ses publications via l'API Scavio TikTok en utilisant le flux en deux étapes username-to-sec_uid, puis en calculant la fréquence de publication, les taux d'engagement et les modèles de contenu les plus performants.
Prérequis
- Python 3.9+
- Clé API Scavio avec accès TikTok
Parcours
Étape 1: Obtenir le sec_uid à partir du nom d'utilisateur du concurrent
Étape 1 : Résoudre le nom d'utilisateur en sec_uid via le point de terminaison du profil.
import requests
API_KEY = "your-scavio-api-key"
def get_sec_uid(username: str) -> str:
r = requests.post(
"https://api.scavio.dev/api/v1/tiktok/user/profile",
json={"username": username},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=15
)
r.raise_for_status()
return r.json().get("sec_uid")Étape 2: Récupérer leurs publications récentes
Étape 2 : Utiliser sec_uid avec la pagination max_cursor pour obtenir jusqu'à 90 publications récentes.
def get_posts(sec_uid: str, max_count: int = 90) -> list:
all_posts, cursor = [], 0
while len(all_posts) < max_count:
r = requests.post(
"https://api.scavio.dev/api/v1/tiktok/user/posts",
json={"sec_uid": sec_uid, "count": 30, "max_cursor": cursor},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=20
)
r.raise_for_status()
data = r.json()
batch = data.get("videos", [])
if not batch: break
all_posts.extend(batch)
if not data.get("has_more"): break
cursor = data.get("max_cursor", 0)
return all_posts[:max_count]Étape 3: Analyser les modèles de contenu
Calculer la fréquence de publication, l'engagement moyen et identifier les formats de contenu les plus performants.
from collections import Counter
def analyze_posts(posts: list) -> dict:
if not posts:
return {}
total = len(posts)
plays = [p.get("stats",{}).get("playCount",0) for p in posts]
likes = [p.get("stats",{}).get("diggCount",0) for p in posts]
avg_plays = sum(plays) / total
avg_likes = sum(likes) / total
top_posts = sorted(posts, key=lambda p: p.get("stats",{}).get("playCount",0), reverse=True)[:5]
descs = [p.get("desc","") for p in posts]
# Detect hashtags used
import re
all_tags = [tag for desc in descs for tag in re.findall(r"#(\w+)", desc)]
top_tags = Counter(all_tags).most_common(10)
return {
"total_posts": total,
"avg_plays": round(avg_plays),
"avg_likes": round(avg_likes),
"top_hashtags": top_tags,
"top_posts": [{"desc": p.get("desc","")[:80], "plays": p.get("stats",{}).get("playCount",0)} for p in top_posts]
}Exemple Python
import requests
import re
from collections import Counter
API_KEY = "your-scavio-api-key"
def get_sec_uid(username):
r = requests.post("https://api.scavio.dev/api/v1/tiktok/user/profile",
json={"username": username}, headers={"Authorization": f"Bearer {API_KEY}"}, timeout=15)
r.raise_for_status()
return r.json().get("sec_uid")
def get_posts(sec_uid, max_count=90):
posts, cursor = [], 0
while len(posts) < max_count:
r = requests.post("https://api.scavio.dev/api/v1/tiktok/user/posts",
json={"sec_uid": sec_uid, "count": 30, "max_cursor": cursor},
headers={"Authorization": f"Bearer {API_KEY}"}, timeout=20)
r.raise_for_status()
data = r.json()
batch = data.get("videos", [])
if not batch: break
posts.extend(batch)
if not data.get("has_more"): break
cursor = data.get("max_cursor", 0)
return posts[:max_count]
def analyze(posts):
if not posts: return {}
plays = [p.get("stats",{}).get("playCount",0) for p in posts]
likes = [p.get("stats",{}).get("diggCount",0) for p in posts]
tags = Counter(t for p in posts for t in re.findall(r"#(\w+)", p.get("desc","")))
top = sorted(posts, key=lambda p: p.get("stats",{}).get("playCount",0), reverse=True)[:3]
return {"count": len(posts), "avg_plays": round(sum(plays)/len(plays)),
"avg_likes": round(sum(likes)/len(likes)), "top_tags": tags.most_common(5),
"top_posts": [{"desc": p.get("desc","")[:60], "plays": p.get("stats",{}).get("playCount",0)} for p in top]}
def analyze_competitor(username):
print(f"Analyzing @{username}...")
sec_uid = get_sec_uid(username)
if not sec_uid: return print("Not found")
posts = get_posts(sec_uid)
stats = analyze(posts)
print(f"Posts analyzed: {stats['count']}")
print(f"Avg plays: {stats['avg_plays']:,} | Avg likes: {stats['avg_likes']:,}")
print(f"Top hashtags: {[t[0] for t in stats['top_tags']]}")
print("Top posts:")
for p in stats["top_posts"]:
print(f" {p['plays']:>8,} plays | {p['desc']}")
if __name__ == "__main__":
analyze_competitor("competitor_username")Exemple JavaScript
const API_KEY = 'your-scavio-api-key';
async function getSecUid(username) {
const res = await fetch('https://api.scavio.dev/api/v1/tiktok/user/profile', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_KEY}` },
body: JSON.stringify({ username })
});
return (await res.json()).sec_uid;
}
async function getPosts(secUid, count = 30) {
const res = await fetch('https://api.scavio.dev/api/v1/tiktok/user/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_KEY}` },
body: JSON.stringify({ sec_uid: secUid, count, max_cursor: 0 })
});
return (await res.json()).videos ?? [];
}
const secUid = await getSecUid('competitor_username');
const posts = await getPosts(secUid);
const avgPlays = posts.reduce((s, p) => s + (p.stats?.playCount ?? 0), 0) / posts.length;
console.log(`Avg plays: ${Math.round(avgPlays).toLocaleString()}`);Sortie attendue
Analyzing @competitor_username...
Posts analyzed: 90
Avg plays: 482,441 | Avg likes: 38,209
Top hashtags: ['aitools', 'coding', 'tutorial', 'learntocode', 'python']
Top posts:
2,841,209 plays | How I built this in 10 minutes using AI #aitools
1,209,441 plays | Stop using ChatGPT for coding. Use this instead
891,022 plays | The AI tool that replaced 3 apps for me #productivity