TubeScript-API/SOLUCION_HTTP_429_RATE_LIMITING.md

301 lines
6.9 KiB
Markdown

# 🔧 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:
```python
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:**
1. Instala la extensión: [Get cookies.txt LOCALLY](https://chrome.google.com/webstore)
2. Ve a youtube.com y asegúrate de estar logueado
3. Haz clic en el icono de la extensión
4. Clic en "Export" → "Export cookies.txt"
**Firefox:**
1. Instala el addon: [cookies.txt](https://addons.mozilla.org/firefox/addon/cookies-txt/)
2. Ve a youtube.com
3. Haz clic en el icono del addon
4. Guarda el archivo
#### Paso 2: Colocar el archivo cookies.txt
```bash
# 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
```bash
docker-compose restart
```
### Opción 2: Esperar y Reintentar
Si no quieres usar cookies, simplemente espera unos minutos antes de volver a intentar.
```bash
# Espera 5-10 minutos
# Luego intenta nuevamente
```
### Opción 3: Usar una VPN o Cambiar IP
Si YouTube bloqueó tu IP:
1. Conecta a una VPN
2. O reinicia tu router para obtener nueva IP
3. Intenta nuevamente
### Opción 4: Usar Proxy
Configura yt-dlp para usar un proxy:
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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:
```python
response = requests.get(sub_url, timeout=30)
if response.status_code != 200:
return None, f"Error HTTP {response.status_code}"
```
### Después:
```python
# 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:
```bash
# 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:
1. **Verifica tu conexión**: `ping youtube.com`
2. **Prueba otro video**: Algunos videos tienen más restricciones
3. **Actualiza yt-dlp**: `docker exec tubescript_api pip install --upgrade yt-dlp`
4. **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 ✅