Vinoli 0 Denunciar post Postado Janeiro 21, 2015 Amigos, desejo validar um CPF, consultando-o no site da Receita Federal e obtendo o nome cadastrado. Eu possuo alguns scripts, mas o sistema da Receita mudou, haja vista que o Captcha é gerado por outro método. Possuo alguns scripts, porém é necessário uma atualização, estou com dificuldades em implementá-lo. Primeiro é necessário obter os dados referentes ao Captcha, depois enviá-los juntamente com as letras do captcha e o número de CPF que foi digitado. Ocorre que antes a página de geração do capta era http://www.receita.fazenda.gov.br/scripts/captcha/ Mas agora ela passou a ser http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/captcha/gerarCaptcha.asp Portanto, há uma diferença nos atributos do Captcha, os quais deverão ser reenviados via CURL. Como vocês podem observar esse script utiliza a biblioteca Simple_html_dom e também é necessário criar um direito chamado 'Cookie' para os armazenar e reutilizar. <?php /** * Description TCPF * @version 1.0 * @package TReceita * @author Ademilson Nunes * @license http://www.gnu.org/licenses/gpl.html */ class TCPF { private $cookieFile; private $token; private $imgCaptcha; /** * Class constructor */ public function __construct() { require_once('lib/Simple_html_dom.php'); require_once('lib/Simple_html_dom_node.php'); session_start(); $this->cookieFile = 'cookie/'.session_id(); if(!file_exists($this->cookieFile)) { $file = fopen($this->cookieFile, 'w'); fclose($file); } $ch = curl_init('http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookieFile); $html = curl_exec($ch); if(!$html) { return false; } $html = new Simple_html_dom($html); $url_imagem = $tokenValue = ''; $imgcaptcha = $html->find('img[id=imgcaptcha]'); if(count($imgcaptcha)) { foreach($imgcaptcha as $imgAttr) $url_imagem = $imgAttr->src; if(preg_match('#guid=(.*)$#', $url_imagem, $arr)) { $idCaptcha = $arr[1]; $viewstate = $html->find('input[id=viewstate]'); if(count($viewstate)) { foreach($viewstate as $inputViewstate) $tokenValue = $inputViewstate->value; } if(!empty($idCaptcha) && !empty($tokenValue)) { $this->token = array($idCaptcha, $tokenValue); } else { $this->token = false; } } } $this->imgCaptcha = $this->getCaptcha($idCaptcha); } /** * _getToken() */ public function _getToken() { return $this->token; } /** * getCPF() * @param string $cpf CPF * @param string $captcha * @param string $token * @return array * */ private function getCPF($cpf, $captcha, $token) { if(!file_exists($this->cookieFile)) { return false; } $post = array ( 'txtCPF' => $cpf, 'captcha' => $captcha, 'captchaAudio' => '', 'Enviar' => 'Consultar', 'viewstate' => $token ); $data = http_build_query($post, NULL, '&'); $cookie = array('flag' => 1); $ch = curl_init('http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/ConsultaPublicaExibir.asp'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookieFile); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookieFile); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_COOKIE, http_build_query($cookie, NULL, '&')); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); return $html; } /** * parseHtmlCPF() * @param string $html * @return array Resultado */ private function parseHtmlCPF($html) { $dom = new DomDocument(); $dom->loadHTML($html); $nodes = $dom->getElementsByTagName('span'); //$len = $nodes->length; $campos = array(); for($i = 5; $i < 10; $i++) { if(!isset($nodes->item(($i+1))->nodeValue)) { break; } $current = trim($nodes->item($i)->nodeValue); $prox = trim($nodes->item(($i+1))->nodeValue); if(strpos($current, 'o Cadastral') !== false) { $campos['situacao'] = explode(':', $current); if(count($campos['situacao']) == 2) $campos['situacao'] = trim($campos['situacao'][1]); } if(strpos($current, 'Nome da Pessoa F') !== false) { $campos['nome'] = explode(':', $current); if(count($campos['nome']) == 2) $campos['nome'] = trim($campos['nome'][1]); } } return $campos; } /** * getCaptha() * @return image Captha */ private function getCaptcha() { $idCaptcha = $_REQUEST['id']; if(preg_match('#^[a-z0-9-]{36}$#', $idCaptcha)) { $url = 'http://www.receita.fazenda.gov.br/scripts/captcha/Telerik.Web.UI.WebResource.axd?type=rca&guid='.$idCaptcha; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $imgsource = curl_exec($ch); curl_close($ch); if(!empty($imgsource)) { $img = imagecreatefromstring($imgsource); header('Content-type: image/jpg'); return imagejpeg($img); } } } /** * showResult() * @param string $cpf * @param string $captcha * @param string $token * @return array $campos */ public function showResult($cpf, $captcha, $token) { $getHtmlCPF = $this->getCPF($cpf, $captcha, $token); if($getHtmlCPF) { $campos = $this->parseHtmlCPF($getHtmlCPF); var_dump($campos); } } } // cria um objeto TCPF $getCPF = new TCPF; // recebe o token $token = $getCPF->_getToken(); // Se post if ($_POST['cpf']) { $cpf = $_REQUEST['cpf']; $captcha = $_REQUEST['captcha']; $token = $_REQUEST['viewstate']; // executa consulta $getCPF->showResult($cpf, $captcha, $token); } ?> <html> <head> <title>Teste CPF</title> </head> <body> <form method="post" action="TCPF.class.php?showResult"> <span class="titleCats">CPF</span> <br /> <input name="cpf" type="text" maxlength="14" required /> <br /> <img src="TCPF.class.php?getCaptcha&id=<?php echo "$token[0]"; ?>" border="0"> <br /> <input name="captcha" type="text" maxlength="6" required /> <br /> <input type="hidden" name="viewstate" value="<?php echo $token[1]; ?>" /> <br/> <input type="submit" value="Enviar"/> </form> </body> </html> Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Janeiro 21, 2015 (editado) Amigos, consegui capturar o captcha para minha página e setar todos os parametros, mas acredito que está havendo um erro no retorno, pois o servidor informa que o Captcha está errado. Segue abaixo o script atualizado: <?php session_start(); class cpf_receita { function monta_form() { if(isset($_POST["enviar"])) { $this->valida_cpf($_POST["CPF"], $_POST["CAPTCHA"]); echo $_POST["CAPTCHA"]; } else { if(!file_exists("RF_cookie_cpf.txt")) { $fp = fopen("RF_cookie_cpf.txt","w"); fwrite($fp, ""); fclose($fp); } $ch = curl_init(); curl_setopt($ch, CURLOPT_COOKIEFILE, realpath("RF_cookie_cpf.txt")); curl_setopt($ch, CURLOPT_COOKIEJAR, realpath("RF_cookie_cpf.txt")); curl_setopt($ch, CURLOPT_URL, "http://www.receita.fazenda.gov.br/scripts/captcha/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIE, "flag=0"); $retorno = curl_exec($ch); curl_close($ch); $dom = new DomDocument(); @$dom->loadHTML($retorno); $xpath = new DOMXPath($dom); $q = $xpath->query("//img[@id='RadCaptcha1_CaptchaImage']"); $imagem = "http://www.receita.fazenda.gov.br/scripts/captcha/" . utf8_decode(trim($q->item(0)->getAttribute('src'))); // print_r($imagem); $q = $xpath->query("//input[@id='__VIEWSTATE']"); $_SESSION["viewstate"] = utf8_decode(trim($q->item(0)->getAttribute('value'))); // echo $_SESSION["viewstate"]; ?> <form method="post" action=""> CPF: <input type="text" name="CPF"/> <br /> Captcha: <input type="text" name="CAPTCHA"/> <br /> <img src="<?php echo($imagem); ?>" /> <br/> <input id="id_submit" name="enviar" type="submit" value="Consultar"/> </form> <?php } } function valida_cpf($cpf, $captha) { $ch = curl_init(); /* curl_setopt($ch, CURLOPT_COOKIEFILE, realpath("RF_cookie_cpf.txt")); curl_setopt($ch, CURLOPT_COOKIEJAR, realpath("RF_cookie_cpf.txt")); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_URL, "http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/ConsultaPublicaExibir.asp"); curl_setopt($ch, CURLOPT_COOKIE, "flag=1"); curl_setopt($ch, CURLOPT_POSTFIELDS, 'txtCPF=' . $cpf . '&captcha=' . $captha . '&captchaAudio=&viewstate=' . urlencode($_SESSION["viewstate"]) . '&id_submit=Consultar'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FILETIME, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); */ $post = array ( 'txtCPF' => $cpf, 'txtTexto_captcha_serpro_gov_br' => $captha, 'captchaAudio' => '', 'Enviar' => 'Consultar', 'viewstate' => urlencode($_SESSION["viewstate"]) ); $data = http_build_query($post, NULL, '&'); $cookie = array('flag' => 1); // $ch = curl_init('http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/ConsultaPublicaExibir.asp'); // $ch = curl_init('http://127.0.0.1/includes/bibliotecas/receita_federal_cpf_v1/recebe.php'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_COOKIEFILE, realpath("RF_cookie_cpf.txt")); curl_setopt($ch, CURLOPT_COOKIEJAR, realpath("RF_cookie_cpf.txt")); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); // curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/includes/bibliotecas/opa/recebe.php"); curl_setopt($ch, CURLOPT_URL, "http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/ConsultaPublicaExibir.asp"); curl_setopt($ch, CURLOPT_COOKIE, "flag=1"); // curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookieFile); // curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookieFile); // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); // curl_setopt($ch, CURLOPT_COOKIE, http_build_query($cookie, NULL, '&')); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $resultado = curl_exec($ch); //print_r($resultado); curl_close($ch); $dom = new DomDocument(); @$dom->loadHTML($resultado); $xpath = new DOMXPath($dom); $q = $xpath->query('//div[@class="clConteudoCentro"]'); $q2 = $xpath->query('//span[@class="clConteudoDados"]'); $nome = trim(utf8_decode(@$q2->item(1)->nodeValue)); $nome = explode(":", $nome); print_r($resultado."<br><br>"); if(@$nome[1] == "") echo "Captha ou CPF incorreto(s)."; else echo $nome[1]; } } $cpf = new cpf_receita; $cpf->monta_form(); ?> Editado Fevereiro 6, 2015 por hargon Termo removido devido a solicitação do usuário Compartilhar este post Link para o post Compartilhar em outros sites
tajiri 0 Denunciar post Postado Fevereiro 5, 2015 Também estou tentando corrigir isso ja faz 20 dias...rsss qualquer novidade eu posto aqui ok! Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Fevereiro 5, 2015 Também estou tentando corrigir isso ja faz 20 dias...rsss qualquer novidade eu posto aqui ok! amigo, me envie um e-mail bruno.vinny@gmail.com acho que tenho a solução. Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 7, 2015 (editado) Olá Tajiri e Vinoli Consegui a Solução que posto mais abaixo. Antes , vale lembrar que este excelente Script postado pelo Vanoli , foi criado por Cristiano Soares em 18/07/2013 Aqui as versões em forma de tutorial , para consulta de CNPJ e CPF CNPJ: http://tretasdanet.com/get/284c9ad300-coletando-informacoes-do-cnpj-direto-da-receita-federal-em-php CPF: http://tretasdanet.com/get/a2b1b1f113-coletando-informacoes-do-cpf-do-usuario-direto-da-receita-federal A Versão para consulta de CNPJ ainda funciona perfeitamente Bem , porêm a de CPF deixou de funcionar devido a mudança de links e na forma para geração de Captcha e id , conforme o Vanoli bem explicou. Recomendo a leitura dos links acima e na postagem de JJMALKA , no link abaixo , e que me inspirou na solução: http://www.activedelphi.com.br/forum/viewtopic.php?t=88194 ASolução é Simples: Novo arquivo getcapcha.php <?php define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.'cookies_cpf/'); @session_start(); $cookieFile = COOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { $file = fopen($cookieFile, 'w'); fclose($file); } $url = 'http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/captcha/gerarCaptcha.asp'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); $imgsource = curl_exec($ch); curl_close($ch); if(!empty($imgsource)) { $img = imagecreatefromstring($imgsource); header('Content-type: image/jpg'); imagejpeg($img); } ?> em funções.php elimine a função: function getCaptchaToken() ela não será mais usada , pois a mágica agora é feita pela SESSIONID gravada no cookie na primeira chamada de getcaptcha.php em index.php , elimine o bloco abaixo: $getCaptchaToken = getCaptchaToken(); if(!is_array($getCaptchaToken)) { echo 'Não foi possível obter Captcha e Token'; exit; } em funções.php , dentro da função getHtmlCPF , acrescente a mágica abaixo , que consiste em pegar dentro do seu cookie , os dados de Session utilizados pela bibli. curl na primeira chamada da geração do captcha $seu_arquivo_cookie = '.............'.session_id(); // colocar path relativo de seu arquivo de cookie (COOKIELOCAL) $file = fopen($seu_arquivo_cookie, 'r'); while (!feof($file)) {$conteudo .= fread($file, 1024);} fclose ($file); $explodir = explode(chr(9),$conteudo); $sessionName = trim($explodir[count($explodir)-2]); $sessionId = trim($explodir[count($explodir)-1]); de posse de $sessionName e $sessionId , faz-se a chamada CURL adicionando a chamada curl o parâmetro: curl_setopt($ch, CURLOPT_COOKIE, $sessionName.$sessionId); Espero ter ajudado Qualquer dúvida podem entrar em contato: pelimarcos@hotmail.com Abs.Marcos Peli Editado Fevereiro 7, 2015 por Massa191 Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Fevereiro 8, 2015 (editado) Muito bom amigo, vou testar a implementação, sua ajuda foi de granda valia. Obrigado pela contribuição. Editado Março 31, 2015 por William Bruno Remover quote desnecessário Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Fevereiro 8, 2015 Amigo, estou com uma dúvida, como obtenho o valor token, o qual posteriormente é enviado como viewstate? Você informou que a função getCaptchaToken poderia ser removida, pois a mágica seria feita pela session... Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 8, 2015 Amigo, estou com uma dúvida, como obtenho o valor token, o qual posteriormente é enviado como viewstate? Você informou que a função getCaptchaToken poderia ser removida, pois a mágica seria feita pela session... Aí é que está Vc. ão precisa do Token , vc. precisa de uma chave de sessão que é gerada na primeira visualização do Captcha e é gravada no cookie Passo mastigado os códigos que rodam aqui pra facilitar sua vida - São 4 arquivos php.(index.php , funcoes.php , processa.php , getcaptcha.php) - Não se esqueça de criar a pasta com o nome de (cookies_cpf) no mesmo diretório onde estarão estes 4 arquivos , onde serão guardados os cookies de sessão que armazenam as chaves de sessão da receita. Para rodar , basta chamar o index.php Primeiro arquivo: index.php <?php require('funcoes.php'); ?> <html> <head> <title>CNPJ e Captcha</title> </head> <body> <form method="post" action="processa.php"> <p><span class="titleCats">CPF e Captcha</span> <br /> <input type="text" name="CPF" maxlength="11" required /> <b style="color: red">CPF</b> <br /> <img src="getcaptcha.php" border="0"> <br /> <input type="text" name="CAPTCHA" maxlength="6" required /> <b style="color: red">O que vê na imagem acima?</b> <br /> </p> <p> <input id="id_submit" name="enviar" type="submit" value="Consultar"/> </p> </form> </body> </html> segundo arquivo: getcaptcha.php <?php define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.'cookies_cpf/'); // local onde será armazenado o cookie com os dados de sessão @session_start(); $cookieFile = COOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { $file = fopen($cookieFile, 'w'); fclose($file); } $url = 'http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/captcha/gerarCaptcha.asp'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // aqui será gravada as chaves de sessão curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // aqui será gravada as chaves de sessão // IMPORTANTE: sem o parametro RETURNTRANSFER para esta chamada de curl. $imgsource = curl_exec($ch); curl_close($ch); if(!empty($imgsource)) { $img = imagecreatefromstring($imgsource); header('Content-type: image/jpg'); imagejpeg($img); } ?> terceiro arquivo , o mais importante: funcoes.php obs. não usei a bibl. DOM para ler o xml , ... fiz meu próprio gato , rs <?php // define caminho absoluto (COOKIELOCAL) e relativo (HTTPCOOKIELOCAL) para arquivo cookie $pasta_cookies = 'cookies_cpf/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$pasta_cookies); define('HTTPCOOKIELOCAL', 'http://'.$_SERVER['SERVER_NAME'].str_replace(pathinfo($_SERVER['SCRIPT_FILENAME'],PATHINFO_BASENAME),'',$_SERVER['SCRIPT_NAME']).$pasta_cookies); // inicia sessão @session_start(); // função para pegar o que interessa function pega_o_que_interessa($inicio,$fim,$total) { $interesse = str_replace($inicio,'',str_replace(strstr(strstr($total,$inicio),$fim),'',strstr($total,$inicio))); return($interesse); } // função para pegar a resposta html da consulta pelo CPF na página da receita function getHtmlCPF($cpf, $captcha) { $cookieFile = COOKIELOCAL.session_id(); $cookieFile_fopen = HTTPCOOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { return false; } else { // pega os dados de sessão gerados na visualização do captcha dentro do cookie $file = fopen($cookieFile_fopen, 'r'); while (!feof($file)) {$conteudo .= fread($file, 1024);} fclose ($file); $explodir = explode(chr(9),$conteudo); $sessionName = trim($explodir[count($explodir)-2]); $sessionId = trim($explodir[count($explodir)-1]); } // dados que serão submetidos a consulta por post $post = array ( 'Enviar' => 'Consultar', 'txtCPF' => $cpf, 'txtTexto_captcha_serpro_gov_br'=> $captcha ); $post = http_build_query($post, NULL, '&'); // prepara a variavel de session , AQUI ESTÀ A MÁGICA $cookie = $sessionId.'='.$sessionId; $ch = curl_init('http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // aqui estão os campos de formulário curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_COOKIE, $cookie); // continua a sessão anterior com os dados gravados anteriormente no cookie curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); // echo $html , para ver a resposta da receita , tire o coment desta linha return $html; } // Função para extrair o que interessa da HTML e colocar em array sem DOM function parseHtmlCPF($html) { // respostas que interessam $campos = array( 'No do CPF:', 'Nome da Pessoa Física:', 'Situação Cadastral:'); // caracteres que devem ser eliminados da resposta $caract_especiais = array( chr(9), chr(10), chr(13), ' ', ' ', ); // prepara a resposta para extrair os dados $html = str_replace('<br /><br />','<br />',str_replace($caract_especiais,'',strip_tags($html,'<b><br>'))); // para utilizar na hora de devolver o status da consulta $html3 = $html; // faz a extração for($i=0;$i<count($campos);$i++) { $html2 = strstr($html,utf8_decode($campos[$i])); $resultado[] = trim(pega_o_que_interessa(utf8_decode($campos[$i]),'<br',$html2)); $html=$html2; } // devolve STATUS da consulta correto if(!$resultado[0]) { if(strstr($html3,utf8_decode('CPF incorreto'))) {$resultado['status'] = 'CPF incorreto';} else if(strstr($html3,utf8_decode('não existe em nossa base de dados'))) {$resultado['status'] = 'CPF não existe';} else if(strstr($html3,utf8_decode('Os caracteres da imagem não foram preenchidos corretamente'))) {$resultado['status'] = 'Imagem digitada incorretamente';} else {$resultado['status'] = 'Receita não responde';} } else {$resultado['status'] = 'OK';} return $resultado; } ?> acima mando os resultados de volta cmorry , mas se quiser echoar a resposta da receita fique a vontade.... basta tirar o coment // a referida linha no final da função:getHtmlCPF quarto Arquivo: processa.php <?php require('funcoes.php'); $cpf = $_POST['CPF']; $captcha = $_POST['CAPTCHA']; $getHtmlCPF = getHtmlCPF($cpf, $captcha); if($getHtmlCPF) { $campos = parseHtmlCPF($getHtmlCPF); print_r($campos); } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Fevereiro 8, 2015 Aí é que está você. ão precisa do Token , você. precisa de uma chave de sessão que é gerada na primeira visualização do Captcha e é gravada no cookie Passo mastigado os códigos que rodam aqui pra facilitar sua vida - São 4 arquivos php.(index.php , funcoes.php , processa.php , getcaptcha.php) - Não se esqueça de criar a pasta com o nome de (cookies_cpf) no mesmo diretório onde estarão estes 4 arquivos , onde serão guardados os cookies de sessão que armazenam as chaves de sessão da receita. Para rodar , basta chamar o index.php Primeiro arquivo: index.php <?php require('funcoes.php'); ?> <html> <head> <title>CNPJ e Captcha</title> </head> <body> <form method="post" action="processa.php"> <p><span class="titleCats">CPF e Captcha</span> <br /> <input type="text" name="CPF" maxlength="11" required /> <b style="color: red">CPF</b> <br /> <img src="getcaptcha.php" border="0"> <br /> <input type="text" name="CAPTCHA" maxlength="6" required /> <b style="color: red">O que vê na imagem acima?</b> <br /> </p> <p> <input id="id_submit" name="enviar" type="submit" value="Consultar"/> </p> </form> </body> </html> segundo arquivo: getcaptcha.php <?php define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.'cookies_cpf/'); // local onde será armazenado o cookie com os dados de sessão @session_start(); $cookieFile = COOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { $file = fopen($cookieFile, 'w'); fclose($file); } $url = 'http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/captcha/gerarCaptcha.asp'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // aqui será gravada as chaves de sessão curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // aqui será gravada as chaves de sessão // IMPORTANTE: sem o parametro RETURNTRANSFER para esta chamada de curl. $imgsource = curl_exec($ch); curl_close($ch); if(!empty($imgsource)) { $img = imagecreatefromstring($imgsource); header('Content-type: image/jpg'); imagejpeg($img); } ?> terceiro arquivo , o mais importante: funcoes.php obs. não usei a bibl. DOM para ler o xml , ... fiz meu próprio gato , rs <?php // define caminho absoluto (COOKIELOCAL) e relativo (HTTPCOOKIELOCAL) para arquivo cookie $pasta_cookies = 'cookies_cpf/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$pasta_cookies); define('HTTPCOOKIELOCAL', 'http://'.$_SERVER['SERVER_NAME'].str_replace(pathinfo($_SERVER['SCRIPT_FILENAME'],PATHINFO_BASENAME),'',$_SERVER['SCRIPT_NAME']).$pasta_cookies); // inicia sessão @session_start(); // função para pegar o que interessa function pega_o_que_interessa($inicio,$fim,$total) { $interesse = str_replace($inicio,'',str_replace(strstr(strstr($total,$inicio),$fim),'',strstr($total,$inicio))); return($interesse); } // função para pegar a resposta html da consulta pelo CPF na página da receita function getHtmlCPF($cpf, $captcha) { $cookieFile = COOKIELOCAL.session_id(); $cookieFile_fopen = HTTPCOOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { return false; } else { // pega os dados de sessão gerados na visualização do captcha dentro do cookie $file = fopen($cookieFile_fopen, 'r'); while (!feof($file)) {$conteudo .= fread($file, 1024);} fclose ($file); $explodir = explode(chr(9),$conteudo); $sessionName = trim($explodir[count($explodir)-2]); $sessionId = trim($explodir[count($explodir)-1]); } // dados que serão submetidos a consulta por post $post = array ( 'Enviar' => 'Consultar', 'txtCPF' => $cpf, 'txtTexto_captcha_serpro_gov_br'=> $captcha ); $post = http_build_query($post, NULL, '&'); // prepara a variavel de session , AQUI ESTÀ A MÁGICA $cookie = $sessionId.'='.$sessionId; $ch = curl_init('http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // aqui estão os campos de formulário curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_COOKIE, $cookie); // continua a sessão anterior com os dados gravados anteriormente no cookie curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); // echo $html , para ver a resposta da receita , tire o coment desta linha return $html; } // Função para extrair o que interessa da HTML e colocar em array sem DOM function parseHtmlCPF($html) { // respostas que interessam $campos = array( 'No do CPF:', 'Nome da Pessoa Física:', 'Situação Cadastral:'); // caracteres que devem ser eliminados da resposta $caract_especiais = array( chr(9), chr(10), chr(13), ' ', ' ', ); // prepara a resposta para extrair os dados $html = str_replace('<br /><br />','<br />',str_replace($caract_especiais,'',strip_tags($html,'<b><br>'))); // para utilizar na hora de devolver o status da consulta $html3 = $html; // faz a extração for($i=0;$i<count($campos);$i++) { $html2 = strstr($html,utf8_decode($campos[$i])); $resultado[] = trim(pega_o_que_interessa(utf8_decode($campos[$i]),'<br',$html2)); $html=$html2; } // devolve STATUS da consulta correto if(!$resultado[0]) { if(strstr($html3,utf8_decode('CPF incorreto'))) {$resultado['status'] = 'CPF incorreto';} else if(strstr($html3,utf8_decode('não existe em nossa base de dados'))) {$resultado['status'] = 'CPF não existe';} else if(strstr($html3,utf8_decode('Os caracteres da imagem não foram preenchidos corretamente'))) {$resultado['status'] = 'Imagem digitada incorretamente';} else {$resultado['status'] = 'Receita não responde';} } else {$resultado['status'] = 'OK';} return $resultado; } ?> acima mando os resultados de volta cmorry , mas se quiser echoar a resposta da receita fique a vontade.... basta tirar o coment // a referida linha no final da função:getHtmlCPF quarto Arquivo: processa.php <?php require('funcoes.php'); $cpf = $_POST['CPF']; $captcha = $_POST['CAPTCHA']; $getHtmlCPF = getHtmlCPF($cpf, $captcha); if($getHtmlCPF) { $campos = parseHtmlCPF($getHtmlCPF); print_r($campos); } ?> Perfeito amigo, parabéns pelo trabalho! Muito obrigado pela disposição em ajudar. Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 8, 2015 (editado) :yes: :yes: :yes: :yes: :yes: :coolio: Editado Fevereiro 8, 2015 por Massa191 Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Fevereiro 8, 2015 :yes: :yes: :yes: :yes: :yes: :coolio: Amigo, agora vem o grande problema desse novo sistema da receita, como ele usa o session e o session é o do meu servidor, se tiver duas pessoas realizando o cadastro em meu site, quando a PESSOA B gerar o novo captcha o da PESSOA A já será anulado e ela não conseguirá validar. Você tem alguma ideia de como implementar isso, superando esse problema? Não consigo vislumbrar nenhum meio. Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 8, 2015 Amigo, agora vem o grande problema desse novo sistema da receita, como ele usa o session e o session é o do meu servidor, se tiver duas pessoas realizando o cadastro em meu site, quando a PESSOA B gerar o novo captcha o da PESSOA A já será anulado e ela não conseguirá validar. Você tem alguma ideia de como implementar isso, superando esse problema? Não consigo vislumbrar nenhum meio. Não havera problema algum. A Session de seu servidor para com o browser do internauta gerou um cookie distinto, cuja o nome é a session do internauta e cuja conteudo esta a session da chamada curl para a receita. Cada internauta pendurado no seu site gera um cookie distinto. Experimente fazer a consulta em dois navegadorrs distintos , e monitore a pasta cookies com seu programa de ftp enquanto faz isso O chato é que de tempos em tempos vc vai ter que fazer uma limpa na pasta dos cookies , rs Antes que pergunte , sim ... dá para automatizar essa limpa , rs Compartilhar este post Link para o post Compartilhar em outros sites
Vinoli 0 Denunciar post Postado Fevereiro 8, 2015 Não havera problema algum. A Session de seu servidor para com o browser do internauta gerou um cookie distinto, cuja o nome é a session do internauta e cuja conteudo esta a session da chamada curl para a receita. Cada internauta pendurado no seu site gera um cookie distinto. Experimente fazer a consulta em dois navegadorrs distintos , e monitore a pasta cookies com seu programa de ftp enquanto faz isso O chato é que de tempos em tempos você vai ter que fazer uma limpa na pasta dos cookies , rs Antes que pergunte , sim ... dá para automatizar essa limpa , rs Realmente amigo, funcionou perfeito, agora consigo me virar por aqui... kkkkkk essa aplicação exigiu um conhecimento que eu ainda não tinha, principalmente quanto a curl e utilização de cookies de sites de terceiros. Ficou muito bom, sou imensamente grato pela ajuda. Bom domingo, abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 8, 2015 Eu estava desde quarta feira passada fundindo a cabeça nos javascripts da receita , kkkkk. Foi ontem , quando vi o post no forum activedelphi que a coisa desenrolou. Daí foi só dar aquela adaptada , rs Estamos ai Abraços Compartilhar este post Link para o post Compartilhar em outros sites
valdezweb 0 Denunciar post Postado Fevereiro 9, 2015 Pessoal, estou precisando de uma solução similar, só que ao invés de consultar CPF eu gotaria de alimentar um sistema de cadastramento de veículos apenas com CPF e renavam, com intuito de reduzir carga administraiva e redução de erros. Quem estiver disponível, me cham inbox. Julio Cesar Valdez Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 9, 2015 Amigo Dei uma olhadinha rápida no código html da página da receita que faz a consulta do renavam https://www.ipva.fazenda.sp.gov.br/IPVANET_Consulta/Consulta.aspx , e ACHO que a solução que postei para consulta de CPF acima aplica-se perfeitamente , bastando alterar os Links de consulta das chamadas CURL , e os dados de formulários enviados por Post na consulta Curl. Faça uns testes alterando os dados abaixo: - Url da Consulta dos renavam: https://www.ipva.fazenda.sp.gov.br/IPVANET_Consulta/Consulta.aspx (parâmetro da chamada Curl da função getHtmlCPF em funções.php) - Url da geração do Captcha: https://www.ipva.fazenda.sp.gov.br/IPVANET_Consulta/captcha.ashx (parâmetro da chamada curl pelo script getcaptha.php) - Dados do Formulário , vc. deve pegar os Inputs do form e coloca-los no parâmetro post da chamada Curl da função getHtmlCPF no script funções.php Claro que a função parseHtmlCPF() deverá ser reescrita para estrair os dados da html de resposta , ou então utilizar a bib. DOM para isso , mas se vc. conseguir echoar a resposta da consulta , já será 99,9% de solução , o resto é serviço "braçal" Boa sorte Abraço Marcos Peli Compartilhar este post Link para o post Compartilhar em outros sites
Fabricio Viana 0 Denunciar post Postado Fevereiro 19, 2015 Olá amigos. Tudo ia muito bem com o CNPJ até que na ---ta-feira de carnaval a Receita Federal alterou também a parte de CNPJ. Tentei alterar para seguir o que foi feito no CPF, mas não obtive sucesso. Minha função de pegar o capcha: function getCaptchaTokenCNPJ() { $cookieFile = COOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { $file = fopen($cookieFile, 'w'); fclose($file); } $ch = curl_init('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp'); //debug - podem ignorar isso. $fp = fopen('/aaa.txt', 'w'); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $fp); $timeout = 0; curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // Getting binary data curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); $image = curl_exec($ch); $filename = '/'.session_id().'.jpg'; $filenameFormulario = '/'.session_id().'.jpg'; $fh = fopen($filename, 'w'); fwrite($fh, $image); fclose($fh); if (filesize($filename) < 2500){ //se der erro e nao carregar a imagem $filenameFormulario = 'erro_receita_federal'; } return ($filenameFormulario); } Beleza! Consigo salvar o captcha em JPEG e criar o arquivo com o cookie!! Agora vem a função de pegar o html: function getHtmlCNPJ($cnpj, $captcha) { // aqui é aquele arquivo onde salvei os cookies lá em getCaptchaToken() $cookieFile = COOKIELOCAL.session_id(); $cookieFile = '/'.session_id(); if(!file_exists($cookieFile)) return false; $post = array ( 'origem' => 'comprovante', 'cnpj' => $cnpj, 'search_type' => 'cnpj', 'submit1' => 'Consultar', 'txtTexto_captcha_serpro_gov_br' => $captcha ); $post = http_build_query($post, NULL, '&'); // tenho que enviar esse cookie pra eles $cookie = array('flag' => 1); $ch = curl_init('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp'); //debug - explicarei abaixo $fp = fopen('/bbb.txt', 'w'); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $fp); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'); curl_setopt($ch, CURLOPT_COOKIE, http_build_query($cookie, NULL, '&')); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $header[0] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; $header[] = "Connection: keep-alive"; $header[] = "Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3"; curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); $html = curl_exec($ch); curl_close($ch); return $html; } Quando dou um echo no $html ele retorna o conteúdo de: http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp Ou seja, ele não reconheceu meu capcha. Conteúdo do meu aaa.txt (que pega o captcha): * About to connect() to www.receita.fazenda.gov.br port 80 (#0) * Trying 161.148.231.100... * connected * Connected to www.receita.fazenda.gov.br (161.148.231.100) port 80 (#0) > GET /pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp HTTP/1.1 Host: www.receita.fazenda.gov.br Accept: */* < HTTP/1.1 200 OK < Date: Thu, 19 Feb 2015 03:49:53 GMT < Server: Microsoft-IIS/6.0 < X-Powered-By: ASP.NET < Content-Length: 6104 < Content-Type: image/png < Expires: Thu, 19 Feb 2015 03:49:53 GMT * Added cookie ASPSESSIONIDCARTQRDC="GECCAGJCMNADNDEEDLJMOFAK" for domain www.receita.fazenda.gov.br, path /, expire 0 < Set-Cookie: ASPSESSIONIDCARTQRDC=GECCAGJCMNADNDEEDLJMOFAK; path=/ < Cache-control: private < * Connection #0 to host www.receita.fazenda.gov.br left intact * Closing connection #0 Conteúdo do meu bbb.txt: * About to connect() to www.receita.fazenda.gov.br port 80 (#0) * Trying 161.148.231.100... * connected * Connected to www.receita.fazenda.gov.br (161.148.231.100) port 80 (#0) > POST /pessoajuridica/cnpj/cnpjreva/valida.asp HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Host: www.receita.fazenda.gov.br Accept-Encoding: gzip,deflate Referer: http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp Cookie: ASPSESSIONIDCARTQRDC=GECCAGJCMNADNDEEDLJMOFAK; flag=1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Connection: keep-alive Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3 Content-Length: 111 Content-Type: application/x-www-form-urlencoded < HTTP/1.1 302 Object moved < Date: Thu, 19 Feb 2015 03:50:12 GMT < Server: Microsoft-IIS/6.0 < X-Powered-By: ASP.NET < Location: Cnpjreva_Solicitacao2.asp?cnpj=11111111111111 < Content-Length: 166 < Content-Type: text/html < Cache-control: private < * Ignoring the response-body * Connection #0 to host www.receita.fazenda.gov.br left intact * Issue another request to this URL: 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp?cnpj=11111111111111' * Violate RFC 2616/10.3.3 and switch from POST to GET * Re-using existing connection! (#0) with host www.receita.fazenda.gov.br * Connected to www.receita.fazenda.gov.br (161.148.231.100) port 80 (#0) > GET /pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp?cnpj=11111111111111 HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Host: www.receita.fazenda.gov.br Accept-Encoding: gzip,deflate Referer: http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp Cookie: ASPSESSIONIDCARTQRDC=GECCAGJCMNADNDEEDLJMOFAK; flag=1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Connection: keep-alive Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3 < HTTP/1.1 200 OK < Date: Thu, 19 Feb 2015 03:50:13 GMT < Server: Microsoft-IIS/6.0 < X-Powered-By: ASP.NET < pragma: no-cache < cache-control: private < Content-Length: 8219 < Content-Type: text/html < Expires: Wed, 18 Feb 2015 03:50:12 GMT < Cache-control: no-cache < * Connection #0 to host www.receita.fazenda.gov.br left intact * Closing connection #0 A linha: Location: Cnpjreva_Solicitacao2.asp?cnpj=11111111111111 Quando rodo pelo FireFox, direto no site da Receita ele é assim: Location: Cnpjreva_Vstatus.asp?origem=comprovante&cnpj=11111111111111 Pelo que entendi a Receita não reconheceu o envio do meu captcha. Alguém conseguiu resolver isso? Obrigado! Fabricio Compartilhar este post Link para o post Compartilhar em outros sites
Massa191 18 Denunciar post Postado Fevereiro 19, 2015 Olá Fabricio Sim , eu resolvi o problema na mesma sexta feira , dia em que a receita mudou a geração do captcha para PJ Basicamente o que vc. não está fazendo é passar as variaveis de sessão da primeira consulta de volta para a receita ( ASPSESSIONIDCARTQRDC=GECCAGJCMNADNDEEDLJMOFAK ). , e em função disso , vc. passa a ter uma sessão diferente a cada chamada curl , que obviamente não bate com o que vc. anexa a chamada. Do jeito que vc. está fazendo , é como se vc. abrisse um navegador (com uma session distinta) e um cookie distinto para mostrar o captcha , e enviasse os dados por POST de um outro navegador com o mesmo cookie do primeiro , mas com uma outra session Existem duas formas de resolver isso: Pegar a session na primeira chamada CURL , na geração do captcha e enviar estas variaveis de sessão através de CURLOPT_HTTPHEADER , ou através de CURLOPT_COOKIE nas chamadas curl seguintes , de forma a simular que o mesmo navegador , com a mesma session originou as chamadas. Seguem os scripts mastigados , rs lembre-se de criar uma pasta chamada cookies_cnpj no mesmo diretório onde estiverem estes 4 scripts abaixo , pois é nela que serão gravadas as variaveis de sessão da receita que posteriormente serão enviadas de volta a cada chamada CURL , preservando a session. Outra coisa , vc. não precisa gravar a imagem captcha em arquivo. vc. pode espelha-la diretamente da receita , fazendo a chamada curl sem a opção CURLOPT_RETURNTRANSFER , em um script separado , que será invocado pelo SRC da tag IMG na html. Mais abaixo vc. entenderá. index.php <html> <head> <title>CNPJ e Captcha</title> </head> <body> <form method="post" action="processa.php"> <p><span class="titleCats">CNPJ e Captcha</span> <br /> <input type="text" name="CNPJ" maxlength="19" required /> <b style="color: red">CNPJ</b> <br /> <img src="getcaptcha.php" border="0"> <br /> <input type="text" name="CAPTCHA" maxlength="6" required /> <b style="color: red">O que vê na imagem acima?</b> <br /> </p> <p> <input id="id_submit" name="enviar" type="submit" value="Consultar"/> </p> </form> </body> </html> getcaptcha.php <?php // define caminho absoluto e relativo para arquivo cookie $pasta_cookies = 'cookies_cnpj/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$pasta_cookies); define('HTTPCOOKIELOCAL', 'http://'.$_SERVER['SERVER_NAME'].str_replace(pathinfo($_SERVER['SCRIPT_FILENAME'],PATHINFO_BASENAME),'',$_SERVER['SCRIPT_NAME']).$pasta_cookies); // inicia sessão @session_start(); $cookieFile_fopen = HTTPCOOKIELOCAL.session_id(); $cookieFile = COOKIELOCAL.session_id(); // cria arquivo onde será salva a sessão com a receita, caso ele não exista if(!file_exists($cookieFile)) { $file = fopen($cookieFile, 'w'); fclose($file); } // faz a chamaa para a receita que exibe o captcha $url = 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // salva os dados de sessão curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // atualiza os dados de sessão se estiverem desatualizados curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); // não utilizar returntransfer , este script replica imagem captcha da receita sem necessidade de gravar a imagem $imgsource = curl_exec($ch); curl_close($ch); // se tiver imagem , mostra if(!empty($imgsource)) { $img = imagecreatefromstring($imgsource); header('Content-type: image/jpg'); imagejpeg($img); } // Script abaixo simula que mostrou a página com formulário de entrada da receita (Cnpjreva_Solicitacao2.asp) // pois do contrário a primeira consulta não retorna válida , possivelmente por conta de algo gravado na sessão da receita // observe que estou preservando as variaveis de sessão $sessionName=$sessionId e enviando de volta em CURLOPT_COOKIE // pega os dados de sessão gerados na visualização do captcha dentro do cookie $file = fopen($cookieFile_fopen, 'r'); while (!feof($file)) {$conteudo .= fread($file, 1024);} fclose ($file); $explodir = explode(chr(9),$conteudo); $sessionName = trim($explodir[count($explodir)-2]); $sessionId = trim($explodir[count($explodir)-1]); // constroe o parâmetro de sessão que será passado no próximo curl $cookie = $sessionName.'='.$sessionId; $ch = curl_init('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp'); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_COOKIE, $cookie); // dados de sessão e flag=1 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); ?> funcoes.php <?php // define caminho absoluto e relativo para arquivo cookie $pasta_cookies = 'cookies_cnpj/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$pasta_cookies); define('HTTPCOOKIELOCAL', 'http://'.$_SERVER['SERVER_NAME'].str_replace(pathinfo($_SERVER['SCRIPT_FILENAME'],PATHINFO_BASENAME),'',$_SERVER['SCRIPT_NAME']).$pasta_cookies); // inicia sessão @session_start(); // função para pegar o que interessa function pega_o_que_interessa($inicio,$fim,$total) { $interesse = str_replace($inicio,'',str_replace(strstr(strstr($total,$inicio),$fim),'',strstr($total,$inicio))); return($interesse); } // função para pegar a resposta html da consulta pelo CPF na página da receita function getHtmlCNPJ($cnpj, $captcha) { $cookieFile = COOKIELOCAL.session_id(); $cookieFile_fopen = HTTPCOOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { return false; } else { // pega os dados de sessão gerados na visualização do captcha dentro do cookie $file = fopen($cookieFile_fopen, 'r'); while (!feof($file)) {$conteudo .= fread($file, 1024);} fclose ($file); $explodir = explode(chr(9),$conteudo); $sessionName = trim($explodir[count($explodir)-2]); $sessionId = trim($explodir[count($explodir)-1]); // constroe o parâmetro de sessão que será passado no próximo curl $cookie = $sessionName.'='.$sessionId.';flag=1'; } // dados que serão submetidos a consulta por post $post = array ( 'submit1' => 'Consultar', 'origem' => 'comprovante', 'cnpj' => $cnpj, 'txtTexto_captcha_serpro_gov_br'=> $captcha, 'search_type' => 'cnpj' ); $post = http_build_query($post, NULL, '&'); $ch = curl_init('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // aqui estão os campos de formulário curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_COOKIE, $cookie); // dados de sessão e flag=1 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); return $html; } // Função para extrair o que interessa da HTML e colocar em array function parseHtmlCNPJ($html) { // respostas que interessam $campos = array( 'NÚMERO DE INSCRIÇÃO', 'DATA DE ABERTURA', 'NOME EMPRESARIAL', 'TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)', 'CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL', 'CÓDIGO E DESCRIÇÃO DAS ATIVIDADES ECONÔMICAS SECUNDÁRIAS', 'CÓDIGO E DESCRIÇÃO DA NATUREZA JURÍDICA', 'LOGRADOURO', 'NÚMERO', 'COMPLEMENTO', 'CEP', 'BAIRRO/DISTRITO', 'MUNICÍPIO', 'UF', 'ENDEREÇO ELETRÔNICO', 'TELEFONE', 'ENTE FEDERATIVO RESPONSÁVEL (EFR)', 'SITUAÇÃO CADASTRAL', 'DATA DA SITUAÇÃO CADASTRAL', 'MOTIVO DE SITUAÇÃO CADASTRAL', 'SITUAÇÃO ESPECIAL', 'DATA DA SITUAÇÃO ESPECIAL'); // caracteres que devem ser eliminados da resposta $caract_especiais = array( chr(9), chr(10), chr(13), ' ', '</b>', ' ', '<b>MATRIZ<br>', '<b>FILIAL<br>' ); // prepara a resposta para extrair os dados $html = str_replace('<br><b>','<b>',str_replace($caract_especiais,'',strip_tags($html,'<b><br>'))); $html3 = $html; // faz a extração for($i=0;$i<count($campos);$i++) { $html2 = strstr($html,utf8_decode($campos[$i])); $resultado[] = trim(pega_o_que_interessa(utf8_decode($campos[$i]).'<b>','<br>',$html2)); $html=$html2; } // extrai os CNAEs secundarios , quando forem mais de um if(strstr($resultado[5],'<b>')) { $cnae_secundarios = explode('<b>',$resultado[5]); $resultado[5] = $cnae_secundarios; unset($cnae_secundarios); } // devolve STATUS da consulta correto if(!$resultado[0]) { if(strstr($html3,utf8_decode('O número do CNPJ não é válido'))) {$resultado['status'] = 'CNPJ incorreto ou não existe';} else {$resultado['status'] = 'Imagem digitada incorretamente';} } else {$resultado['status'] = 'OK';} return $resultado; } ?> processa.php <?php require('funcoes.php'); $cnpj = $_POST['CNPJ']; $captcha = $_POST['CAPTCHA']; // pega html resposta da receita $getHtmlCNPJ = getHtmlCNPJ($cnpj, $captcha); if($getHtmlCNPJ) { // volova os dados em um array $campos = parseHtmlCNPJ($getHtmlCNPJ); print_r($campos); } ?> AbraçoMarcos Peli 1 Compartilhar este post Link para o post Compartilhar em outros sites
Fabricio Viana 0 Denunciar post Postado Fevereiro 20, 2015 Olá Marcos! Puxa, muito obrigado pela ajuda! Vou implementar a imagem diretamente, como você sugeriu! Grande abraço Fabricio Compartilhar este post Link para o post Compartilhar em outros sites
pmccanciani 0 Denunciar post Postado Março 2, 2015 (editado) Amigo tentei usar todo o seu "mastigado" ele consegue pagar a imagem do captcha mas não importa quantas vezes eu tente ele sempre diz que a imagem esta erada alguem consegue me explicar o motivo ou se puder me dar uma luz eu agradeço. Editado Março 31, 2015 por William Bruno Remover quote desnecessário Compartilhar este post Link para o post Compartilhar em outros sites