このリポジトリには、私がオンライン タイピング ゲーム typeracer を破り、約 450 という非人道的な WPM でリーダーボードのトップに立つために使用したスクリプトが含まれています。
typeracer でこのスクリプトを実際に使用することはお勧めしません。これは TOS に違反し (私の場合と同様に、あなたのアカウントは禁止されます)、他の実際のプレイヤーのリーダーボードを汚すことになります。むしろ、このプロジェクトは単なる興味深い実験であり、学習体験だと思います。
興味のある方のために、プロセスの各ステップの概要を以下に示します。 typeracer はユーザー検証手順を変更する可能性がある (変更する必要がある) ため、この特定のメソッドは将来機能しなくなる可能性があることに注意してください。 2020-02-16 の時点でこのスクリプトが動作することを確認できています。
実際にレースを自動的に入力するのは、DOM からテキストを抽出し、適切な JavaScript キー イベントのセットを送信するだけで簡単です。
レースの速度は、偽のキーを押す間隔 (任意に短く設定できる) によって決まりますが、WPM が 450 を超えると、ゲームから追い出されるようです。したがって、スクリプトが取得できる WPM には上限があります。 445 WPM (私が達成できた最高値) を達成するには、22.5 ミリ秒から 26.5 ミリ秒の間のランダムな時間間隔でキーを押す必要がありました。
WPM が十分に高い (>100) と、クライアント側のどこにも純粋なテキスト形式を持たない画像キャプチャが表示されます。これが本当の課題です。
スコアを検証するには、所定の時間内に十分な精度 (約 95% 以上) でキャプチャを完了できる必要があります。キャプチャには常に 5 行の歪んだ (斜体および正弦波の) テキストが含まれており、画像を黒いマーキングが覆っています。
典型的なキャプチャ
キャプチャの完了は、比較的長く、面倒で、確率論的、推測的で手動のプロセスですが、完了する必要があるのは 1 回だけであるため、プロセスを合理化するつもりはありません。
画像を読み取る前に、スクリプトは一時的な HTML キャンバスを使用していくつかの前処理を実行し、テキストを認識しやすくします。特に、黒いマーキングの一部となる可能性があるほど暗いピクセルがないか画像がスキャンされます。ピクセルが見つかると、そのピクセルは画像内のその点の背景と同じ色を表すように変更されます。
前処理後の同じキャプチャ画像
この手順を適用した後、正弦波ワーピング効果を元に戻すことも試みました。これは、特定の画像の可読性を向上させるのに非常に効果的でしたが、ワープ効果の実際の期間は画像間で数ピクセル異なります。エフェクトを数ピクセルオフセットして適用した場合でも、波の位相がずれるため、画像の最後までに可読性が大幅に低下します。したがって、この前処理セクションを削除することにしました。
次のステップでは、作成した前処理済みの画像を Tesseract と呼ばれる OCR (光学文字認識) ライブラリに送信します。スクリプト全体をブラウザ内で実行できるようにするために、スクリプトはここで入手可能なライブラリの JS ポートを使用します。
数秒後、Tesseract は通常 65% ~ 85% の精度でテキストの塊を返します。
Tesseract から返されたテキストを分析すると、よくある間違いがいくつか明らかになりましたが、文字列を操作することで手動で元に戻すことができました。
これは、次のようなさまざまな文字置換で構成されていました。
前の手順が完了すると、キャプチャを完了するために使用されるテキスト ボックスにテキストが挿入されます。この時点では、テキストはまだキャプチャを通過できるほど十分な精度ではありませんが、約 3 ~ 5 秒の余裕を持って手動で編集する時間があります。
このプロセスを支援するために、ブラウザに組み込まれたスペル チェックを使用して単純なスペル ミスを簡単に修正できます (右クリックし、リストから推奨される単語を選択します)。
これらすべての手順を適用すると、キャプチャを満足させる精度を得るまでにわずか 6 回ほどの試行しかかかりませんでした。