🎓 Primer commit: estructura del proyecto y material de estudio del Curso de Vóley

This commit is contained in:
Ricardo Monla
2026-05-02 19:08:29 -03:00
commit 9a3adc811e
103 changed files with 27967 additions and 0 deletions
+237
View File
@@ -0,0 +1,237 @@
# HALLAZGOS - Descarga del Curso de Vóley (Online Education Center)
> Última actualización: 2026-05-02
## Información del Curso
- **Plataforma**: Online Education Center (similar a Moodle, usa Auth0 para login)
- **URL base del campus**: `https://voley.onlineeducation.center/es/campus/student/training/e/14197`
- **Usuario**: `saldis_karina@hotmail.com`
- **Contraseña**: `Martes13#`
- **Estado**: Curso finalizado
## Estructura del Curso
El curso tiene **2 Módulos** con **11 secciones** en total.
### Módulo 1 (m/19096) - PLANIFICACIÓN
| Sección | ID | URL |
|---|---|---|
| PLANIFICACION | s/34868 | `/es/campus/student/training/e/14197/m/19096/s/34868/study-resources/list` |
| PREPARACION ATLETICA | s/34869 | `/es/campus/student/training/e/14197/m/19096/s/34869/study-resources/list` |
| EXPLICACION DEL TRABAJO PRACTICO A PRESENTAR | s/34870 | `/es/campus/student/training/e/14197/m/19096/s/34870/study-resources/list` |
| SEGUIMIENTOS DE EQUIPOS | s/35523 | `/es/campus/student/training/e/14197/m/19096/s/35523/study-resources/list` |
| ANALISIS DE EQUIPOS DE VOLEIBOL | s/35524 | `/es/campus/student/training/e/14197/m/19096/s/35524/study-resources/list` |
| ANALISIS DE EQUIPOS DE VOLEIBOL 2 | s/35525 | `/es/campus/student/training/e/14197/m/19096/s/35525/study-resources/list` |
| TRABAJO PRACTICO FINAL DE LA UNIDAD | s/35526 | `/es/campus/student/training/e/14197/m/19096/s/35526/study-resources/list` |
### Módulo 2 (m/19097) - ENTRENAMIENTO
| Sección | ID | URL |
|---|---|---|
| ENTRENAMIENTO DE LOS CENTRALES Y OPUESTOS/AS | s/35519 | `/es/campus/student/training/e/14197/m/19097/s/35519/study-resources/list` |
| PUNTAS Y LIBEROS/AS | s/35520 | `/es/campus/student/training/e/14197/m/19097/s/35520/study-resources/list` |
| ENTRENAMIENTO DE LOS Y LAS ARMADORAS | s/35521 | `/es/campus/student/training/e/14197/m/19097/s/35521/study-resources/list` |
| EXPLICACION DEL TRABAJO PRACTICO A PRESENTAR | s/35522 | `/es/campus/student/training/e/14197/m/19097/s/35522/study-resources/list` |
## Recursos Encontrados
### 📹 Videos (Vimeo) - 23 videos + algunos adicionales
Los videos están embebidos via iframes de Vimeo. No se descargaron directamente, solo se guardaron referencias. IDs de Vimeo encontrados:
| # | ID de Vimeo | Sección |
|---|---|---|
| 1 | `919369433` | Centrales_y_Oponentes |
| 2 | `1179197191` | Centrales_y_Oponentes |
| 3 | `919341704` | Centrales_y_Oponentes |
| 4 | `919342668` | Centrales_y_Oponentes |
| 5 | `919346562` | Centrales_y_Oponentes |
| 6 | `919347866` | Centrales_y_Oponentes |
| 7 | `919348493` | Centrales_y_Oponentes |
| 8 | `919351892` | Centrales_y_Oponentes |
| 9 | `919352848` | Centrales_y_Oponentes |
| 10 | `919353448` | Centrales_y_Oponentes |
| 11 | `919354134` | Centrales_y_Oponentes |
| 12 | `919355668` | Centrales_y_Oponentes |
| 13 | `919356423` | Centrales_y_Oponentes |
| 14 | `919357109` | Centrales_y_Oponentes |
| 15 | `919358607` | Centrales_y_Oponentes |
| 16 | `919359386` | Centrales_y_Oponentes |
| 17 | `919359855` | Centrales_y_Oponentes |
| 18 | `919360318` | Centrales_y_Oponentes |
| 19 | `919363158` | Centrales_y_Oponentes |
| 20 | `919363728` | Centrales_y_Oponentes |
| 21 | `919364522` | Centrales_y_Oponentes |
| 22 | `919365485` | Centrales_y_Oponentes |
| 23 | `919366263` | Centrales_y_Oponentes |
Adicionalmente, otras secciones también tienen videos (Planificacion 1, Prep Atletica 3, Explicacion TP 1, Puntas y Liberos 12, Entrenamiento Armadoras 1, Explicacion TP 1).
### 📄 Archivos/Documentos
Se detectaron enlaces a recursos del curso:
- **"Abrir Archivo"** (disparan descarga nativa del navegador): IDs de recurso como `46874`, `46805`, `46926`, `50320`, `52903`, `46723`, `46724`, `53012`, `53137`, `53138`, `53139`, `46719`, `50329`, `46726`, `46725`, `53173`
- **"Abrir Enlace"** (redirigen a una página web): IDs como `46541`, `50142`, `50145`, `50144`, `50139`, `50140`, `50143`, `50141`
Los "Abrir Enlace" ya están capturados como HTML en los archivos `pagina.html` de cada sección.
### 🖼️ Imágenes
- Logo del curso
- Avatar de usuario por defecto
- Logo de OEC
## Autenticación
La plataforma usa **Auth0** como proveedor de identidad con Authorization Code Flow.
| Parámetro | Valor |
|---|---|
| Auth0 Domain | `auth.onlineeducation.center` |
| Client ID | `FelVoKUCb9QqtTFMSI2cggCbcw1klBbB` |
| Callback URL | `https://voley.onlineeducation.center/auth0/callback` |
| Tenant | `onlineeducationcenter` |
| Subdomain | `voley` |
| Database Connection | `Username-Password-Authentication` |
| Response Type | `code` (Authorization Code Flow) |
| Scope | `openid profile email` |
### Flujo de autenticación
1. GET a la URL del curso → redirige al login de Auth0
2. Login via `webAuth.login()` con `realm`, `username`, `password` + captcha
3. Auth0 redirige al `callbackURL` con un `code`
4. El servidor canjea el code por tokens y establece cookies de sesión
### Notas sobre acceso programático
- **ROPG (Resource Owner Password Grant)**: No disponible (responde `access_denied`)
- **Endpoint `/co/authenticate`**: Requiere origin header específico + captcha
- **Login vía Playwright**: Funciona correctamente. Las cookies se guardan en `session.json` para reuso
- **Sesión guardada**: Se puede reutilizar en ejecuciones posteriores automáticamente
## Contenido Descargado
### Directorio: `descargar-curso/descargas/`
```
descargas/
├── secciones/
│ ├── Modulo_1_Planificacion/
│ │ ├── Planificacion/
│ │ │ ├── pagina.html (HTML completo de la página)
│ │ │ ├── contenido.md (Texto extraído como Markdown)
│ │ │ ├── recursos.json (Lista de recursos encontrados)
│ │ │ ├── videos.md (Referencias a videos Vimeo)
│ │ │ ├── archivo_*.bin/html (Archivos descargados)
│ │ │ └── screenshot.png
│ │ ├── Preparacion_Atletica/ (misma estructura)
│ │ ├── Explicacion_TP/
│ │ ├── Seguimientos_Equipos/
│ │ ├── Analisis_Equipos_1/
│ │ ├── Analisis_Equipos_2/
│ │ └── TP_Final_Unidad/
│ └── Modulo_2_Entrenamiento/
│ ├── Centrales_y_Oponentes/ (misma estructura)
│ ├── Puntas_y_Liberos/
│ ├── Entrenamiento_Armadoras/
│ └── Explicacion_TP/
├── campus/ (páginas generales del campus)
├── subpaginas/ (otras páginas navegadas)
├── imagenes/ (imágenes descargadas)
├── videos/ (referencias a videos)
├── enlaces_encontrados.json
├── recursos_encontrados.json
└── resultado_descarga.json (reporte de la ejecución)
```
## Herramientas
### Script principal
- **Archivo**: `descargar-curso/download_course.mjs`
- **Runtime**: Node.js 20.20.1 con Playwright
- **Navegador**: Chromium headless
- **Dependencias**: `npm install playwright`, `npx playwright install chromium`
### Cómo ejecutar
```bash
cd descargar-curso
node download_course.mjs
```
### Archivos del proyecto
| Ruta | Propósito |
|---|---|
| `docs/CREDs.md` | Credenciales de acceso |
| `docs/HALLAZGOS.md` | Este archivo (documentación) |
| `descargar-curso/download_course.mjs` | Script principal de descarga |
| `descargar-curso/descargas/` | Contenido descargado del curso |
| `descargar-curso/session.json` | Cookies de sesión guardadas (para reuso) |
| `descargar-curso/package.json` | Dependencias Node.js |
## Pendiente / Mejoras Posibles
### 1. Descargar los PDFs/archivos reales
Los enlaces "Abrir Archivo" disparan una descarga nativa del navegador (Content-Disposition: attachment). Playwright lo maneja con el evento `download`, pero los selectores no coinciden exactamente (el href contiene query params). Solución: buscar el `<a>` por texto "Abrir Archivo" en lugar de por href exacto.
### 2. Descargar videos de Vimeo
Los videos están en Vimeo embebidos. Para descargarlos:
```bash
# Probar descarga directa (si el video es público)
yt-dlp "https://player.vimeo.com/video/{ID}"
# Si requiere autenticación, pasar cookies
yt-dlp --cookies ../session.json "https://player.vimeo.com/video/{ID}"
```
### 3. Extraer mejor el contenido textual
- El extractor de texto actual toma todo el texto visible del panel principal
- Se podría mejorar parseando el HTML para identificar: títulos, párrafos, listas, tablas
- Convertir a Markdown estructurado con formato
### 4. Dashboard HTML local
- Generar un `index.html` que funcione offline con enlaces a todas las secciones
- Que muestre el árbol del curso y permita navegar localmente
### 5. Descargar más páginas del curso
Solo se descargaron las 11 URLs de las secciones. Hay otras páginas del campus:
- Información general del curso
- Auditorio (webinars grabados)
- Foros
- Evaluaciones
- Trabajos prácticos
- Calificaciones
- Certificaciones
### 6. Almacenamiento de sesión
Las cookies de sesión expiran eventualmente. El script guarda `session.json` automáticamente después del login. Si la sesión expira, el script detecta la redirección al login y vuelve a autenticar.
## Comandos Útiles
```bash
# Ver todos los archivos descargados
find descargas -type f | sort
# Contar recursos por tipo
echo "HTML:" $(find descargas -name "pagina.html" | wc -l)
echo "Markdown:" $(find descargas -name "contenido.md" | wc -l)
echo "Videos ref:" $(find descargas -name "videos.md" | wc -l)
echo "JSON:" $(find descargas -name "recursos.json" | wc -l)
# Ver tamaño total
du -sh descargas/
# Limpiar descargas y empezar de nuevo
rm -rf descargas/* session.json
# Descargar un video de Vimeo (requiere yt-dlp)
yt-dlp "https://player.vimeo.com/video/919369433"
```
## Observaciones Técnicas
- **Auth0**: Usa captcha en el login. Playwright lo maneja porque lo renderiza en un contenedor oculto y el captcha de Auth0 no siempre se muestra para usuarios de confianza.
- **CORS/CSRF**: Los endpoints requieren headers específicos (Origin, Referer). Playwright los maneja automáticamente.
- **Rate limiting**: No se observó límite durante la ejecución. Se recomienda mantener delays de 1-2 segundos entre requests por cortesía.
- **Vimeo**: Los videos pueden requerir autenticación (el curso es privado). Si `yt-dlp` falla sin cookies, probar con `--cookies session.json`.
- **"Abrir Archivo" vs "Abrir Enlace"**: Los "Archivo" son descargas reales (PDF, DOC, etc.), los "Enlace" son páginas web con contenido ya capturado en `pagina.html`.
```