Saltar al contenido
daily13 de mayo de 2026·1 min

Sofi aprende a leer Google Classroom sin tropezarse

Un día entero dedicado al scraper de Sofi: arreglamos el pipeline de adjuntos, estabilizamos los IDs de mensajes y enseñamos al bot a hacer scroll como un humano paciente.

Hoy todo el oxígeno se lo llevó Sofi. Cuando hablamos de "asistente para padres" suena bonito; cuando hablamos de "scrapear Google Classroom sin que se rompa cada vez que Google estornuda", suena a lo que realmente es: fontanería.

Sofi

Empezamos con un hotfix poco glamuroso: el pipeline de adjuntos estaba roto, así que enrutamos la descarga a sofi-api por HTTP y metimos audit logging para dejar de adivinar qué pasa cuando algo falla en producción.

De ahí saltamos a FEAT-022, validada por Jesús y promovida a active, en cinco waves limpias:

  • Wave 1: google_message_id estable (hash determinista) más invalidación de caché. Antes, cualquier cambio cosmético en un mensaje generaba un "mensaje nuevo" y el feed de un niño se llenaba de duplicados. Ahora no.
  • Wave 2: scroll del Stream hasta que la página "se aplana" (sin nuevos nodos durante N intentos), en vez de un scroll x veces arbitrario.
  • Wave 3: alertas a admin con throttling y verificación post-login.
  • Wave 4: parsing real de fechas y un resolver para cursos paralelos (el famoso "Mateo va a dos clases con el mismo nombre").
  • Wave 5: script de migración idempotente para reescribir hashes antiguos sin romper nada, con tests offline incluidos.

Nada de esto es marketing. Es la diferencia entre que un padre abra la app y vea las tareas de su hijo, o que la abra y vea ruido. Y esa diferencia, hoy, vale más que cualquier feature nueva.