이 저장소에는 제가 온라인 타이핑 게임 Typeracer를 이기고 거의 450에 달하는 비인간적인 WPM으로 순위표 1위를 차지하는 데 사용한 스크립트가 포함되어 있습니다.
나는 실제로 Typeracer에서 이 스크립트를 사용하는 것을 권장하지 않습니다. 이는 TOS에 위배되며(내 계정과 마찬가지로 귀하의 계정도 금지됩니다) 다른 실제 플레이어의 순위표를 오염시킵니다. 대신에 저는 이 프로젝트가 단지 흥미로운 실험이자 학습 경험이라고 생각합니다.
궁금하신 분들을 위해 아래에 프로세스의 각 단계를 간략히 설명했습니다. Typeracer가 사용자 검증 절차를 변경할 수 있고 변경해야 하므로 이 특정 방법은 향후 더 이상 작동하지 않을 수 있습니다. 이 스크립트가 2020-02-16 현재 작동하고 있음을 확인할 수 있습니다.
실제로 경주를 자동으로 입력하는 것은 DOM에서 텍스트를 추출하고 올바른 JavaScript 키 이벤트 세트를 보내는 것만큼 간단합니다.
경주 속도는 가짜 키를 누르는 사이의 시간 간격(임의로 낮을 수 있음)에 따라 결정되지만 어느 시점에서든 WPM이 450을 초과하면 게임에서 쫓겨나는 것 같습니다. 따라서 스크립트가 얻을 수 있는 WPM에는 상한이 있습니다. 445WPM(제가 얻을 수 있는 최고 수준)을 달성하기 위해 키 누름은 22.5ms에서 26.5ms 사이의 임의 시간 간격으로 분리되었습니다.
WPM이 충분히 높으면(>100) 클라이언트 측 어디에도 순수한 텍스트 형식이 없는 이미지 보안 문자가 표시됩니다. 이것이 진정한 과제입니다.
점수를 검증하려면 주어진 시간 내에 보안 문자를 충분히 높은 정확도(~95% 이상)로 완료할 수 있어야 합니다. 보안 문자에는 항상 5줄의 뒤틀린(이탤릭체 및 정현파) 텍스트가 포함되며, 이미지를 덮는 검은색 표시가 있습니다.
전형적인 보안 문자
보안 문자를 완성하는 것은 상대적으로 길고, 지저분하고, 확률적이고, 추측적이고, 수동적인 프로세스이지만 한 번만 완료하면 되므로 프로세스를 간소화할 의도가 없습니다.
이미지를 읽기 전에 스크립트는 텍스트를 더 쉽게 인식할 수 있도록 임시 HTML 캔버스를 사용하여 몇 가지 사전 처리를 수행합니다. 특히, 잠재적으로 검은색 표시의 일부가 될 만큼 어두운 픽셀이 있는지 이미지를 스캔합니다. 픽셀이 발견되면 해당 픽셀은 이미지의 해당 지점에서 배경과 동일한 색상을 나타내도록 변경됩니다.
전처리 후 동일한 보안 문자 이미지
이 절차를 적용한 후 사인파형 뒤틀림 효과를 역전시키려는 시도도 했습니다. 이는 주어진 이미지의 가독성을 향상시키는 데 매우 효과적이었지만 워핑 효과의 실제 기간은 이미지마다 몇 픽셀씩 다릅니다. 몇 픽셀 오프셋 효과를 적용하더라도 파동의 위상이 어긋나기 때문에 이미지 끝 부분의 가독성이 크게 감소합니다. 그래서 저는 이 전처리 부분을 제거하기로 결정했습니다.
다음 단계는 우리가 만든 사전 처리된 이미지를 Tesseract라는 OCR(광학 문자 인식) 라이브러리로 보내는 것입니다. 전체 스크립트가 브라우저 내에서 실행되도록 하기 위해 스크립트는 여기에서 사용 가능한 라이브러리의 JS 포트를 사용합니다.
몇 초 후에 Tesseract는 일반적으로 65%에서 85% 사이의 정확도로 텍스트 덩어리를 반환합니다.
Tesseract에서 반환된 텍스트를 분석한 결과 일부 문자열 조작을 통해 수동으로 되돌릴 수 있는 몇 가지 일반적인 실수가 드러났습니다.
이는 다음과 같은 다양한 문자 대체로 구성되었습니다.
이전 단계가 완료되면 보안 문자를 완료하는 데 사용되는 텍스트 상자에 텍스트가 삽입됩니다. 이 시점에서는 아직 텍스트의 정확도가 보안 문자를 통과할 만큼 높지는 않지만 약 3~5초 정도의 여유를 두고 수동으로 편집할 수 있는 시간이 있습니다.
이 프로세스를 지원하기 위해 내장된 맞춤법 검사 기능을 사용하여 간단한 맞춤법 오류를 쉽게 수정할 수 있습니다(마우스 오른쪽 버튼을 클릭하고 목록에서 추천 단어 선택).
이 모든 단계를 적용한 후 보안 문자를 만족하는 정확도를 얻는 데 약 6번의 시도밖에 걸리지 않았습니다.