這個儲存庫包含我用來擊敗線上打字遊戲 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 秒的時間進行手動編輯。
為了協助完成此過程,可以使用內建拼字檢查的瀏覽器輕鬆修復簡單的拼字錯誤(右鍵單擊,從清單中選擇建議的單字)。
在應用所有這些步驟後,我只花了大約六次嘗試就獲得了滿足驗證碼的準確性。