CAPTCHA é um acrônimo da expressão “Completely Automated Public Turing test to tell Computers and Humans Apart” ou “Teste de Turing público completamente automatizado para diferenciação entre computadores e humanos“. Ele tem por objetivo verificar se o usuário de determinado serviço é humano e não um algoritmo automatizado.

Muitos serviços, informações e controles disponibilizados na internet utilizam essa ferramenta para se proteger de ataques, web crawlers, etc, afim de não comprometer o bom funcionamento e segurança do sua aplicação.

Atualmente existem diversos tipos de CAPTCHA que são desenvolvidos e/ou utilizados por diversas empresas.



Receita Federal Facebook

Recaptcha

Existem casos onde é necessário automatizar algumas tarefas. Mas quando você é barrado por uma verificação dessas, o que fazer? Pois bem, existem várias técnicas para realizar o reconhecimento automático de CAPTCHA. Uma delas é utilizando o AForge.NET juntamente com o Tesseract.

Conhecendo e baixando as ferramentas

O AForge.NET é um framework escrito em C# para desenvolvedores e pesquisadores trabalharem com tratamento de imagens, redes neurais, algoritmo genéticos, aprendizado de máquina, etc. É Facilmente encontrado com uma breve pesquisa ou pode ser baixado neste link

O Tesseract é uma ferramenta open source para OCR, com algumas combinações é possível reconhecer vários tipo de imagem em até 60 idiomas. A versão adaptada para o uso com c# pode ser encontra neste link

Criando o Projeto

Primeiro vamos criar um projeto simples WinForms apenas para referenciar as nossas ferramentas e exemplificar o uso das mesmas.

Abra o Visual Studio, clique em File > New Project. Na seção Windows escolha: Windows Forms Application. Defina um nome para ele e clique em OK

Adicionando arquivos e referências

O próximo passo é adicionarmos os arquivos e referências das ferramentas:

AForge.NET: Adicionar a referência para AForge.dll e AForge.Imaging.dll (Utilizaremos apenas elas para fazer o tratamento de imagem dos nossos captchas).

Tesseract: Adicionar a referência para Tesseract.dll. Adicionar na raiz do projeto a pasta “tessdata” que contém uma espécie de base de dados treinada para o reconhecimento OCR. É necessário adicionar as dll’s: liblept168.dll e libtesseract302.dll na raiz do projeto também.

ATENÇÃO: Em todos os arquivos adicionados do Tesseract é necessário marcar a opção “Copy to Output Direcoty” que pode ser definido clicando sobre o arquivo dentro do Visual Studio e indo em propriedades.

Implementação

Vamos adicionar 3 controles ao nosso Form:

OpenFileDialog : Servirá para selecionarmos a imagem do captcha.

: Servirá para selecionarmos a imagem do captcha. PictureBox : Receberá o resultado do nosso tratamento de imagem

: Receberá o resultado do nosso tratamento de imagem Label: Mostrará o resultado do reconhecimento do captcha

O código do OpenFileDialog ficará assim:

private void openImageButton_Click(object sender, EventArgs e) { openFileDialog.ShowDialog(); } private void openFileDialog_FileOk(object sender, CancelEventArgs e) { Bitmap image = new Bitmap(openFileDialog.FileName); if (image != null) { System.IO.FileInfo fi = new System.IO.FileInfo(openFileDialog.FileName); resultLabel.Text = reconhecerCaptcha(image); } image.Dispose(); }

Aqui ele transforma a imagem selecionada em um Bitmap e passa como parâmetro para o método “reconhecerCaptcha”

private string reconhecerCaptcha(Image img) { Bitmap imagem = new Bitmap(img); imagem = imagem.Clone(new Rectangle(0, 0, img.Width, img.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb); Erosion erosion = new Erosion(); Dilatation dilatation = new Dilatation(); Invert inverter = new Invert(); ColorFiltering cor = new ColorFiltering(); cor.Blue = new AForge.IntRange(200, 255); cor.Red = new AForge.IntRange(200, 255); cor.Green = new AForge.IntRange(200, 255); Opening open = new Opening(); BlobsFiltering bc = new BlobsFiltering(); Closing close = new Closing(); GaussianSharpen gs = new GaussianSharpen(); ContrastCorrection cc = new ContrastCorrection(); bc.MinHeight = 10; FiltersSequence seq = new FiltersSequence(gs, inverter, open, inverter, bc, inverter, open, cc, cor, bc, inverter); pictureBox.Image = seq.Apply(imagem); string reconhecido = OCR((Bitmap)pictureBox.Image); return reconhecido; }

Aqui está toda a parte de tratamento de imagem, removendo informações desnecessárias na imagem, afim de ser melhor reconhecido pelo OCR. Utilizando as funcionalidades do AForge.NET é possível criar filtros conforme a necessidade e aplicá-los em uma sequência na imagem. Ele possui inúmeros filtros, como: Erosão, Dilatação, Contraste, Cor, entre outras.

Neste caso foi implementado alguns filtros específicos para um tipo de CAPTCHA. Caso você tenha outro padrão é necessário implementar ele utilizando outros filtros e/ou outra sequência.

O último passo é o reconhecimento OCR:

private string OCR(Bitmap b) { string res = ""; using (var engine = new TesseractEngine(@"tessdata", "eng", EngineMode.Default)) { engine.SetVariable("tessedit_char_whitelist", "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"); engine.SetVariable("tessedit_unrej_any_wd", true); using (var page = engine.Process(b, PageSegMode.SingleLine)) res = page.GetText(); } return res; }

Aqui o trabalho é feito pelo Tesseract, onde é possível definir um conjunto de caracteres que serão aceitos no reconhecimento. Isso requer uma análise das possibilidades de combinação que o tipo de CAPTCHA que você está utilizando tem. Essa definição é uma espécie de “white list” que contribui evitando erros.

Resultados dos testes

Imagens Originais

Imagens resultantes (após tratamento de imagem e OCR)

Para quem se interessar, disponibilizei o projeto na íntegra no meu GitHub

https://github.com/andreluizsecco/RecogCaptcha

Documentação do AForge.NET

https://www.aforgenet.com/framework/docs

Documentação do Tesseract

https://code.google.com/p/tesseract-ocr/wiki/Documentation

Qualquer sugestão, dúvida ou esclarecimento, utilize os comentários abaixo.