Web Scraping / Computer Vision

Bot QR de ¿Quién?

Me cansé de abrir la app de ¿Quién? cada vez para sacar el QR de fidelidad. Hice un bot de Telegram que lo hace automáticamente y de paso genera videos con el QR integrado en la interfaz.

El problema real

Usar la app de ¿Quién? es una mierda. Tarda en cargar, tienes que hacer login, navegar por menús, y al final solo quieres el puto QR para pagar. Pensé: "esto se puede automatizar".

Flujo manual: Abrir app → Login → Menú → Fidelidad → Mostrar QR → 45 segundos perdidos

La idea era simple: mandar un mensaje al bot con mi email y contraseña, y que me devuelva el QR. Punto.

Cómo lo resolví

4 hrs Tiempo desarrollo
2 Comandos
~400 Líneas de código

Opción 1: Solo el QR

/log email@demicuenta.com micontraseña

Web scraping con Playwright que hace login automático y extrae el QR del canvas. Eeeeasy peasy 🥸

Opción 2: Video con el QR

/video email@demicuenta.com micontraseña

Lo mismo pero integra el QR en un video que grabé desde mi móvil en la app. Yo que sé, me daba palo ir con la foto de un qr al cajero y esperar a que se abra la app de ¿Quién?

Resultado: De 45 segundos a 20 segundos.

Stack técnico

Python + Aiogram
Para el bot de Telegram. Aiogram porque es async y no me da problemas.
Playwright
Para el web scraping. Más robusto que Selenium y mejor para SPAs.
OpenCV + PIL
Computer vision para detectar dónde está el QR en el video y reemplazarlo.
Canvas extraction
El QR está en un canvas. Inyecto JS para extraer los datos directamente.

Los 'problemas' que me encontré

1. Extracción del QR

El portal web de ¿Quién? renderiza el QR en un canvas. No es una imagen normal que puedas descargar. Tuve que inyectar JavaScript para extraer los datos:

const canvas = document.querySelector('canvas'); return canvas.toDataURL('image/png');

2. Detección automática en el video

Para el video, necesitaba detectar dónde está el QR original en el template para reemplazarlo. Implementé un sistema en cascada:

1. cv2.QRCodeDetector() - Detección nativa de OpenCV 2. Búsqueda de contornos cuadrados - Fallback geométrico 3. Posición manual - Si todo falla, centro-superior

Funciona el 90% de las veces con detección automática. El resto usa el fallback manual.

3. Integración natural del QR

Para que no se vea fake, añadí efectos sutiles:

  • Fade-in en los primeros frames
  • Breathing effect con variación de brillo
  • Fondo blanco coherente con la UI

Cómo funciona por dentro

El flujo completo cuando mandas /video email contraseña:

1. Playwright abre Chrome headless 2. Navega a ¿Cuál url? 3. Rellena credenciales y hace login 4. Extrae QR del canvas → bytes en memoria 5. OpenCV procesa el video template frame por frame 6. Detecta la región del QR original 7. Lo reemplaza con el QR extraído 8. Aplica efectos visuales 9. Genera MP4 final 10. Lo envía por Telegram 11. Borra archivos temporales

Tarda unos 10-15 segs si tus datos no son 2G. 💃

Qué aprendí

Este proyecto me enseñó varias cosas:

  • Web scraping moderno: Las SPAs requieren herramientas como Playwright, no vale con requests y BeautifulSoup.
  • Computer vision práctica: OpenCV es potente pero hay que implementar fallbacks para casos edge.
  • UX en bots: El feedback en tiempo real es crucial. La gente se impacienta si no sabe qué está pasando.
  • Manejo de errores: Un bot en producción falla de mil maneras. Hay que manejar todo gracefully.

Al final es una herramienta que uso regularmente. Cumple su función: me ahorra tiempo en algo tedioso y de paso practiqué web scraping con SPAs y computer vision. No es el proyecto más revolucionario del mundo, pero resuelve un problema real que tenía. 🥳