L'écoute sociale TikTok capte les mentions de marque, les discussions produits et les changements de sentiment qui n'apparaissent sur aucune autre plateforme. Ce pipeline recherche des vidéos TikTok pour des mots-clés de marque, extrait les commentaires des vidéos pertinentes, classe le sentiment et génère un résumé quotidien. Chaque recherche et extraction de commentaires coûte 0,005 $.
Prérequis
- Python 3.8+
- bibliothèque requests
- Une clé API Scavio depuis scavio.dev
- Termes de marque et mots-clés à surveiller
Parcours
Étape 1: Recherchez des vidéos TikTok pour des mentions de marque
Trouvez des vidéos qui mentionnent votre marque ou catégorie de produit.
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'}
BRAND_TERMS = ['scavio', 'serp api', 'search api']
def search_tiktok(query):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos',
headers=TH, json={'query': query}).json()
videos = data.get('videos', data.get('data', {}).get('videos', []))
return [{'id': v.get('id', ''), 'desc': v.get('desc', '')[:100],
'author': v.get('author', {}).get('uniqueId', 'unknown'),
'plays': v.get('stats', {}).get('playCount', 0),
'likes': v.get('stats', {}).get('diggCount', 0),
'comments': v.get('stats', {}).get('commentCount', 0)} for v in videos]
all_videos = []
for term in BRAND_TERMS:
videos = search_tiktok(term)
all_videos.extend(videos)
print(f' "{term}": {len(videos)} videos found')
print(f'Total: {len(all_videos)} videos. Cost: ${len(BRAND_TERMS) * 0.005:.3f}')Étape 2: Extrayez les commentaires des vidéos pertinentes
Récupérez les commentaires des vidéos à fort engagement pour l'analyse de sentiment.
def get_comments(video_id):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/video/comments',
headers=TH, json={'video_id': video_id}).json()
comments = data.get('comments', data.get('data', {}).get('comments', []))
return [{'text': c.get('text', '')[:200],
'likes': c.get('digg_count', c.get('likes', 0)),
'user': c.get('user', {}).get('uniqueId', c.get('user', {}).get('unique_id', 'anon'))}
for c in comments]
# Get comments from top videos by engagement
top_videos = sorted(all_videos, key=lambda v: v['likes'], reverse=True)[:5]
all_comments = []
for v in top_videos:
if v['id']:
comments = get_comments(v['id'])
all_comments.extend(comments)
print(f' @{v["author"]}: {len(comments)} comments (video: {v["likes"]:,} likes)')
print(f'Total comments: {len(all_comments)}. Cost: ${len(top_videos) * 0.005:.3f}')Étape 3: Classez le sentiment des commentaires
Notez les commentaires par sentiment pour évaluer la perception de la marque.
POSITIVE = ['love', 'great', 'amazing', 'best', 'awesome', 'perfect', 'fire', 'goat',
'recommend', 'game changer', 'saved', 'finally']
NEGATIVE = ['hate', 'terrible', 'worst', 'scam', 'trash', 'overrated', 'expensive',
'broken', 'waste', 'disappointed', 'avoid']
def classify_comment(text):
text_lower = text.lower()
pos = sum(1 for w in POSITIVE if w in text_lower)
neg = sum(1 for w in NEGATIVE if w in text_lower)
if pos > neg: return 'positive'
if neg > pos: return 'negative'
return 'neutral'
def sentiment_analysis(comments):
sentiments = Counter()
examples = {'positive': [], 'negative': [], 'neutral': []}
for c in comments:
sentiment = classify_comment(c['text'])
sentiments[sentiment] += 1
if len(examples[sentiment]) < 3:
examples[sentiment].append(c['text'][:80])
total = len(comments)
print(f'\nSentiment Analysis ({total} comments):')
for sent in ['positive', 'negative', 'neutral']:
pct = sentiments[sent] / total * 100 if total else 0
print(f' {sent}: {sentiments[sent]} ({pct:.0f}%)')
for ex in examples[sent][:2]:
print(f' "{ex}"')
return dict(sentiments)
sentiment_analysis(all_comments)Étape 4: Générez un résumé quotidien d'écoute sociale
Combinez les mentions vidéo et le sentiment des commentaires dans un rapport quotidien.
def daily_digest(brand_terms):
print(f'\n=== TikTok Social Listening Digest - {datetime.now().strftime("%Y-%m-%d")} ===')
all_videos = []
cost = 0
for term in brand_terms:
videos = search_tiktok(term)
all_videos.extend(videos)
cost += 0.005
# Deduplicate
seen = set()
unique = [v for v in all_videos if v['id'] not in seen and not seen.add(v['id'])]
print(f'\nVideos found: {len(unique)} (from {len(brand_terms)} searches)')
total_plays = sum(v['plays'] for v in unique)
total_likes = sum(v['likes'] for v in unique)
print(f'Total reach: {total_plays:,} plays, {total_likes:,} likes')
# Top videos
top = sorted(unique, key=lambda v: v['plays'], reverse=True)[:5]
print(f'\nTop mentions:')
for v in top:
print(f' @{v["author"]:20} | {v["plays"]:>10,} plays | {v["desc"][:40]}')
# Comments from top videos
all_comments = []
for v in top[:3]:
if v['id']:
comments = get_comments(v['id'])
all_comments.extend(comments)
cost += 0.005
if all_comments:
sentiment_analysis(all_comments)
print(f'\nDigest cost: ${cost:.3f}')
daily_digest(BRAND_TERMS)Exemple Python
import os, requests
TH = {'Authorization': f'Bearer {os.environ["SCAVIO_API_KEY"]}', 'Content-Type': 'application/json'}
def listen(brand):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos',
headers=TH, json={'query': brand}).json()
videos = data.get('videos', data.get('data', {}).get('videos', []))
print(f'{brand}: {len(videos)} TikTok mentions')
for v in videos[:3]:
print(f' @{v.get("author", {}).get("uniqueId", "?")}: {v.get("desc", "")[:40]} ({v.get("stats", {}).get("playCount", 0):,} plays)')
print(f'Cost: $0.005')
listen('serp api')Exemple JavaScript
const TH = { 'Authorization': `Bearer ${process.env.SCAVIO_API_KEY}`, 'Content-Type': 'application/json' };
async function listen(brand) {
const data = await fetch('https://api.scavio.dev/api/v1/tiktok/search/videos', {
method: 'POST', headers: TH, body: JSON.stringify({ query: brand })
}).then(r => r.json());
const videos = data.videos || data.data?.videos || [];
console.log(`${brand}: ${videos.length} TikTok mentions`);
videos.slice(0, 3).forEach(v =>
console.log(` @${v.author?.uniqueId || '?'}: ${(v.desc || '').slice(0, 40)}`));
}
listen('serp api').catch(console.error);Sortie attendue
"scavio": 5 videos found
"serp api": 12 videos found
"search api": 8 videos found
Total: 25 videos. Cost: $0.015
=== TikTok Social Listening Digest - 2026-05-19 ===
Videos found: 20 (from 3 searches)
Total reach: 450,000 plays, 32,000 likes
Top mentions:
@devtools_review | 120,000 plays | Best SERP APIs ranked for developers
@startup_hacks | 89,000 plays | I replaced my web scraper with this
Sentiment Analysis (45 comments):
positive: 28 (62%)
"This is exactly what I needed for my project"
negative: 5 (11%)
neutral: 12 (27%)
Digest cost: $0.030