Ce dépôt contient le script que j'ai utilisé pour battre le jeu de frappe en ligne Typeracer, en tête du classement avec un WPM inhumain de près de 450.
Je ne recommande pas d'utiliser ce script sur typeracer, il est contraire aux TOS (votre compte sera banni, tout comme le mien) et pollue le classement des autres vrais joueurs. Au lieu de cela, je trouve ce projet comme une simple expérience intéressante et une expérience d’apprentissage.
Pour toute personne curieuse, j'ai décrit ci-dessous chaque étape du processus. Notez que cette méthode particulière pourrait ne plus fonctionner à l'avenir car typeracer peut (et devrait) modifier la procédure de validation de l'utilisateur. Je peux confirmer que ce script fonctionne à partir du 16/02/2020.
En fait, saisir automatiquement la course est aussi simple que d'extraire le texte du DOM et d'envoyer le bon ensemble d'événements clés JavaScript.
Bien que la vitesse de votre course soit déterminée par l'intervalle de temps entre les fausses pressions de touches (qui peut être arbitrairement faible), il semble que si à un moment donné votre WPM dépasse 450, vous êtes expulsé du jeu. Il existe donc une limite supérieure au WPM que le script peut obtenir. Pour atteindre 445 WPM (le plus élevé que j'ai pu obtenir), les pressions sur les touches ont été séparées par des intervalles de temps aléatoires compris entre 22,5 ms et 26,5 ms.
Après un WPM suffisamment élevé (> 100), un captcha d'image vous est présenté qui n'a de forme purement textuelle nulle part du côté client - c'est le véritable défi.
Pour valider votre score, vous devez être capable de compléter le captcha dans un délai donné et avec une précision suffisamment élevée (~95 % ou plus). Les captchas contiennent toujours 5 lignes de texte déformé (en italique et sinusoïdal), avec des marques noires recouvrant l'image.
Un captcha typique
Compléter le captcha est un processus relativement long, compliqué, probabiliste, spéculatif et manuel, mais il ne doit être complété qu'une seule fois, je n'ai donc aucune intention de rationaliser le processus.
Avant de lire l'image, le script effectue un prétraitement à l'aide d'un canevas HTML temporaire pour faciliter la reconnaissance du texte. En particulier, l'image est analysée à la recherche de tous les pixels suffisamment sombres pour potentiellement faire partie des marques noires. Lorsqu'un pixel est trouvé, le pixel est modifié pour représenter la même couleur que l'arrière-plan à ce point de l'image.
La même image captcha après prétraitement
Après avoir appliqué cette procédure, j’ai également tenté d’inverser l’effet de déformation sinusoïdale. Cela s'est avéré assez efficace pour améliorer la lisibilité d'une image donnée, mais la période réelle de l'effet de déformation varie de quelques pixels entre les images. Même l'application de l'effet avec un décalage de quelques pixels réduit considérablement la lisibilité à la fin de l'image, car l'onde devient déphasée. Ainsi, j'ai décidé de supprimer cette section de pré-traitement.
L'étape suivante consiste à envoyer l'image prétraitée que nous avons créée à une bibliothèque OCR (Optical Character Recognition) appelée Tesseract. Pour permettre à l'intégralité du script de s'exécuter dans le navigateur, le script utilise un port JS de la bibliothèque disponible ici.
Après quelques secondes, Tesseract renverra un morceau de texte avec une précision généralement comprise entre 65 % et 85 %.
L'analyse du texte renvoyé par Tesseract a révélé quelques erreurs courantes que j'ai pu inverser manuellement avec quelques manipulations de chaînes.
Cela consistait en diverses substitutions de caractères telles que
Une fois l’étape précédente terminée, le texte est injecté dans la zone de texte permettant de compléter le captcha. À ce stade, le texte n'est toujours pas suffisamment précis pour passer le captcha, mais il reste du temps pour effectuer des modifications manuelles avec environ 3 à 5 secondes d'avance.
Pour faciliter ce processus, de simples fautes d'orthographe peuvent être facilement corrigées à l'aide du correcteur orthographique intégré aux navigateurs (clic droit, sélectionnez les mots recommandés dans une liste).
Avec toutes ces étapes appliquées, il ne m'a fallu qu'une demi-douzaine d'essais pour obtenir une précision qui satisfaisait le captcha.