Genera y publica automáticamente posts de Instagram para Liga Deportiva Universitaria de Quito: anuncio del próximo partido (con racha de los últimos cinco partidos de ambos equipos), resultado final de cada partido (con goleadores y minutos) y tabla de posiciones de la LigaPro tras cada fecha, con un diseño minimalista/futurista propio para cada competición (LigaPro, Libertadores, Sudamericana, Copa Ecuador, Supercopa Ecuador, amistosos y otras competiciones).
- Datos — API pública de ESPN (gratuita, sin clave): fechas, estadios, ciudades, logos oficiales de ambos equipos, marcadores y estado del partido, en todas las competiciones configuradas (src/config.js). Del resumen de cada partido salen además los goleadores con su minuto y la forma reciente (últimos 5) de ambos equipos; del endpoint de standings, la tabla completa de la LigaPro. ESPN no cubre la Copa Ecuador ni la Supercopa: esos partidos vienen de TheSportsDB (src/sportsdb.js), también gratuita y sin clave, incluida la definición por penales.
- Detección de cambios — data/state.json guarda qué se anunció y qué resultados ya se publicaron. En cada ejecución solo se generan posts si hay estado nuevo: un nuevo "próximo partido", un cambio de fecha/hora, o un partido recién finalizado. La tabla de posiciones se publica solo inmediatamente después de un resultado de LigaPro y solo si la tabla cambió desde la última vez (fingerprint en el estado).
- Render — cada post es una plantilla HTML (src/templates/post.js) renderizada a PNG 1080×1350 con Playwright/Chromium. Tema visual por competición.
- Publicación — Instagram Graph API oficial. Las imágenes se commitean al
repo y se publican usando su URL pública
raw.githubusercontent.com. - Automatización — GitHub Actions corre cada hora (.github/workflows/ldu-posts.yml).
npm install
npx playwright install chromium
npm run samples # renderiza demos de fixture, resultado, casos edge y tabla
npm run generate # pipeline real: ESPN → diff de estado → PNG + captionLos posts quedan en output/posts/ (PNG + caption .txt) y se encolan en
data/pending.json hasta ser publicados.
Guía paso a paso (incluye soluciones a problemas de login de Meta): docs/INSTAGRAM_SETUP.md.
Resumen: cuenta de Instagram profesional (Creator/Business) + app en
developers.facebook.com con el producto
Instagram. Se soportan los dos flujos oficiales — el nuevo "Instagram login"
(token IGAA…, sin página de Facebook) y el clásico via Facebook (token
EAA…); el host de la Graph API se detecta automáticamente.
Secrets del repositorio (Settings → Secrets and variables → Actions):
| Secret | Valor |
|---|---|
IG_USER_ID |
ID de la cuenta profesional de Instagram |
IG_ACCESS_TOKEN |
Token de acceso de larga duración |
Variable opcional IMAGE_BASE_URL si prefieres servir las imágenes desde otro
host (por defecto se usa la URL raw del propio repo — el repo debe ser
público para que Instagram pueda descargar las imágenes).
Sin estos secrets el workflow sigue funcionando: genera y commitea los posts, y los deja en cola para publicarse cuando se configuren las credenciales.
src/
config.js equipo, ligas ESPN, tipos de competición y hashtags
espn.js cliente ESPN: partidos, goleadores, forma y standings
sportsdb.js cliente TheSportsDB: Copa Ecuador y Supercopa (ESPN no las tiene)
state.js estado persistente y planificación de posts
templates/post.js plantilla HTML 1080×1350 con temas por competición
templates/standings.js plantilla de la tabla de posiciones de LigaPro
render.js HTML → PNG con Playwright
captions.js captions en español por tipo de post y resultado
publish.js publicación vía Instagram Graph API
samples.js partidos de demo para previsualizar diseños
index.js orquestador (generate | publish | cleanup | samples)