Dieses Repo enthält das Skript, mit dem ich das Online-Tippspiel Typeracer besiegt habe und die Bestenliste mit einem unmenschlichen WPM von fast 450 anführte.
Ich empfehle nicht, dieses Skript tatsächlich auf Typeracer zu verwenden, da es gegen die AGB verstößt (Ihr Konto wird gesperrt, genau wie meins) und die Bestenliste für andere, echte Spieler verunreinigt. Stattdessen empfinde ich dieses Projekt lediglich als ein interessantes Experiment und eine Lernerfahrung.
Für alle Neugierigen habe ich unten jeden Schritt des Prozesses beschrieben. Beachten Sie, dass diese spezielle Methode in Zukunft möglicherweise nicht mehr funktioniert, da Typeracer das Benutzervalidierungsverfahren ändern kann (und sollte). Ich kann bestätigen, dass dieses Skript ab dem 16.02.2020 funktioniert.
Die eigentliche automatische Eingabe des Rennens ist so einfach wie das Extrahieren des Textes aus dem DOM und das Senden des richtigen Satzes von JavaScript-Schlüsselereignissen.
Während die Geschwindigkeit Ihres Rennens durch das Zeitintervall zwischen den falschen Tastendrücken bestimmt wird (das beliebig niedrig sein kann), scheint es, dass Sie aus dem Spiel geworfen werden, wenn Ihr WPM zu irgendeinem Zeitpunkt 450 überschreitet. Daher gibt es eine Obergrenze für die WPM, die das Skript erhalten kann. Um 445 WPM zu erreichen (die höchste Leistung, die ich erreichen konnte), wurden die Tastendrücke durch zufällige Zeitintervalle zwischen 22,5 ms und 26,5 ms getrennt.
Nach einem ausreichend hohen WPM (>100) wird Ihnen ein Bild-Captcha präsentiert, das nirgendwo auf der Client-Seite eine rein textuelle Form hat – das ist die eigentliche Herausforderung.
Um Ihre Punktzahl zu validieren, müssen Sie in der Lage sein, das Captcha innerhalb einer bestimmten Zeit und mit einer ausreichend hohen Genauigkeit (~95 % oder mehr) auszufüllen. Die Captchas enthalten immer 5 Zeilen verzerrten Text (kursiv und sinusförmig), wobei das Bild von schwarzen Markierungen verdeckt wird.
Ein typisches Captcha
Das Ausfüllen des Captchas ist ein relativ langer, chaotischer, probabilistischer, spekulativer und manueller Prozess, der jedoch nur einmal abgeschlossen werden muss, daher habe ich nicht die Absicht, den Prozess zu rationalisieren.
Bevor das Bild gelesen wird, führt das Skript mithilfe einer temporären HTML-Zeichenfläche eine Vorverarbeitung durch, um die Texterkennung zu erleichtern. Insbesondere wird das Bild nach Pixeln durchsucht, die dunkel genug sind, um möglicherweise Teil der schwarzen Markierungen zu sein. Wenn ein Pixel gefunden wird, wird das Pixel so geändert, dass es die gleiche Farbe wie der Hintergrund an dieser Stelle im Bild darstellt.
Das gleiche Captcha-Bild nach der Vorverarbeitung
Nachdem ich dieses Verfahren angewendet hatte, versuchte ich auch, den Sinisoid-Warping-Effekt umzukehren. Dadurch konnte die Lesbarkeit eines bestimmten Bildes recht effektiv verbessert werden, allerdings variiert die tatsächliche Dauer des Warping-Effekts zwischen den Bildern um einige Pixel. Selbst wenn der Effekt um einige Pixel versetzt angewendet wird, verringert sich die Lesbarkeit am Ende des Bildes erheblich, da die Welle außer Phase gerät. Daher habe ich beschlossen, diesen Abschnitt der Vorverarbeitung zu entfernen.
Der nächste Schritt besteht darin, das von uns erstellte vorverarbeitete Bild an eine OCR-Bibliothek (Optical Character Recognition) namens Tesseract zu senden. Damit das gesamte Skript im Browser ausgeführt werden kann, verwendet das Skript einen JS-Port der hier verfügbaren Bibliothek.
Nach einigen Sekunden gibt Tesseract einen Textblock mit einer Genauigkeit zurück, die typischerweise zwischen 65 % und 85 % liegt.
Die Analyse des von Tesseract zurückgegebenen Textes ergab einige häufige Fehler, die ich mit einigen String-Manipulationen manuell rückgängig machen konnte.
Dies bestand aus verschiedenen Zeichenersetzungen wie z
Sobald der vorherige Schritt abgeschlossen ist, wird der Text in das Textfeld eingefügt, das zum Vervollständigen des Captchas verwendet wird. Zu diesem Zeitpunkt ist die Genauigkeit des Textes noch nicht hoch genug, um das Captcha zu bestehen, es bleibt jedoch noch Zeit für manuelle Bearbeitungen, da etwa 3 bis 5 Sekunden verbleiben.
Um diesen Prozess zu unterstützen, können einfache Rechtschreibfehler einfach mithilfe der im Browser integrierten Rechtschreibprüfung behoben werden (Rechtsklick, empfohlene Wörter aus einer Liste auswählen).
Mit all diesen Schritten brauchte ich nur etwa ein halbes Dutzend Versuche, um eine Genauigkeit zu erreichen, die dem Captcha entsprach.