Este repositorio contiene el script que utilicé para vencer al juego de mecanografía en línea typeracer, encabezando la clasificación con unas palabras por minuto inhumanas de casi 450.
No recomiendo usar este script en typeracer, va en contra de los TOS (tu cuenta será prohibida, al igual que la mía) y contamina la tabla de clasificación de otros jugadores reales. En cambio, encuentro este proyecto simplemente como un experimento interesante y una experiencia de aprendizaje.
Para cualquiera que tenga curiosidad, a continuación describo cada paso del proceso. Tenga en cuenta que es posible que este método en particular ya no funcione en el futuro, ya que typeracer puede (y debería) cambiar el procedimiento de validación del usuario. Puedo confirmar que este script estará funcionando a partir del 16 de febrero de 2020.
En realidad, escribir la carrera automáticamente es tan simple como extraer el texto del DOM y enviar el conjunto correcto de eventos clave de JavaScript.
Si bien la velocidad de tu carrera está determinada por el intervalo de tiempo entre las pulsaciones falsas de teclas (que puede ser arbitrariamente bajo), parece que si en algún momento tus palabras por minuto superan los 450, eres expulsado del juego. Por lo tanto, existe un límite superior de palabras por minuto que el script puede obtener. Para lograr 445 palabras por minuto (el máximo que pude obtener), las pulsaciones de teclas se separaron en intervalos de tiempo aleatorios entre 22,5 ms y 26,5 ms.
Después de un WPM suficientemente alto (>100), se le presenta un captcha de imagen que no tiene una forma puramente textual en ninguna parte del lado del cliente; este es el verdadero desafío.
Para validar su puntuación, debe poder completar el captcha en un tiempo determinado y con una precisión suficientemente alta (~95% o más). Los captchas siempre contienen 5 líneas de texto deformado (en cursiva y sinusoidal), con marcas negras que cubren la imagen.
Un captcha típico
Completar el captcha es un proceso relativamente largo, complicado, probabilístico, especulativo y manual; sin embargo, solo debe completarse una vez, por lo que no tengo intenciones de simplificar el proceso.
Antes de leer la imagen, el script realiza un procesamiento previo utilizando un lienzo HTML temporal para facilitar el reconocimiento del texto. En particular, la imagen se escanea en busca de píxeles que sean lo suficientemente oscuros como para formar parte de las marcas negras. Cuando se encuentra un píxel, el píxel cambia para representar el mismo color que el fondo en ese punto de la imagen.
La misma imagen captcha después del preprocesamiento
Después de aplicar este procedimiento, también intenté revertir el efecto de deformación sinisoidal. Esto fue bastante efectivo para mejorar la legibilidad de una imagen determinada; sin embargo, el período real del efecto de deformación varía entre imágenes en unos pocos píxeles. Incluso aplicar el efecto con un par de píxeles desplazados reduce significativamente la legibilidad al final de la imagen a medida que la onda se desfasa. Por eso, decidí eliminar esta sección de preprocesamiento.
El siguiente paso es enviar la imagen preprocesada que hemos creado a una biblioteca OCR (Reconocimiento óptico de caracteres) llamada Tesseract. Para permitir que todo el script se ejecute dentro del navegador, el script utiliza un puerto JS de la biblioteca disponible aquí.
Después de unos segundos, Tesseract devolverá un fragmento de texto con una precisión normalmente entre el 65% y el 85%.
El análisis del texto devuelto por Tesseract reveló algunos errores comunes que podía revertir manualmente con alguna manipulación de cadenas.
Esto consistió en varias sustituciones de personajes como
Una vez completado el paso anterior, el texto se inyecta en el cuadro de texto utilizado para completar el captcha. En este punto, el texto aún no tiene la precisión suficiente para pasar el captcha; sin embargo, hay tiempo para realizar ediciones manuales con aproximadamente 3 a 5 segundos de sobra.
Para ayudar en este proceso, los errores ortográficos simples se pueden corregir fácilmente usando el corrector ortográfico integrado en los navegadores (haga clic con el botón derecho, seleccione las palabras recomendadas de una lista).
Con todos estos pasos aplicados, solo me tomó alrededor de media docena de intentos obtener una precisión que satisficiera el captcha.