Un sistema económico de monitoreo de marca TikTok rastrea las menciones de su marca, analiza el sentimiento de los comentarios y observa la actividad de la competencia sin costosas suscripciones de escucha social. Usando la API de Scavio TikTok a $0.005/crédito, puedes buscar videos que mencionen tu marca, obtener comentarios para análisis de sentimientos y monitorear los hashtags de la competencia, todo dentro de un plan de $30/mes. Este tutorial crea un canal de monitoreo completo que se ejecuta en un cron diario y genera un informe resumido.
Requisitos previos
- Python 3.10+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Familiaridad básica con la terminología de contenido de TikTok (hashtags, aweme_id)
Guia paso a paso
Paso 1: Busque en TikTok menciones de marca
Utilice el punto final de búsqueda/vídeos de TikTok para encontrar vídeos recientes que mencionen su marca. Esto captura tanto las menciones directas en las descripciones como el contenido relacionado.
import requests, os
from datetime import datetime
API_KEY = os.environ['SCAVIO_API_KEY']
HEADERS = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
def search_brand_mentions(brand: str, pages: int = 3) -> list:
videos = []
cursor = 0
for _ in range(pages):
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos',
headers=HEADERS,
json={'keyword': brand, 'count': 20, 'cursor': cursor})
data = resp.json()['data']
videos.extend(data.get('videos', []))
if not data.get('has_more'):
break
cursor = data['cursor']
return videos
mentions = search_brand_mentions('yourBrandName')
print(f'Found {len(mentions)} videos mentioning brand')Paso 2: Extraer sentimiento de comentario por mención
Para cada video que mencione su marca, obtenga comentarios y clasifique las opiniones mediante una simple concordancia de palabras clave. Para uso en producción, intercambie un clasificador LLM.
POSITIVE_WORDS = {'love', 'amazing', 'great', 'best', 'perfect', 'awesome', 'recommend'}
NEGATIVE_WORDS = {'hate', 'worst', 'terrible', 'scam', 'broken', 'awful', 'waste'}
def get_comments(video_id: str, pages: int = 2) -> list:
comments = []
cursor = 0
for _ in range(pages):
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/video/comments',
headers=HEADERS,
json={'aweme_id': video_id, 'count': 20, 'cursor': cursor})
data = resp.json()['data']
comments.extend(data.get('comments', []))
if not data.get('has_more'):
break
cursor = data.get('cursor', cursor + 20)
return comments
def classify_sentiment(comments: list) -> dict:
counts = {'positive': 0, 'negative': 0, 'neutral': 0}
for c in comments:
words = set(c['text'].lower().split())
if words & POSITIVE_WORDS:
counts['positive'] += 1
elif words & NEGATIVE_WORDS:
counts['negative'] += 1
else:
counts['neutral'] += 1
return countsPaso 3: Monitorear los hashtags de la competencia
Realice un seguimiento de los hashtags de las marcas de la competencia para comparar su presencia en TikTok con la suya. Compare el número de visualizaciones y el volumen de vídeos a lo largo del tiempo.
def monitor_hashtag(hashtag: str) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/hashtag',
headers=HEADERS, json={'hashtag': hashtag})
data = resp.json()['data']
return {
'hashtag': hashtag,
'views': data['stats']['view_count'],
'videos': data['stats']['video_count']
}
competitors = ['competitorA', 'competitorB', 'yourBrand']
for tag in competitors:
stats = monitor_hashtag(tag)
print(f'#{stats["hashtag"]}: {stats["views"]:,} views, {stats["videos"]:,} videos')Paso 4: Generar un informe resumido diario
Combine menciones de marca, opiniones y datos de la competencia en un informe JSON diario. Programe esto con cron para monitoreo automatizado.
import json
from datetime import date
def daily_report(brand: str, competitors: list) -> dict:
mentions = search_brand_mentions(brand, pages=2)
total_sentiment = {'positive': 0, 'negative': 0, 'neutral': 0}
for v in mentions[:10]: # Sample top 10 for budget
comments = get_comments(v['aweme_id'], pages=1)
sentiment = classify_sentiment(comments)
for k in total_sentiment:
total_sentiment[k] += sentiment[k]
comp_stats = [monitor_hashtag(c) for c in competitors]
report = {
'date': date.today().isoformat(),
'brand': brand,
'mentions_found': len(mentions),
'sentiment': total_sentiment,
'competitors': comp_stats
}
with open(f'brand_report_{date.today()}.json', 'w') as f:
json.dump(report, f, indent=2)
return report
report = daily_report('yourBrand', ['competitorA', 'competitorB'])
print(json.dumps(report, indent=2))Ejemplo en Python
import requests, os, json
from datetime import date
API_KEY = os.environ['SCAVIO_API_KEY']
HEADERS = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
def search_mentions(brand, pages=2):
videos, cursor = [], 0
for _ in range(pages):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos',
headers=HEADERS, json={'keyword': brand, 'count': 20, 'cursor': cursor}).json()['data']
videos.extend(data.get('videos', []))
if not data.get('has_more'): break
cursor = data['cursor']
return videos
def get_comments(vid_id, pages=1):
comments, cursor = [], 0
for _ in range(pages):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/video/comments',
headers=HEADERS, json={'aweme_id': vid_id, 'count': 20, 'cursor': cursor}).json()['data']
comments.extend(data.get('comments', []))
if not data.get('has_more'): break
cursor = data.get('cursor', cursor + 20)
return comments
def hashtag_stats(tag):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/hashtag',
headers=HEADERS, json={'hashtag': tag}).json()['data']
return {'hashtag': tag, 'views': data['stats']['view_count'], 'videos': data['stats']['video_count']}
mentions = search_mentions('yourBrand')
print(f'{len(mentions)} mentions found')
for v in mentions[:5]:
comments = get_comments(v['aweme_id'])
print(f" {v['desc'][:40]} -> {len(comments)} comments")
for c in ['competitorA', 'competitorB']:
s = hashtag_stats(c)
print(f"#{s['hashtag']}: {s['views']:,} views")Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const H = { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' };
async function searchMentions(brand, pages = 2) {
const videos = [];
let cursor = 0;
for (let i = 0; i < pages; i++) {
const r = await fetch('https://api.scavio.dev/api/v1/tiktok/search/videos', {
method: 'POST', headers: H,
body: JSON.stringify({ keyword: brand, count: 20, cursor })
}).then(r => r.json());
videos.push(...(r.data.videos || []));
if (!r.data.has_more) break;
cursor = r.data.cursor;
}
return videos;
}
async function getComments(videoId) {
const r = await fetch('https://api.scavio.dev/api/v1/tiktok/video/comments', {
method: 'POST', headers: H,
body: JSON.stringify({ aweme_id: videoId, count: 20, cursor: 0 })
}).then(r => r.json());
return r.data.comments || [];
}
async function hashtagStats(tag) {
const r = await fetch('https://api.scavio.dev/api/v1/tiktok/hashtag', {
method: 'POST', headers: H,
body: JSON.stringify({ hashtag: tag })
}).then(r => r.json());
return { hashtag: tag, views: r.data.stats.view_count };
}
async function main() {
const mentions = await searchMentions('yourBrand');
console.log(`${mentions.length} brand mentions`);
for (const v of mentions.slice(0, 5)) {
const comments = await getComments(v.aweme_id);
console.log(` ${v.desc.slice(0, 40)} -> ${comments.length} comments`);
}
for (const c of ['competitorA', 'competitorB']) {
const s = await hashtagStats(c);
console.log(`#${s.hashtag}: ${s.views.toLocaleString()} views`);
}
}
main().catch(console.error);Salida esperada
{
"date": "2026-05-12",
"brand": "yourBrand",
"mentions_found": 38,
"sentiment": {
"positive": 42,
"negative": 7,
"neutral": 31
},
"competitors": [
{ "hashtag": "competitorA", "views": 2400000, "videos": 1200 },
{ "hashtag": "competitorB", "views": 890000, "videos": 430 }
]
}