PHP – Curl & Captchas I

        A biblioteca CURL do PHP é algo muito util para quem a entende. Não vamos negar que ela é um tanto complexa e complicada. Por semanas eu busquei na web tutoriais e dicas para melhor usar a biblioteca, só que não conseguia crescer nisso! Então fui aos testes.
Para que voce entenda este POST é necessário que voce ao menos saiba do que se trata o CURL.

1-Meu objetivo: (a) Burlar os CAPTCHAS ou (b) copiar as imagens e valida-las em meu programa. Sei que ja leram aí pela web a fora que isto é impossivel, mas uma coisa é certa, NADA é 100% seguro, infelizmente ou felizmente, (isso é assunto para outro POST). Se não é possivel burlar o CAPTCHA ao menos é possivel copia-lo, graças ao CURL.

2-Entender o outro Site: Bom, para que voce possa burlar ou copiar um captcha é preciso entender como eles funcionam. (obs. este não é um post sobre captchas ou burlar captchas, mas é o exemplo que estou dando neste post). Então vamos ver basicamente como eles funcionam:

Exemplo1:

exemplo captcha2

Explicando o Exemplo1:
        O arquivo “form.php” (poderia ser .asp ou qualquer coisa) tem a função de enviar ao cliente o formulario para digitar o captcha e a imagem do captcha. Só que o scr do imagem é o img.php que tem 2 funções, (1) gerar uma imagem (.gif, .jpg ou qualquer coisa) com os caracteres e envia-la ao cliente e (2) gerar um cookie com a copia dos caracteres para posterior validação.

Exemplo2:

exemplo captcha1

Explicando o Exemplo2:
        O arquivo “form.php” tem 3 funções, (1) enviar ao cliente o formulario para digitar o captcha, (2) enviar a imagem do captcha e (3) gravar os caracteres em um cookie.

Basicamente é assim que funcionam os captchas.

Neste POST vamos usar como alvo o site da receita federal (espero não ir para a cadeia por isso!) para nosso exemplo. Então entre la e veja como funciona. Aqui vai o link! Voce somente precisa digitar o cnpj de uma empresa (que voce queira consultar) e depois digitar o captcha. (Caso não tenham um cnpj usem esse da Petrobras 33000167009672).
Entenderam? Se não entenderam leia novamente este ultimo paragrafo e reveja os exemplos acima.
Agora mãos a obra com o codigo. Estava demorando!
Como você deve saber o curl não captura as imagens de uma URL, mas ele tem uma opção que quando setada true pode fazer isso, é chamada CURLOPT_BINARYTRANSFER. Fiz uma função para pegar uma imagem, aí vai. (salve como curlf.php).

< ?php
        function recebe_imagem($url, $arquivo, $cookief="", $cookiej="") {
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                if(!empty($cookief)) {
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookief);
        }
                if(!empty($cookiej)) {
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiej);
        }
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$data=curl_exec($ch);
curl_close ($ch);
$fp = fopen($arquivo,'w');
fwrite($fp, $data);
fclose($fp);
return $arquivo;
}
?>

1. Cria a função recebe_imagem com 4 entradas.
2. Inicia uma seção CURL para a URL passada por parametro na função.
3. Opção “mostrar headers” desligada.
4. Opção “seguir redirecionamento” ligada.
5-10. Se foi passada por parametro as opções $cookief e $cookiej ele envia / grava os cookies para a seção. (a alma do negocio nos captchas).
11. Retorna em string.
12. Para retornar a saída crua.
13. Executa a seção e grava a string em $data.
14. Fecha a seção.
15. Cria um novo arquivo com o nome passado por parametro.
16. Grava nele o que retornou pelo CURL.
17. Fecha e salva o arquivo.
18. E a função retorna o nome do arquivo.

Para mais detalhes sobre as opções de uma olhada na documentação do php neste link aqui ou este meu POST aqui.
Entendeu a função? Se não leia novamente o comentario da função. É importantissimo entende-la.
Legal! ja temos como buscar a imagem do captcha. E agora? Agora vamos executar a função. Isso é continuação do codigo anterior, deve ficar no mesmo arquivo.

< ?php
$img=recebe_imagem("http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image",
				   "receita.gif",
				   "",
				   "receita.txt");
?>

captcha cnpj

Apareceu a imagem? Sim!? blz…vamos adiante.

Agora temos que nos preocupar com a ultima parte, a Submissão dos dados. Este é um outro arquivo, salve-o como curls.php. Vamos la então:

< ?php
$cnpj = $_POST['cnpj'];
$letras = $_POST['letras'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "origem=comprovante&search_type=cnpj&cnpj=$cnpj&idLetra=$letras&submit1=Consultar");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "receita.txt");
curl_setopt($ch, CURLOPT_URL, "http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/valida.asp");
$output=curl_exec($ch);
echo $output;
?>

5. A opção CURLOPT_POST serve para mandar os dados para URL via POST.
6. A opção CURLOPT_POSTFIELDS são pares de chave e valor a enviar.
9. Aqui vem o grande segredo. O cookie gerado ao ler a imagem deve ser enviado para a seção CURL para que possa ser feita a validação corretamente.

Legal né? Agora divirtam-se!

This entry was posted in PHP and tagged , , , , . Bookmark the permalink.

13 Responses to PHP – Curl & Captchas I

  1. Max says:

    Opa tudo blz? Estou tentando usar seu script mas quando clico em Enviar Dados ao invez de aparecer os dados aparece apenas uma tela com o seguinte:

    Object Moved
    This object may be found here.

    O que pode estar errado? Tem ideia?

    Me manda a resposta por email ou manda seu msn pra gente conversar melhor.

    Max

  2. gu says:

    cara muito bom se vc poder me dizer aonde encontro mais artigos sobre curl estou começando a aprender por favor me mande um email ficaria muito agradecido, estou disposto a pagar obrigado.

  3. bryan says:

    cara…voce pode dar uma olhada neste post PHP – Introdução a lib CURL e pode tambem sugerir assuntos para que eu possa escrever sobre ele. Sinceramente eu aprendi o CURL lendo a documentação dele. Infelizmente não achamos muita coisa sobre CURL na internet, apenas achamos scripts prontos. Fique a vontade de enviar sugestões!

  4. bryan says:

    grande Max, voce me achou em cara! respondido por email…se alguem tiver o mesmo problema deixe um comentario!

  5. gu says:

    opa dai bryan curti muito seu artigo tem como vc deixar seu email para eu poder trocar uma ideia com vc sobre esse curl, já que deu pra ver que vc entende muito, queria ver se desse um exemplo desse usando hotmail ou talvez orkut gmail se possui a capacidade de logar la utilizando o curl. obrigado valeu

  6. Thiago says:

    Bacana esse script

    mas gostaria de saber se é possível fazer um formulário enviando só o cnpj, sem o captcha?

    Valeu

  7. Wagner says:

    Olá você sabe porque esta solução não esta funcionando na receita???
    (funcionava até semana passada)
    estou precisando muito da ajuda.

  8. Flávio Almeida says:

    bryan, blz?

    Tenho o apache e o php 5 instalado localhost no windows. A extenssão curl está instalada corretamente mas quando tendo buscar os dados ele direciona para a pagina informando que o cnpj ou captcha esta errado.

    Você sabe o que pode esta acontecendo?

    Desde já agradeço.

  9. Luciano says:

    Bryan,

    Exemplos esclarecedores!!
    Estou tentando reproduzir o mesmo sistema para o site do dataprev. O formulário ficou OK mas estou tendo problemas com o resultado. Tens algum exemplo relacionado para o dataprev? Podes responder por email.

  10. Lucio says:

    Seu post me ajudou MUITO MESMO! Obrigado.

    Eu só tive um problema, o site que estou tentando passar pelo captcha a cada 10 consultas ele renova o cookie/session e eu tenho que digitar novamente o captcha.

    Você saberia me informar alguma solução para isso? Espero que não tenha abandonado seu site =/

  11. André Luis says:

    Boa tarde Bryan,

    Utilizei seu script para burlar o captcha da receita federal, porém não está funcionando, sempre me é retornada a página para redigitar as informações (CNPJ e Captcha) e nunca é exibido o formulário com a resposta da consulta.

    O PHP não está retornando nenhum erro também.

    Você tem idéia do que possa ser?

    Obrigado!

  12. Michel says:

    Muito legal seu codigo! Tenho uma dúvida. Tenho o endereço de um captcha http…/image.php que quando baixo a imagem ela não está com as letras só vem o fundo da imagem. Porque isso acontece?

  13. Leandro says:

    cara vc num consegue burlar um sistema captcha pra mim ??? é um site de votação …queria pelo menos umas 15 mil votações mais queria que isso fosse automatico e não precise digitar os captchas….quero te pagar por esse serviço como faço pra contratar vc ???

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>