Las campañas de hashtags de TikTok necesitan un seguimiento continuo para medir el alcance, el compromiso y la participación de los creadores. La verificación manual no es práctica cuando una campaña involucra a docenas de creadores. Este tutorial crea un canal de monitoreo automatizado de hashtags utilizando la API Scavio TikTok que rastrea las vistas totales, los nuevos envíos de videos, las métricas de participación y el contenido de mejor rendimiento. Cada llamada a la API cuesta 1 crédito ($0,005) y una verificación de campaña completa utiliza entre 2 y 3 créditos.
Requisitos previos
- Python 3.9+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Un hashtag de campaña para monitorear
Guia paso a paso
Paso 1: Obtenga estadísticas generales de hashtag
Obtenga las estadísticas generales del hashtag de su campaña: vistas totales, videos totales y el ID del hashtag. Esto le brinda las métricas de campaña de nivel superior.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
TIKTOK_URL = 'https://api.scavio.dev/api/v1/tiktok'
def get_hashtag_stats(hashtag: str) -> dict:
resp = requests.post(f'{TIKTOK_URL}/hashtag',
headers={'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'},
json={'hashtag': hashtag})
resp.raise_for_status()
data = resp.json().get('data', {})
return {
'hashtag': hashtag,
'id': data.get('id', ''),
'view_count': data.get('stats', {}).get('view_count', 0),
'video_count': data.get('stats', {}).get('video_count', 0)
}
stats = get_hashtag_stats('yourcampaign')
print(f'#{stats["hashtag"]}: {stats["view_count"]:,} views, {stats["video_count"]:,} videos')Paso 2: Busque vídeos recientes con el hashtag
Obtenga los últimos videos publicados con el hashtag de su campaña. Esto muestra la actividad de la campaña en tiempo real y la participación de los creadores.
def get_hashtag_videos(hashtag: str, count: int = 30) -> list:
resp = requests.post(f'{TIKTOK_URL}/hashtag/posts',
headers={'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'},
json={'hashtag': hashtag, 'count': count, 'cursor': 0})
resp.raise_for_status()
videos = resp.json().get('data', {}).get('videos', [])
return [{
'id': v.get('id', ''),
'author': v.get('author', {}).get('uniqueId', ''),
'author_followers': v.get('author', {}).get('stats', {}).get('followerCount', 0),
'desc': v.get('desc', ''),
'plays': v.get('stats', {}).get('playCount', 0),
'likes': v.get('stats', {}).get('diggCount', 0),
'comments': v.get('stats', {}).get('commentCount', 0),
'shares': v.get('stats', {}).get('shareCount', 0),
'create_time': v.get('createTime', 0)
} for v in videos]
videos = get_hashtag_videos('yourcampaign')
print(f'Found {len(videos)} recent videos')
for v in videos[:3]:
print(f' @{v["author"]}: {v["plays"]:,} plays, {v["likes"]:,} likes')Paso 3: Calcular métricas de participación en la campaña
Calcule métricas de participación agregadas en todos los videos de la campaña: alcance total, tasa de participación promedio y distribución de la participación.
import statistics
def campaign_metrics(videos: list) -> dict:
if not videos:
return {'total_reach': 0, 'avg_engagement': 0}
total_plays = sum(v['plays'] for v in videos)
total_likes = sum(v['likes'] for v in videos)
total_comments = sum(v['comments'] for v in videos)
total_shares = sum(v['shares'] for v in videos)
eng_rates = [
(v['likes'] + v['comments'] + v['shares']) / max(v['plays'], 1) * 100
for v in videos
]
unique_creators = len(set(v['author'] for v in videos))
return {
'total_videos': len(videos),
'unique_creators': unique_creators,
'total_reach': total_plays,
'total_engagement': total_likes + total_comments + total_shares,
'avg_engagement_rate': round(statistics.mean(eng_rates), 2),
'median_engagement_rate': round(statistics.median(eng_rates), 2),
'total_likes': total_likes,
'total_comments': total_comments,
'total_shares': total_shares
}
metrics = campaign_metrics(videos)
for k, v in metrics.items():
print(f'{k}: {v:,}' if isinstance(v, int) else f'{k}: {v}')Paso 4: Identificar contenidos y creadores de alto rendimiento
Clasifica vídeos y creadores por rendimiento para identificar el mejor contenido y los participantes más valiosos de la campaña.
def top_performers(videos: list) -> dict:
# Top videos by engagement
by_engagement = sorted(videos,
key=lambda v: v['likes'] + v['comments'] + v['shares'], reverse=True)
# Top creators by total plays across their videos
creator_plays = {}
for v in videos:
creator_plays.setdefault(v['author'], 0)
creator_plays[v['author']] += v['plays']
top_creators = sorted(creator_plays.items(), key=lambda x: x[1], reverse=True)
return {
'top_videos': [{
'author': v['author'],
'plays': v['plays'],
'likes': v['likes'],
'desc': v['desc'][:60]
} for v in by_engagement[:5]],
'top_creators': [{
'username': c[0],
'total_plays': c[1]
} for c in top_creators[:5]]
}
performers = top_performers(videos)
print('Top videos:')
for v in performers['top_videos']:
print(f' @{v["author"]}: {v["plays"]:,} plays, {v["likes"]:,} likes')
print('Top creators:')
for c in performers['top_creators']:
print(f' @{c["username"]}: {c["total_plays"]:,} total plays')Paso 5: Cree un seguimiento diario con seguimiento histórico
Guarde instantáneas diarias para realizar un seguimiento del crecimiento de la campaña a lo largo del tiempo. Compare las métricas de hoy con las de ayer para ver el progreso diario.
import json
from datetime import date
def daily_campaign_report(hashtag: str) -> dict:
stats = get_hashtag_stats(hashtag)
videos = get_hashtag_videos(hashtag, count=30)
metrics = campaign_metrics(videos)
performers = top_performers(videos)
report = {
'date': date.today().isoformat(),
'hashtag': hashtag,
'overview': stats,
'metrics': metrics,
'top_performers': performers,
'credits_used': 2
}
# Save and compare with previous
history_file = f'campaign_{hashtag}_history.json'
try:
with open(history_file) as f:
history = json.load(f)
except FileNotFoundError:
history = []
history.append(report)
with open(history_file, 'w') as f:
json.dump(history, f, indent=2)
if len(history) > 1:
prev = history[-2]
view_delta = stats['view_count'] - prev['overview']['view_count']
print(f'Daily growth: +{view_delta:,} views')
print(f'Campaign #{hashtag}: {stats["view_count"]:,} total views, '
f'{metrics["unique_creators"]} creators, {metrics["avg_engagement_rate"]}% avg engagement')
return report
# daily_campaign_report('yourcampaign')Ejemplo en Python
import os, requests, statistics
API_KEY = os.environ['SCAVIO_API_KEY']
TT = 'https://api.scavio.dev/api/v1/tiktok'
def tiktok(endpoint, body):
return requests.post(f'{TT}/{endpoint}',
headers={'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'},
json=body).json()
def monitor_hashtag(hashtag):
stats = tiktok('hashtag', {'hashtag': hashtag}).get('data', {})
videos = tiktok('hashtag/posts', {'hashtag': hashtag, 'count': 30, 'cursor': 0})
vids = videos.get('data', {}).get('videos', [])
total_plays = sum(v.get('stats', {}).get('playCount', 0) for v in vids)
creators = len(set(v.get('author', {}).get('uniqueId', '') for v in vids))
print(f'#{hashtag}: {stats.get("stats", {}).get("view_count", 0):,} views')
print(f' Recent: {len(vids)} videos, {creators} creators, {total_plays:,} plays')
print(f' Cost: 2 credits ($0.01)')
monitor_hashtag('yourcampaign')Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const TT = 'https://api.scavio.dev/api/v1/tiktok';
async function tiktokApi(endpoint, body) {
const resp = await fetch(`${TT}/${endpoint}`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(body)
});
return resp.json();
}
async function monitorHashtag(hashtag) {
const stats = await tiktokApi('hashtag', { hashtag });
const videos = await tiktokApi('hashtag/posts', { hashtag, count: 30, cursor: 0 });
const vids = videos.data?.videos || [];
const plays = vids.reduce((s, v) => s + (v.stats?.playCount || 0), 0);
const creators = new Set(vids.map(v => v.author?.uniqueId)).size;
console.log(`#${hashtag}: ${vids.length} videos, ${creators} creators, ${plays.toLocaleString()} plays`);
}
monitorHashtag('yourcampaign').catch(console.error);Salida esperada
#yourcampaign: 2,450,000 views, 1,234 videos
Found 30 recent videos
@creator1: 145,000 plays, 12,300 likes
@creator2: 89,000 plays, 7,800 likes
@creator3: 67,000 plays, 5,400 likes
total_videos: 30
unique_creators: 22
total_reach: 1,234,000
avg_engagement_rate: 8.45
Daily growth: +45,000 views
Cost: 2 credits ($0.01)