6.9 KiB
🔧 Solución para Error HTTP 429 - Rate Limiting de YouTube
❌ Problema
{"detail":"Error al descargar subtítulos desde YouTube (HTTP 429). El video puede tener restricciones."}
HTTP 429 significa "Too Many Requests" - YouTube está limitando las peticiones desde tu IP.
✅ Soluciones Implementadas
1. Sistema de Retry Automático
El sistema ahora intenta automáticamente 3 veces con espera incremental:
- Intento 1: Inmediato
- Intento 2: Espera 2 segundos
- Intento 3: Espera 4 segundos
2. Headers de Navegador
Se agregaron headers que simulan un navegador real:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'es-ES,es;q=0.9,en;q=0.8',
'Referer': 'https://www.youtube.com/',
}
3. Mensajes de Error Mejorados
Ahora el sistema proporciona mensajes específicos para cada error:
- HTTP 429: Rate limiting - espera y agrega cookies
- HTTP 403: Restricciones geográficas o de edad
- HTTP 404: Subtítulos no disponibles
- Timeout: Problema de conexión
🚀 Soluciones Adicionales
Opción 1: Usar Cookies de YouTube (RECOMENDADO)
Las cookies autenticadas evitan el rate limiting.
Paso 1: Exportar Cookies desde tu Navegador
Chrome/Edge:
- Instala la extensión: Get cookies.txt LOCALLY
- Ve a youtube.com y asegúrate de estar logueado
- Haz clic en el icono de la extensión
- Clic en "Export" → "Export cookies.txt"
Firefox:
- Instala el addon: cookies.txt
- Ve a youtube.com
- Haz clic en el icono del addon
- Guarda el archivo
Paso 2: Colocar el archivo cookies.txt
# Copiar el archivo descargado al directorio del proyecto
cp ~/Downloads/cookies.txt /path/to/TubeScript-API/cookies.txt
# Dar permisos correctos
chmod 600 cookies.txt
Paso 3: Reiniciar los contenedores
docker-compose restart
Opción 2: Esperar y Reintentar
Si no quieres usar cookies, simplemente espera unos minutos antes de volver a intentar.
# Espera 5-10 minutos
# Luego intenta nuevamente
Opción 3: Usar una VPN o Cambiar IP
Si YouTube bloqueó tu IP:
- Conecta a una VPN
- O reinicia tu router para obtener nueva IP
- Intenta nuevamente
Opción 4: Usar Proxy
Configura yt-dlp para usar un proxy:
# Edita docker-compose.yml y agrega:
environment:
- HTTP_PROXY=http://tu-proxy:puerto
- HTTPS_PROXY=http://tu-proxy:puerto
🧪 Probar la Solución
Test 1: Sin Cookies
# Probar endpoint
curl -X GET "http://localhost:8080/transcript/CSlg5S9yL2E?lang=es"
Si falla con 429, espera 2 minutos y vuelve a intentar.
Test 2: Con Cookies
# Después de agregar cookies.txt
docker-compose restart
# Probar nuevamente
curl -X GET "http://localhost:8080/transcript/CSlg5S9yL2E?lang=es"
Test 3: Verificar Cookies en el Contenedor
# Verificar que cookies.txt esté presente
docker exec tubescript_api ls -lh cookies.txt
# Ver contenido (primeras líneas)
docker exec tubescript_api head -5 cookies.txt
🔍 Identificar el Problema
Ver Logs Detallados
# Logs del API
docker logs tubescript_api 2>&1 | tail -50
# Logs de Streamlit
docker logs streamlit_panel 2>&1 | tail -50
Probar Manualmente con yt-dlp
# Entrar al contenedor
docker exec -it tubescript_api /bin/bash
# Probar yt-dlp directamente
yt-dlp --dump-json --skip-download \
--write-auto-subs --sub-format json3 --sub-langs "es.*" \
"https://www.youtube.com/watch?v=CSlg5S9yL2E"
# Con cookies
yt-dlp --cookies cookies.txt --dump-json --skip-download \
--write-auto-subs --sub-format json3 --sub-langs "es.*" \
"https://www.youtube.com/watch?v=CSlg5S9yL2E"
⚠️ Prevención de Rate Limiting
1. No Hacer Peticiones Excesivas
Evita hacer decenas de peticiones seguidas. YouTube detecta esto como abuso.
2. Usar Cookies Siempre
Las cuentas autenticadas tienen límites más altos.
3. Caché de Respuestas
Implementar un sistema de caché para no pedir los mismos subtítulos repetidamente.
4. Espaciar las Peticiones
Si haces múltiples peticiones, espera al menos 1-2 segundos entre cada una.
📊 Códigos de Error HTTP
| Código | Significado | Solución |
|---|---|---|
| 429 | Too Many Requests | Esperar + agregar cookies |
| 403 | Forbidden | Restricciones geográficas/cookies |
| 404 | Not Found | Subtítulos no disponibles |
| 503 | Service Unavailable | YouTube caído temporalmente |
🛠️ Mejoras Implementadas en el Código
Antes:
response = requests.get(sub_url, timeout=30)
if response.status_code != 200:
return None, f"Error HTTP {response.status_code}"
Después:
# Headers de navegador
headers = {
'User-Agent': 'Mozilla/5.0...',
'Accept': 'application/json, text/plain, */*',
'Referer': 'https://www.youtube.com/',
}
# Retry con espera incremental
max_retries = 3
for attempt in range(max_retries):
response = requests.get(sub_url, headers=headers, timeout=30)
if response.status_code == 200:
break
elif response.status_code == 429:
if attempt < max_retries - 1:
time.sleep(2 * (attempt + 1)) # 2s, 4s, 6s
continue
return None, "Rate limiting - agrega cookies.txt"
# ... otros casos
💡 Recomendaciones
Para Uso Personal/Desarrollo
✅ Usar cookies.txt de tu cuenta de YouTube ✅ No hacer más de 10-15 peticiones por minuto ✅ Reiniciar servicios si cambias cookies
Para Producción
✅ Implementar caché de subtítulos ✅ Usar múltiples IPs rotativas ✅ Considerar YouTube Data API oficial (con cuota) ✅ Implementar rate limiting en tu API
🔄 Actualizar el Sistema
Si ya tienes el sistema corriendo, actualiza con:
# Detener servicios
docker-compose down
# Reconstruir con los cambios
docker-compose build --no-cache
# Iniciar nuevamente
docker-compose up -d
# Verificar logs
docker-compose logs -f
📞 Soporte Adicional
Si el problema persiste después de aplicar estas soluciones:
- Verifica tu conexión:
ping youtube.com - Prueba otro video: Algunos videos tienen más restricciones
- Actualiza yt-dlp:
docker exec tubescript_api pip install --upgrade yt-dlp - Revisa los logs completos:
docker logs tubescript_api 2>&1 | grep -i error
✅ Checklist de Solución
- Agregar cookies.txt al proyecto
- Reiniciar contenedores Docker
- Verificar que cookies.txt esté en el contenedor
- Probar endpoint nuevamente
- Esperar 5 minutos si sigue fallando
- Verificar logs para otros errores
- Probar con otro video
- Actualizar yt-dlp si es necesario
TubeScript API Pro © 2026
Solución de Rate Limiting Implementada ✅