Tabla completa
Pulsa sobre el título de una columna para ordenar. Los puntos de grupos se desglosan por el motivo por el que se ganaron.
| Pos | Jugador | Total | F.Grupos | Pos.Grupos | 16avos | Octavos | Cuartos | Semis | Final |
|---|
Fortalezas de cada jugador
Ranking por habilidad: exactos, 1X2, diferencia, goles por equipo, fases del torneo…
Progresión partido a partido
Puntos acumulados tras cada partido jugado (orden cronológico)
% de partidos con puntos
iPorcentaje de partidos jugados en fase de grupos en los que sumaste al menos 1 punto. Cuenta cualquier acierto: signo (1X2), diferencia de goles o resultado exacto. El número entre paréntesis en el título indica cuántos partidos se han jugado.
Líder en solitario
iTras cada partido de grupos jugado, se mira quién encabezaba la clasificación. Solo cuenta si un único jugador lideraba (sin empatar a puntos con nadie más). El % es sobre el total de partidos de grupos ya disputados.
Desglose de aciertos (fase de grupos)
i🟢 Exacto — signo + dif. + resultado exacto (máx. 6 pts)
🔵 1X2 + Dif. — signo correcto y diferencia de goles
🟠 Solo 1X2 — solo acertó el signo (1/X/2)
⚪ 0 pts — sin ningún acierto en ese partido
Mayores diferencias (1º vs 2º)
iLas 5 mayores diferencias de puntos del líder en solitario (1º) respecto al segundo clasificado (2º) después de cualquier partido disputado en la fase de grupos.
| Dif | Partido | Jugadores (1º vs 2º) |
|---|
Mayores diferencias (1º vs último)
iLas 5 mayores diferencias de puntos entre el primer clasificado (1º) y el último clasificado después de cualquier partido disputado en la fase de grupos.
| Dif | Partido | Jugadores (1º vs último) |
|---|
Cambios de liderato 👑
iCada vez que el líder de la porra ha cambiado durante la fase de grupos. Solo se registra cuando un único jugador se coloca por primera vez en cabeza, desbancando al anterior líder en solitario.
| # | Partido | Nuevo líder | Anterior | Pts |
|---|
Ficha de cada jugador
Resumen individual de cada participante en la fase de grupos.
🆚 Cara a cara
Compara a dos jugadores lado a lado: puntos, aciertos, racha y los partidos donde uno clavó y el otro falló.
¿Cómo está hecha esta web?
Un dashboard hecho a mano para seguir la porra del Mundial 2026. Sin frameworks de frontend, sin base de datos clásica y con automatización completa de resultados vía GitHub Actions. Todo el código está abierto en GitHub.
🗂️ Arquitectura general
La web tiene dos modos de ejecución:
- Local (dev) — un servidor Flask (Python) lee el Excel de pronósticos con
openpyxl, construye eldata.jsonen memoria y lo sirve enlocalhost:5050. - Producción — GitHub Pages sirve ficheros estáticos:
index.html+data.jsonpregenerado. No hay servidor en producción.
El frontend es una SPA de una sola página. Todas las pestañas se renderizan con JS puro; no hay React, Vue ni nada similar.
⚙️ Automatización de resultados
Un workflow de GitHub Actions se ejecuta cada 5 minutos:
should_update.py— decide si vale la pena actualizar (ventana de ±2 min antes del partido hasta 6 h después). Si no hay partidos cercanos, salta el resto.fetch_results.py— llama a la API de resultados, parsea goles (incluyendo OG y penaltis), escribedata/scorers.jsonydata/live.json.excel_sync.py— vuelca los resultados al Excel del repositorio.build_static.py— regeneradata.jsony hacegit push. GitHub Pages publica automáticamente.fetch_highlights.py— busca resúmenes de DAZN en YouTube (API v3) para cada partido jugado y los inyecta endata.json.
Además, hay un backup nocturno (rama diaria) y un snapshot de visitas cada hora.
📡 API de resultados
Se usa la API pública worldcup26.ir/get/games (104 partidos).
Los campos clave son time_elapsed (minuto en juego o "finished"/"notstarted"),
home_score / away_score y las cadenas de goleadores con formato
"Nombre MM'(OG)" / "Nombre MM'(P)".
El parser en _parse_scorers() extrae jugador, minuto (incluyendo tiempo añadido
como 45'+3'), y flags de gol en propia y penalti con regex.
📊 Cálculo de puntos (en tiempo real)
La función _score_breakdown() en app.py compara el pronóstico de cada jugador con el resultado real:
- Signo 1X2 — 1 pt si aciertas victoria local, empate o victoria visitante.
- Diferencia — 2 pts adicionales si la diferencia de goles coincide.
- Resultado exacto — 3 pts adicionales si el marcador es exacto (total 6 pts).
Durante un partido en juego, data/live.json alimenta los puntos provisionales que se muestran en la clasificación con el badge animado.
🗃️ Ficheros clave
app.py— servidor Flask + toda la lógica de negocio (build_data()).fetch_results.py— cliente de la API + parser de goles.fetch_highlights.py— busca resúmenes DAZN en YouTube (API v3) con rate-limiting.fixture_data.py— fixture completo: 104 partidos, sedes, horarios ES, TV.team_players.py— jugadores destacados por selección + ficha individual (TheSportsDB).excel_sync.py— lectura/escritura del Excel de pronósticos.build_static.py— generadata.jsonestático para producción.should_update.py— guardia del workflow: evita llamadas innecesarias a la API.static/js/app.js— todo el frontend (~8 500 líneas de JS vanilla).data/live.json— partidos en juego ahora mismo (vacío cuando no hay partido).data/scorers.json— goleadores de todos los partidos finalizados.data/highlights.json— IDs de vídeos de resúmenes encontrados en YouTube.
🛠️ Stack técnico
Frontend
Backend / scripts
APIs externas
Infraestructura
Proyecto desarrollado por
Pablo Crespo Bellido
Dashboard privado para amigos · Copa Mundial FIFA 2026 · USA · CANADA · MEXICO