Este repositório contém o script que usei para vencer o typeracer do jogo de digitação online, liderando a tabela de classificação com um WPM desumano de quase 450.
Na verdade, eu não recomendo usar este script no Typeracer, ele é contra os TOS (sua conta será banida, assim como a minha) e polui a tabela de classificação de outros jogadores reais. Em vez disso, considero este projeto apenas um experimento interessante e uma experiência de aprendizado.
Para qualquer curioso, descrevi abaixo cada etapa do processo. Observe que este método específico pode não funcionar mais no futuro, pois o typeracer pode (e deve) alterar o procedimento de validação do usuário. Posso confirmar que este script estará funcionando a partir de 16/02/2020.
Na verdade, digitar a corrida automaticamente é tão simples quanto extrair o texto do DOM e enviar o conjunto correto de eventos-chave JavaScript.
Embora a velocidade da sua corrida seja determinada pelo intervalo de tempo entre os pressionamentos falsos de teclas (que pode ser arbitrariamente baixo), parece que se em algum momento o seu WPM ultrapassar 450, você será expulso do jogo. Portanto, há um limite máximo de WPM que o script pode obter. Para atingir 445 WPM (o mais alto que consegui), os pressionamentos de tecla foram separados por intervalos de tempo aleatórios entre 22,5 ms e 26,5 ms.
Depois de um WPM alto o suficiente (> 100), você recebe uma imagem captcha que não possui uma forma puramente textual em nenhum lugar do lado do cliente - esse é o verdadeiro desafio.
Para validar sua pontuação você deve ser capaz de completar o captcha dentro de um determinado tempo e com uma precisão alta o suficiente (~95% ou mais). Os captchas contêm sempre 5 linhas de texto distorcido (itálico e sinusoidal), com marcas pretas cobrindo a imagem.
Um captcha típico
O preenchimento do captcha é um processo relativamente longo, confuso, probabilístico, especulativo e manual, porém só precisa ser concluído uma vez, portanto não tenho intenção de agilizar o processo.
Antes de ler a imagem, o script realiza um pré-processamento usando uma tela HTML temporária para facilitar o reconhecimento do texto. Em particular, a imagem é digitalizada em busca de pixels que sejam escuros o suficiente para potencialmente fazerem parte das marcações pretas. Quando um pixel é encontrado, o pixel é alterado para representar a mesma cor do plano de fundo naquele ponto da imagem.
A mesma imagem captcha após pré-processamento
Após a aplicação deste procedimento, também tentei reverter o efeito de empenamento sinisoidal. Isto foi bastante eficaz para melhorar a legibilidade de uma determinada imagem, no entanto, o período real do efeito de distorção varia entre as imagens em alguns pixels. Mesmo a aplicação do efeito com alguns pixels deslocados reduz significativamente a legibilidade no final da imagem, à medida que a onda fica fora de fase. Assim, decidi remover esta seção de pré-processamento.
A próxima etapa é enviar a imagem pré-processada que criamos para uma biblioteca OCR (Optical Character Recognition) chamada Tesseract. Para permitir que todo o script seja executado no navegador, o script usa uma porta JS da biblioteca disponível aqui.
Após alguns segundos, o Tesseract retornará um pedaço de texto com uma precisão normalmente entre 65% e 85%.
A análise do texto retornado pelo Tesseract revelou alguns erros comuns que eu poderia reverter manualmente com alguma manipulação de strings.
Isso consistia em várias substituições de caracteres, como
Concluída a etapa anterior, o texto é injetado na caixa de texto usada para completar o captcha. Neste ponto, o texto ainda não tem precisão suficiente para passar o captcha, no entanto, há tempo para que edições manuais sejam feitas com cerca de 3 a 5 segundos de sobra.
Para auxiliar neste processo, erros ortográficos simples podem ser facilmente corrigidos usando a verificação ortográfica integrada do navegador (clique com o botão direito, selecione as palavras recomendadas em uma lista).
Com todas essas etapas aplicadas, levei apenas cerca de meia dúzia de tentativas para obter uma precisão que satisfizesse o captcha.