这个存储库包含我用来击败在线打字游戏 Typeracer 的脚本,以几乎 450 的不人道的 WPM 在排行榜上名列前茅。
我不建议在 typeracer 上实际使用这个脚本,它违反了 TOS(你的帐户将被禁止,就像我的一样),并且会污染其他真实玩家的排行榜。相反,我发现这个项目只是一个有趣的实验和学习经历。
对于任何好奇的人,我在下面概述了该过程的每个步骤。请注意,这种特定方法将来可能不再有效,因为 typeracer 可能(并且应该)更改用户验证过程。我可以确认此脚本自 2020 年 2 月 16 日起即可运行。
实际上,自动输入比赛就像从 DOM 中提取文本并发送正确的 JavaScript 按键事件集一样简单。
虽然你的比赛速度是由假按键之间的时间间隔(可以任意低)决定的,但似乎只要你的 WPM 超过 450,你就会被踢出游戏。因此,脚本可以获得的 WPM 是有上限的。为了达到 445 WPM(我能达到的最高速度),按键按 22.5 毫秒到 26.5 毫秒之间的随机时间间隔分开。
在足够高的 WPM(>100)之后,您会看到一个图像验证码,该验证码在客户端的任何地方都没有纯文本形式 - 这是真正的挑战。
要验证您的分数,您必须能够在给定时间内以足够高的准确度(~95% 或更高)完成验证码。验证码始终包含 5 行扭曲(斜体和正弦曲线)文本,图像上覆盖有黑色标记。
典型的验证码
完成验证码是一个相对较长、混乱、概率性、推测性和手动的过程,但它只需要完成一次,因此我无意简化该过程。
在读取图像之前,脚本会使用临时 HTML 画布执行一些预处理,以便更轻松地识别文本。特别是,扫描图像中任何暗到可能成为黑色标记一部分的像素。当找到像素时,该像素将更改为表示与图像中该点的背景相同的颜色。
预处理后的相同验证码图像
应用此程序后,我还尝试扭转正弦曲线扭曲效应。这对于提高给定图像的可读性非常有效,但是扭曲效果的实际周期在图像之间存在几个像素的差异。即使应用几个像素偏移的效果也会显着降低图像末尾的可读性,因为波变得异相。因此,我决定删除这部分预处理。
下一步是将我们创建的预处理图像发送到名为 Tesseract 的 OCR(光学字符识别)库。为了允许整个脚本在浏览器中运行,该脚本使用此处提供的库的 JS 端口。
几秒钟后,Tesseract 将返回一段文本,准确度通常在 65% 到 85% 之间。
对 Tesseract 返回的文本的分析揭示了一些常见错误,我可以通过一些字符串操作手动扭转这些错误。
这包括各种字符替换,例如
完成上一步后,文本将被注入到用于完成验证码的文本框中。此时,文本的准确度仍然不够高,无法通过验证码,但是还有大约 3-5 秒的时间进行手动编辑。
为了协助完成此过程,可以使用内置拼写检查的浏览器轻松修复简单的拼写错误(右键单击,从列表中选择推荐的单词)。
应用所有这些步骤后,我只花了大约六次尝试就获得了满足验证码的准确性。