Aperçu
Ce workflow surveille quotidiennement les commentaires des vidéos TikTok pour les mentions de marque et les signaux de sentiment. Il recherche des vidéos mentionnant votre marque, récupère leurs commentaires, classe les mentions en positives, négatives ou neutres, et suit les mentions des concurrents. Le résultat est un rapport de sentiment quotidien qui remplace les outils d'écoute sociale coûtant plus de 500 $/mois.
Déclencheur
Planification Cron (quotidien à 9h00 UTC)
Planification
S'exécute quotidiennement à 9h00 UTC
Étapes du workflow
Rechercher des vidéos liées à la marque
Utiliser l'API Scavio TikTok search/videos pour trouver des vidéos récentes mentionnant votre marque ou produit.
Récupérer les commentaires pour chaque vidéo
Appeler l'endpoint video/comments pour chaque vidéo pertinente afin d'obtenir des données structurées des commentaires.
Filtrer les mentions de marque
Analyser le texte des commentaires pour les mots-clés de marque, les noms de concurrents et les indicateurs de sentiment.
Classifier le sentiment
Utiliser la correspondance de mots-clés pour classer chaque mention comme positive, négative ou neutre en fonction des mots contextuels.
Générer un rapport de sentiment quotidien
Compiler le nombre de mentions, la répartition des sentiments et les commentaires notables dans un rapport quotidien.
Implémentation 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()Implémentation 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}`);Plateformes utilisées
TikTok
Découverte de vidéos tendance, créateurs et produits