La escucha social de TikTok capta menciones de marcas, discusiones sobre productos y cambios de sentimiento que no aparecen en ninguna otra plataforma. Este canal busca videos de TikTok en busca de palabras clave de marca, extrae comentarios de videos relevantes, clasifica opiniones y genera un resumen diario. Cada búsqueda y comentario cuesta $0,005.
Requisitos previos
- Python 3.8+
- solicita biblioteca
- Una clave API de Scavio de scavio.dev
- Términos de marca y palabras clave para monitorear
Guia paso a paso
Paso 1: Buscar videos de TikTok para menciones de marca
Encuentre videos que mencionen su marca o categoría de producto.
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}')Paso 2: Extraiga comentarios de vídeos relevantes
Obtenga comentarios de videos de alta participación para realizar análisis de sentimientos.
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}')Paso 3: Clasificar sentimientos a partir de comentarios
Califique los comentarios según el sentimiento para medir la percepción de la marca.
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)Paso 4: Generar un resumen diario de escucha social
Combine menciones en vídeo y opiniones de comentarios en un informe diario.
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)Ejemplo en 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')Ejemplo en 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);Salida esperada
"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