Avant de s'associer avec un créateur TikTok, les marques doivent vérifier la sécurité du contenu, la qualité de l'audience et l'historique des controverses. Ce tutoriel construit un rapport automatisé de sécurité de marque qui filtre les créateurs en analysant leur contenu récent, leurs schémas d'engagement et le sentiment public. Chaque rapport de créateur coûte 0,010 $.
Prérequis
- Python 3.8+
- bibliothèque requests
- Une clé API Scavio de scavio.dev
- Noms d'utilisateur de créateurs TikTok à filtrer
Parcours
Étape 1: Récupérer le contenu du créateur pour analyse
Extraire les vidéos récentes d'un créateur TikTok pour analyser les thèmes de contenu.
import os, requests, json
from datetime import datetime
from collections import Counter
API_KEY = os.environ['SCAVIO_API_KEY']
TH = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def get_creator_content(username):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/user/videos',
headers=TH, json={'username': username}).json()
videos = data.get('videos', data.get('data', {}).get('videos', []))
return [{
'desc': v.get('desc', ''),
'plays': v.get('stats', {}).get('playCount', 0),
'likes': v.get('stats', {}).get('diggCount', 0),
'comments': v.get('stats', {}).get('commentCount', 0),
'shares': v.get('stats', {}).get('shareCount', 0),
'hashtags': [h.get('name', '') for h in v.get('textExtra', []) if h.get('hashtagName')],
} for v in videos]
CREATORS = ['charlidamelio', 'khaby.lame', 'addisonre']
creator_data = {}
for username in CREATORS:
videos = get_creator_content(username)
creator_data[username] = videos
total_plays = sum(v['plays'] for v in videos)
print(f' @{username:20} | {len(videos)} videos | {total_plays:,} total plays')
print(f'\nCost: ${len(CREATORS) * 0.005:.3f}')Étape 2: Filtrer le contenu pour les problèmes de sécurité de marque
Analyser les descriptions des vidéos pour des thèmes de contenu dangereux et calculer les scores de sécurité.
UNSAFE_KEYWORDS = {
'high_risk': ['gambling', 'drugs', 'violence', 'explicit', 'nsfw', 'controversy', 'scandal'],
'medium_risk': ['alcohol', 'smoking', 'political', 'conspiracy', 'drama', 'exposed', 'canceled'],
'low_risk': ['rant', 'clickbait', 'shocking', 'unbelievable', 'prank'],
}
def safety_screen(username, videos):
flags = {'high_risk': 0, 'medium_risk': 0, 'low_risk': 0}
flagged_videos = []
for v in videos:
text = v['desc'].lower()
for level, keywords in UNSAFE_KEYWORDS.items():
for kw in keywords:
if kw in text:
flags[level] += 1
flagged_videos.append({'desc': v['desc'][:60], 'level': level, 'keyword': kw})
# Calculate safety score (100 = safest)
total = len(videos) or 1
penalty = flags['high_risk'] * 20 + flags['medium_risk'] * 10 + flags['low_risk'] * 3
safety_score = max(0, 100 - penalty)
# Engagement quality check
if videos:
avg_engagement = sum(v['likes'] + v['comments'] for v in videos) / len(videos)
avg_plays = sum(v['plays'] for v in videos) / len(videos)
engagement_rate = avg_engagement / avg_plays if avg_plays else 0
else:
engagement_rate = 0
return {
'username': username,
'safety_score': safety_score,
'flags': flags,
'flagged_videos': flagged_videos[:5],
'engagement_rate': engagement_rate,
'video_count': len(videos),
}
print(f'\n=== Brand Safety Screening ===')
reports = []
for username, videos in creator_data.items():
report = safety_screen(username, videos)
reports.append(report)
status = 'SAFE' if report['safety_score'] >= 80 else 'REVIEW' if report['safety_score'] >= 50 else 'RISK'
print(f' @{username:20} | Score: {report["safety_score"]:3}/100 | Status: {status}')
if report['flagged_videos']:
for fv in report['flagged_videos'][:2]:
print(f' [{fv["level"]}] "{fv["keyword"]}" in: {fv["desc"]}')Étape 3: Vérifier le sentiment public via la recherche
Rechercher des controverses ou des mauvaises presse concernant le créateur.
def check_public_sentiment(username):
# Search for controversy
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': f'{username} tiktok controversy', 'country_code': 'us'}, timeout=10).json()
organic = data.get('organic_results', [])
negative_signals = []
for r in organic[:5]:
text = f'{r.get("title", "")} {r.get("snippet", "")}'.lower()
if any(w in text for w in ['controversy', 'scandal', 'canceled', 'backlash', 'apologize', 'fired']):
negative_signals.append(r.get('title', '')[:60])
return {'controversy_results': len(organic), 'negative_signals': negative_signals}
def full_safety_report(reports):
print(f'\n{"=" * 60}')
print(f' TIKTOK CREATOR BRAND SAFETY REPORT')
print(f' Date: {datetime.now().strftime("%Y-%m-%d")}')
print(f'{"=" * 60}')
for report in reports:
sentiment = check_public_sentiment(report['username'])
score = report['safety_score']
if sentiment['negative_signals']:
score = max(0, score - len(sentiment['negative_signals']) * 15)
status = 'APPROVED' if score >= 80 else 'NEEDS REVIEW' if score >= 50 else 'DO NOT PARTNER'
print(f'\n @{report["username"]}')
print(f' Safety Score: {score}/100 | Status: {status}')
print(f' Engagement Rate: {report["engagement_rate"]*100:.1f}%')
print(f' Content Flags: H:{report["flags"]["high_risk"]} M:{report["flags"]["medium_risk"]} L:{report["flags"]["low_risk"]}')
if sentiment['negative_signals']:
print(f' Controversy Signals:')
for s in sentiment['negative_signals'][:2]:
print(f' - {s}')
print(f'\n Cost: ${len(reports) * 0.010:.3f} per report')
print(f' vs. Brand safety tools: $500-2000/mo')
full_safety_report(reports)Exemple Python
import os, requests
TH = {'Authorization': f'Bearer {os.environ["SCAVIO_API_KEY"]}', 'Content-Type': 'application/json'}
def screen_creator(username):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/user/videos',
headers=TH, json={'username': username}).json()
videos = data.get('videos', data.get('data', {}).get('videos', []))
plays = sum(v.get('stats', {}).get('playCount', 0) for v in videos)
print(f'@{username}: {len(videos)} videos, {plays:,} plays')
screen_creator('charlidamelio')
print('Cost: $0.005')Exemple JavaScript
const TH = { 'Authorization': `Bearer ${process.env.SCAVIO_API_KEY}`, 'Content-Type': 'application/json' };
const data = await fetch('https://api.scavio.dev/api/v1/tiktok/user/videos', {
method: 'POST', headers: TH, body: JSON.stringify({ username: 'charlidamelio' })
}).then(r => r.json());
const videos = data.videos || data.data?.videos || [];
console.log(`Videos: ${videos.length}`);Sortie attendue
@charlidamelio | 15 videos | 45,000,000 total plays
@khaby.lame | 12 videos | 120,000,000 total plays
@addisonre | 10 videos | 25,000,000 total plays
=== Brand Safety Screening ===
@charlidamelio | Score: 90/100 | Status: SAFE
@khaby.lame | Score: 100/100 | Status: SAFE
@addisonre | Score: 85/100 | Status: SAFE
============================================================
TIKTOK CREATOR BRAND SAFETY REPORT
Date: 2026-05-21
============================================================
@charlidamelio
Safety Score: 85/100 | Status: APPROVED
Engagement Rate: 8.5%
Cost: $0.030 per report
vs. Brand safety tools: $500-2000/mo