Le suivi de ce que les concurrents publient sur TikTok et de la performance de leur contenu révèle les schémas de stratégie de contenu, les heures de publication optimales et les références d'engagement pour votre niche. Ce traqueur récupère les profils des concurrents et leurs publications récentes via l'API Scavio TikTok, calcule les taux d'engagement et génère des rapports de comparaison hebdomadaires. Chaque récupération de profil coûte 0,005 $ et chaque extraction de publications coûte 0,005 $.
Prérequis
- Python 3.8+
- bibliothèque requests
- Une clé API Scavio depuis scavio.dev
- Noms d'utilisateur TikTok des concurrents à suivre
Parcours
Étape 1: Configurer les profils des concurrents
Récupérer et stocker les données de profil de base pour chaque concurrent.
import os, requests, json
from datetime import datetime
API_KEY = os.environ['SCAVIO_API_KEY']
TH = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
COMPETITORS = ['competitor1', 'competitor2', 'competitor3']
def get_profile(username):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/profile',
headers=TH, json={'username': username}).json()
user = data.get('user', data.get('data', {}).get('user', data))
return {
'username': username, 'followers': user.get('followerCount', user.get('fans', 0)),
'following': user.get('followingCount', 0),
'likes': user.get('heartCount', user.get('heart', 0)),
'videos': user.get('videoCount', 0),
'checked_at': datetime.now().isoformat()
}
profiles = []
for c in COMPETITORS:
p = get_profile(c)
profiles.append(p)
print(f'{c}: {p["followers"]:,} followers, {p["videos"]} videos, {p["likes"]:,} likes')
print(f'Cost: ${len(COMPETITORS) * 0.005:.3f}')Étape 2: Récupérer les publications récentes et calculer l'engagement
Extraire les publications récentes et calculer les taux d'engagement par concurrent.
def get_recent_posts(username):
profile = requests.post('https://api.scavio.dev/api/v1/tiktok/profile',
headers=TH, json={'username': username}).json()
sec_uid = profile.get('user', profile.get('data', {}).get('user', {})).get('secUid', '')
if not sec_uid:
return []
data = requests.post('https://api.scavio.dev/api/v1/tiktok/user/posts',
headers=TH, json={'sec_user_id': sec_uid}).json()
posts = data.get('videos', data.get('data', {}).get('videos', []))
return [{'desc': p.get('desc', '')[:80],
'plays': p.get('stats', {}).get('playCount', 0),
'likes': p.get('stats', {}).get('diggCount', 0),
'comments': p.get('stats', {}).get('commentCount', 0),
'shares': p.get('stats', {}).get('shareCount', 0),
'date': p.get('createTime', '')} for p in posts[:10]]
def engagement_rate(posts):
if not posts: return 0
total_eng = sum(p['likes'] + p['comments'] + p['shares'] for p in posts)
total_plays = sum(p['plays'] for p in posts) or 1
return total_eng / total_plays * 100
for c in COMPETITORS:
posts = get_recent_posts(c)
er = engagement_rate(posts)
avg_plays = sum(p['plays'] for p in posts) / len(posts) if posts else 0
print(f'{c}: {len(posts)} posts, {er:.2f}% engagement, {avg_plays:,.0f} avg plays')Étape 3: Suivre les changements dans le temps
Stocker des instantanés hebdomadaires et détecter les changements d'abonnés/d'engagement.
import sqlite3
db = sqlite3.connect('tiktok_tracker.db')
db.execute('''CREATE TABLE IF NOT EXISTS snapshots (
username TEXT, checked_at TEXT, followers INTEGER,
engagement_rate REAL, avg_plays INTEGER, post_count INTEGER
)''')
db.commit()
def save_snapshot(username, followers, er, avg_plays, post_count):
db.execute('INSERT INTO snapshots VALUES (?,?,?,?,?,?)',
(username, datetime.now().isoformat(), followers, er, avg_plays, post_count))
db.commit()
def get_change(username):
rows = db.execute(
'SELECT followers, engagement_rate, checked_at FROM snapshots WHERE username=? ORDER BY checked_at DESC LIMIT 2',
(username,)).fetchall()
if len(rows) < 2: return None
curr, prev = rows[0], rows[1]
return {
'follower_change': curr[0] - prev[0],
'er_change': curr[1] - prev[1],
'period': f'{prev[2][:10]} -> {curr[2][:10]}'
}
for c in COMPETITORS:
posts = get_recent_posts(c)
p = get_profile(c)
er = engagement_rate(posts)
avg_plays = sum(po['plays'] for po in posts) / len(posts) if posts else 0
save_snapshot(c, p['followers'], er, int(avg_plays), len(posts))
change = get_change(c)
if change:
print(f'{c}: followers {change["follower_change"]:+,}, ER {change["er_change"]:+.2f}pp')Étape 4: Générer un rapport de comparaison hebdomadaire
Construire un tableau de classement des concurrents par indicateurs clés.
def weekly_report():
print(f'\n=== TikTok Competitor Report - {datetime.now().strftime("%Y-%m-%d")} ===')
data = []
total_cost = 0
for c in COMPETITORS:
p = get_profile(c)
total_cost += 0.005
posts = get_recent_posts(c)
total_cost += 0.010 # profile + posts
er = engagement_rate(posts)
avg_plays = sum(po['plays'] for po in posts) / len(posts) if posts else 0
data.append({'name': c, 'followers': p['followers'], 'er': er,
'avg_plays': avg_plays, 'posts': len(posts)})
data.sort(key=lambda x: x['er'], reverse=True)
print(f'{"Creator":20} | {"Followers":>12} | {"Eng Rate":>8} | {"Avg Plays":>12} | {"Posts":>5}')
print('-' * 75)
for d in data:
print(f'{d["name"]:20} | {d["followers"]:12,} | {d["er"]:7.2f}% | {d["avg_plays"]:12,.0f} | {d["posts"]:5}')
print(f'\nTotal cost: ${total_cost:.3f}')
return data
weekly_report()Exemple Python
import os, requests
TH = {'Authorization': f'Bearer {os.environ["SCAVIO_API_KEY"]}', 'Content-Type': 'application/json'}
def track(username):
p = requests.post('https://api.scavio.dev/api/v1/tiktok/profile',
headers=TH, json={'username': username}).json()
user = p.get('user', p.get('data', {}).get('user', p))
sec_uid = user.get('secUid', '')
posts = requests.post('https://api.scavio.dev/api/v1/tiktok/user/posts',
headers=TH, json={'sec_user_id': sec_uid}).json()
vids = posts.get('videos', posts.get('data', {}).get('videos', []))[:5]
total = sum(v.get('stats', {}).get('diggCount', 0) for v in vids)
print(f'{username}: {user.get("followerCount", 0):,} followers, {total:,} likes on last 5. Cost: $0.010')
track('competitor1')Exemple JavaScript
const TH = { 'Authorization': `Bearer ${process.env.SCAVIO_API_KEY}`, 'Content-Type': 'application/json' };
async function track(username) {
const p = await fetch('https://api.scavio.dev/api/v1/tiktok/profile', {
method: 'POST', headers: TH, body: JSON.stringify({ username })
}).then(r => r.json());
const user = p.user || p.data?.user || p;
const posts = await fetch('https://api.scavio.dev/api/v1/tiktok/user/posts', {
method: 'POST', headers: TH, body: JSON.stringify({ sec_user_id: user.secUid })
}).then(r => r.json());
const vids = (posts.videos || posts.data?.videos || []).slice(0, 5);
const likes = vids.reduce((s, v) => s + (v.stats?.diggCount || 0), 0);
console.log(`${username}: ${(user.followerCount||0).toLocaleString()} followers, ${likes.toLocaleString()} likes`);
}
track('competitor1').catch(console.error);Sortie attendue
competitor1: 45,200 followers, 312 videos, 1,230,000 likes
competitor2: 128,500 followers, 567 videos, 4,560,000 likes
competitor3: 23,100 followers, 189 videos, 890,000 likes
Cost: $0.015
=== TikTok Competitor Report - 2026-05-19 ===
Creator | Followers | Eng Rate | Avg Plays | Posts
---------------------------------------------------------------------------
competitor3 | 23,100 | 8.45% | 12,300 | 10
competitor1 | 45,200 | 5.23% | 34,500 | 10
competitor2 | 128,500 | 3.87% | 89,200 | 10
Total cost: $0.045