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:

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:

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");
?>
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!

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
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.
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!
grande Max, voce me achou em cara! respondido por email…se alguem tiver o mesmo problema deixe um comentario!
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
Bacana esse script
mas gostaria de saber se é possível fazer um formulário enviando só o cnpj, sem o captcha?
Valeu
Olá você sabe porque esta solução não esta funcionando na receita???
(funcionava até semana passada)
estou precisando muito da ajuda.
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.
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.
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 =/
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!
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?
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 ???