Les trois premières secondes d'une vidéo TikTok déterminent si les spectateurs continuent à regarder ou s'ils défilent. Ce tutoriel utilise l'API Scavio TikTok pour récupérer les données des vidéos les plus performantes dans votre niche, puis analyse quels modèles d'accroche sont corrélés aux taux d'engagement les plus élevés. En comparant les descriptions des vidéos, les ratios vue/j'aime et les nombres de partages selon différents styles d'accroche, vous pouvez identifier les modèles d'ouverture les plus efficaces. Chaque appel API coûte 0,005 $.
Prérequis
- Python 3.9+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Une niche ou un sujet pour analyser les accroches
Parcours
Étape 1: Collecter les vidéos performantes dans votre niche
Recherchez des vidéos dans votre niche et extrayez les meilleures performances. Leurs descriptions reflètent souvent le style d'accroche utilisé dans les premières secondes.
import os, requests, time, re
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
TT_URL = 'https://api.scavio.dev/api/v1/tiktok'
TT_H = {'Authorization': f'Bearer {SCAVIO_KEY}', 'Content-Type': 'application/json'}
def search_niche_videos(niche: str, count: int = 30) -> list:
resp = requests.post(f'{TT_URL}/search/videos', headers=TT_H,
json={'keyword': niche, 'count': count, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
results = []
for v in videos:
stats = v.get('stats', {})
views = stats.get('playCount', 0)
likes = stats.get('diggCount', 0)
results.append({
'desc': v.get('desc', ''),
'views': views,
'likes': likes,
'comments': stats.get('commentCount', 0),
'shares': stats.get('shareCount', 0),
'like_rate': likes / views if views > 0 else 0,
'share_rate': stats.get('shareCount', 0) / views if views > 0 else 0,
})
results.sort(key=lambda x: x['views'], reverse=True)
return results
videos = search_niche_videos('python programming tutorial')
print(f'Collected {len(videos)} videos')Étape 2: Classer les modèles d'accroche à partir des descriptions vidéo
Catégorisez les vidéos par leur style d'accroche en fonction du texte de la description. Les types d'accroche courants incluent les accroches sous forme de questions, d'affirmations, de tutoriels et de controverses.
HOOK_PATTERNS = {
'question': [r'^(did you|have you|do you|why|what if|how)', r'\?'],
'claim': [r'^(this|the|I found|I discovered|most people)', r'(secret|trick|hack|mistake)'],
'how_to': [r'^(how to|step|tutorial|learn|guide)', r'(in \d+ (?:seconds|minutes|steps))'],
'controversy': [r'(stop|dont|never|wrong|bad|overrated)', r'(unpopular|hot take|controversial)'],
'listicle': [r'^(\d+ |top \d+|best \d+)', r'(things|tips|tools|ways|reasons)'],
}
def classify_hook(desc: str) -> str:
desc_lower = desc.lower()
scores = {}
for hook_type, patterns in HOOK_PATTERNS.items():
score = sum(1 for p in patterns if re.search(p, desc_lower))
scores[hook_type] = score
best = max(scores, key=scores.get)
return best if scores[best] > 0 else 'other'
for v in videos[:5]:
hook = classify_hook(v['desc'])
print(f' [{hook:12s}] {v["like_rate"]:.1%} like rate | {v["desc"][:50]}')Étape 3: Analyser l'engagement par type d'accroche
Regroupez les vidéos par type d'accroche et comparez les taux d'engagement moyens. Cela révèle quels styles d'accroche génèrent les meilleures performances dans votre niche.
def analyze_hooks(videos: list) -> dict:
by_hook = {}
for v in videos:
hook = classify_hook(v['desc'])
if hook not in by_hook:
by_hook[hook] = []
by_hook[hook].append(v)
report = {}
for hook_type, vids in by_hook.items():
avg_like_rate = sum(v['like_rate'] for v in vids) / len(vids)
avg_share_rate = sum(v['share_rate'] for v in vids) / len(vids)
avg_views = sum(v['views'] for v in vids) / len(vids)
report[hook_type] = {
'count': len(vids),
'avg_like_rate': avg_like_rate,
'avg_share_rate': avg_share_rate,
'avg_views': avg_views,
'best_video': max(vids, key=lambda x: x['views'])['desc'][:50],
}
print('Hook Analysis Report')
print('=' * 65)
for hook, stats in sorted(report.items(), key=lambda x: x[1]['avg_like_rate'], reverse=True):
print(f' {hook:12s} | {stats["count"]:3d} videos | {stats["avg_like_rate"]:5.1%} like rate | {stats["avg_views"]:>10,.0f} avg views')
print(f' | Best: {stats["best_video"]}')
return report
report = analyze_hooks(videos)Exemple Python
import os, requests, re
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
TT_H = {'Authorization': f'Bearer {SCAVIO_KEY}', 'Content-Type': 'application/json'}
def analyze_hooks(niche):
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos', headers=TT_H,
json={'keyword': niche, 'count': 20, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
hooks = {'question': [], 'how_to': [], 'claim': [], 'other': []}
for v in videos:
desc = v.get('desc', '').lower()
stats = v.get('stats', {})
views = stats.get('playCount', 1)
like_rate = stats.get('diggCount', 0) / views
if '?' in desc or desc.startswith(('did', 'why', 'what')): cat = 'question'
elif desc.startswith(('how to', 'tutorial', 'learn')): cat = 'how_to'
elif any(w in desc for w in ['secret', 'hack', 'trick']): cat = 'claim'
else: cat = 'other'
hooks[cat].append(like_rate)
for cat, rates in hooks.items():
avg = sum(rates) / len(rates) if rates else 0
print(f'{cat:12s}: {len(rates):3d} videos, {avg:.1%} avg like rate')
analyze_hooks('python programming')Exemple JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
const TT_H = { Authorization: `Bearer ${SCAVIO_KEY}`, 'Content-Type': 'application/json' };
async function analyzeHooks(niche) {
const resp = await fetch('https://api.scavio.dev/api/v1/tiktok/search/videos', {
method: 'POST', headers: TT_H, body: JSON.stringify({ keyword: niche, count: 20, cursor: 0 })
}).then(r => r.json());
const hooks = { question: [], how_to: [], claim: [], other: [] };
for (const v of (resp.data?.videos || [])) {
const desc = (v.desc || '').toLowerCase();
const views = v.stats?.playCount || 1;
const likeRate = (v.stats?.diggCount || 0) / views;
let cat = 'other';
if (desc.includes('?') || desc.startsWith('did') || desc.startsWith('why')) cat = 'question';
else if (desc.startsWith('how to') || desc.startsWith('tutorial')) cat = 'how_to';
else if (['secret', 'hack', 'trick'].some(w => desc.includes(w))) cat = 'claim';
hooks[cat].push(likeRate);
}
for (const [cat, rates] of Object.entries(hooks)) {
const avg = rates.length ? rates.reduce((a, b) => a + b, 0) / rates.length : 0;
console.log(`${cat}: ${rates.length} videos, ${(avg * 100).toFixed(1)}% avg like rate`);
}
}
analyzeHooks('python programming');Sortie attendue
Collected 30 videos
Hook Analysis Report
=================================================================
question | 8 videos | 8.2% like rate | 890,000 avg views
| Best: Did you know Python can do this in one lin
claim | 6 videos | 7.5% like rate | 1,200,000 avg views
| Best: This Python trick will save you hours of c
how_to | 10 videos | 5.8% like rate | 650,000 avg views
| Best: How to build an API in 60 seconds with Fas
controversy | 3 videos | 9.1% like rate | 780,000 avg views
| Best: Stop using print for debugging in Python
other | 3 videos | 4.2% like rate | 320,000 avg views