Resumen
Este flujo de trabajo monitorea TikTok video comentarios diario for menciones de marca y sentiment senales. It searches for videos mentioning your marca, obtiene their comentarios, classifies menciones as positive, negative, o neutral, y rastrea competidor menciones. El salida es un diario sentiment informe ese replaces $500+/mo social listening herramientas.
Desencadenador
Cron programar (diario at 9:00 AM UTC)
Programación
Ejecuta diario at 9:00 AM UTC
Pasos del flujo de trabajo
Search for brand-related videos
Call Scavio TikTok search/videos to encontrar reciente videos mentioning your marca o producto.
Obtener comentarios for cada video
Call el video/comentarios endpoint for cada relevante video to obtener structured comentario datos.
Filtrar for menciones de marca
Scan comentario text for marca palabras clave, competidor names, y sentiment indicator words.
Clasificar sentiment
Use palabra clave coincidencia to clasificar cada mencion as positive, negative, o neutral basado on context words.
Generar diario sentiment informe
Compile mencion counts, sentiment breakdown, y notable comentarios en un informe diario.
Implementacion en Python
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
BASE_URL = "https://api.scavio.dev/api/v1/tiktok"
BRAND = "yourbrand"
COMPETITORS = ["competitor1", "competitor2"]
POSITIVE_WORDS = ["love", "amazing", "best", "great", "awesome", "perfect", "recommend"]
NEGATIVE_WORDS = ["hate", "worst", "terrible", "awful", "broken", "scam", "avoid", "disappointing"]
def search_videos(query: str) -> list[dict]:
res = requests.post(
f"{BASE_URL}/search/videos",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query},
timeout=15,
)
res.raise_for_status()
return res.json().get("videos", [])
def get_comments(video_id: str) -> list[dict]:
res = requests.post(
f"{BASE_URL}/video/comments",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"video_id": video_id},
timeout=15,
)
res.raise_for_status()
return res.json().get("comments", [])
def classify_sentiment(text: str) -> str:
lower = text.lower()
pos = sum(1 for w in POSITIVE_WORDS if w in lower)
neg = sum(1 for w in NEGATIVE_WORDS if w in lower)
if pos > neg:
return "positive"
if neg > pos:
return "negative"
return "neutral"
def run():
videos = search_videos(BRAND)
mentions = {"positive": [], "negative": [], "neutral": [], "competitor": []}
for video in videos[:20]:
video_id = video.get("id", "")
if not video_id:
continue
comments = get_comments(video_id)
for comment in comments:
text = comment.get("text", "")
lower = text.lower()
if BRAND.lower() in lower:
sentiment = classify_sentiment(text)
mentions[sentiment].append({
"text": text[:200],
"likes": comment.get("likes", 0),
"video_id": video_id,
})
for comp in COMPETITORS:
if comp.lower() in lower:
mentions["competitor"].append({"text": text[:200], "competitor": comp, "video_id": video_id})
date = datetime.utcnow().strftime("%Y-%m-%d")
report = {
"date": date,
"videos_scanned": min(len(videos), 20),
"positive": len(mentions["positive"]),
"negative": len(mentions["negative"]),
"neutral": len(mentions["neutral"]),
"competitor_mentions": len(mentions["competitor"]),
"top_positive": sorted(mentions["positive"], key=lambda x: x["likes"], reverse=True)[:5],
"top_negative": sorted(mentions["negative"], key=lambda x: x["likes"], reverse=True)[:5],
}
Path(f"tiktok_sentiment_{date}.json").write_text(json.dumps(report, indent=2))
print(f"Sentiment: +{report['positive']} / -{report['negative']} / ~{report['neutral']} | Competitor: {report['competitor_mentions']}")
if __name__ == "__main__":
run()Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
const BASE_URL = "https://api.scavio.dev/api/v1/tiktok";
const BRAND = "yourbrand";
const POSITIVE = ["love", "amazing", "best", "great", "awesome"];
const NEGATIVE = ["hate", "worst", "terrible", "awful", "broken"];
async function searchVideos(query) {
const res = await fetch(`${BASE_URL}/search/videos`, { method: "POST", headers: { Authorization: `Bearer ${API_KEY}`, "content-type": "application/json" }, body: JSON.stringify({ query }) });
return (await res.json()).videos ?? [];
}
async function getComments(videoId) {
const res = await fetch(`${BASE_URL}/video/comments`, { method: "POST", headers: { Authorization: `Bearer ${API_KEY}`, "content-type": "application/json" }, body: JSON.stringify({ video_id: videoId }) });
return (await res.json()).comments ?? [];
}
const videos = await searchVideos(BRAND);
let pos = 0, neg = 0, neu = 0;
for (const v of videos.slice(0, 20)) {
const comments = await getComments(v.id ?? "");
for (const c of comments) {
const lower = (c.text ?? "").toLowerCase();
if (!lower.includes(BRAND.toLowerCase())) continue;
const p = POSITIVE.filter((w) => lower.includes(w)).length;
const n = NEGATIVE.filter((w) => lower.includes(w)).length;
if (p > n) pos++; else if (n > p) neg++; else neu++;
}
}
console.log(`Sentiment: +${pos} / -${neg} / ~${neu}`);Plataformas utilizadas
TikTok
Descubrimiento de videos, creadores y productos en tendencia