301 lines
6.9 KiB
Markdown
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 ✅
|