Ir para conteúdo

CriS 4devs

Members
  • Total de itens

    2
  • Registro em

  • Última visita

Reputação

0 Comum

Sobre CriS 4devs

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

  1. CriS 4devs

    Obter Nome/Captcha por Consulta na Receita Federal via PHP/CURL

    Fico feliz de contribuir de alguma forma. Sem sombra de dúvidas quebrar o recaptcha do google será uma tarefa árdua devido as validações que são realizadas não só no domínio como também na formulação do mesmo em imagens e texto. Mas creio que devido a acessibilidade os captchas sonoros continuarão, o governo é obrigado a dar acesso para todos, e sem o captcha sonoro cegos por exemplo não teria acesso ao portal ou as informações neles inseridas. O captcha do Google não tem suporte a acessibilidade de deficientes. Creio que o captcha sonoro será mantido por um bom tempo. Abraços.
  2. CriS 4devs

    Obter Nome/Captcha por Consulta na Receita Federal via PHP/CURL

    Boa tarde, acompanho sempre o fórum, e vi que vocês tinham dúvidas referente a atualização dos captchas para consulta de CNPJ e CPF. Fiz o cadastro exatamente para compartilhar a solução com vocês, a integração foi baseada no código inicial postado aqui mesmo nesse tópico, e está em produção em uma das aplicações na minha empresa. Testado: 22/02/2018 Valeu pessoal qualquer dúvida só perguntar. Vou passar pra vocês o código atualizado realizando consulta para CPF ou CNPJ são os mesmos 4 arquivos: index.php: <?php include("getcaptcha.php"); ?> <html> <head> <title>CNPJ , CPF e Captcha</title> </head> <body> <form id="receita_cnpj" name="receita_cnpj" method="post" action="processa.php"> <p><span class="titleCats">CNPJ e Captcha</span> <br /> <input name="cnpj" type="text" maxlength="14" required /> <b style="color: red">CNPJ</b> <br /> <img id="captcha_cnpj" src="<?php echo $imagem_cnpj; ?>" border="0"> <br /> <input name="captcha_cnpj" type="text" maxlength="6" required /> <b style="color: red">O que vê na imagem acima?</b> <br /> </p> <p> <input id="enviar" name="enviar" type="submit" value="Consultar"/> </p> <p> _____________________________________________________ </p> </form> <form id="receita_cpf" name="receita_cpf" method="post" action="processa.php"> <p><span class="titleCats">CPF e Captcha</span> <br /> <input type="text" name="cpf" maxlength="14" minlength="14" required /> <b style="color: red">CPF xxx.xxx.xxx-xx</b> <br /> <input type="text" name="txtDataNascimento" maxlength="10" minlength="10" required /> <b style="color: red">Data Nascim. dd/mm/aaaa</b> <br /> <img id="captcha_cpf" src="<?php echo $imagem_cpf; ?>" border="0"> <br /> <input type="text" name="captcha_cpf" minlength="6" maxlength="6" required /> <b style="color: red">O que vê na imagem acima?</b> <br /> </p> <p> <input type="hidden" name="token_cpf" id="token_cpf" value="<?php echo $token_cpf; ?>" /> <input id="enviar" name="enviar" type="submit" value="Consultar"/> </p> <p> _____________________________________________________ </p> </form> </body> </html> getcaptcha.php <?php // inicia sessão @session_start(); // define o local onde serão guardados os cookies de sessão , path real e completo $pasta_cookies = 'cookies/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$pasta_cookies); // Headers comuns em todas as chamadas CURL, com exceçao do Índice [0], que muda para CPF e CNPJ $headers = array( 0 => '', // aqui vai o HOST da consulta conforme a necessidade (CPF ou CNPJ) 1 => 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0', 2 => 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 3 => 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3', 4 => 'Connection: keep-alive', 5 => 'Upgrade-Insecure-Requests: 1' ); // urls para obtenção dos dados $url['cnpj'] = 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_solicitacao3.asp'; $url_captcha['cnpj'] = 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp'; $host['cnpj'] = 'Host: www.receita.fazenda.gov.br'; $url['cpf'] = 'http://cpf.receita.fazenda.gov.br/situacao/'; $url_captcha['cpf'] = 'http://cpf.receita.fazenda.gov.br/situacao/defaultSonoro.asp?CPF=&NASCIMENTO='; $host['cpf'] = 'Host: cpf.receita.fazenda.gov.br'; // percorre os arrays fazendo as chamadas de CNPJ e CPF: $key é o tipo de chamada foreach ($url as $key => $value) { // define o hosts a ser usado no header da chamada curl conforme $key $headers[0] = $host[$key]; // define o nome do arquivo de cookie a ser usado para cada chamada conforme $key $cookieFile = COOKIELOCAL.$key.'_'.session_id(); // cria o arquivo se ele não existe if(!file_exists($cookieFile)) { $file = fopen($cookieFile, 'w'); fclose($file); } else { // pega os dados de sessão gerados na visualização do captcha dentro do cookie $file = fopen($cookieFile, '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($value); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); //var_dump($result); // trata os resultados da consulta curl if(!empty($result)) { // pega os dados de sessão gerados nas primeiras chamadas e que estão dentro do cookie $file = fopen($cookieFile, '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]); $cookie = $sessionName.'='.$sessionId; $ch = curl_init($url_captcha[$key]); if($key == 'cpf') { // pega payload dentro da html, e posta $corte_inicial = 'data-clienteid="'; $corte_final = '"></div>'; $payload = str_replace($corte_inicial,'',str_replace(strstr(strstr($result,$corte_inicial),$corte_final),'',strstr($result,$corte_inicial))); curl_setopt($ch, CURLOPT_POST, true); // seta metodo POST para envio de payload curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); // aqui vai o payload para obter token e captcha da consulta CPF } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // headers da chamada 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_COOKIE, $cookie); // cookie com os dados da sessão curl_setopt($ch, CURLOPT_REFERER, $value); // refer = url da chamada anterior curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); if($key == 'cnpj') {$imagem_cnpj = 'data:image/png;base64,'.base64_encode($result);} else if($key == 'cpf') { //$html = file_get_contents($url); $doc = new DOMDocument(); @$doc->loadHTML($result); $tags = $doc->getElementsByTagName('img'); $count = 0; foreach ($tags as $tag) { $count++; if($tag->getAttribute('id') == "imgCaptcha"){ //echo $tag->getAttribute('src'); $imagem_cpf = $tag->getAttribute('src'); } //echo $tag->getAttribute('src'); //$imagem_cpf = 'data:image/png;base64,'.$tag->getAttribute('src'); //$imagem_cpf = $tag->getAttribute('id'); //$imagem_cpf = $tag->getAttribute('src'); } //echo $imagem_cpf; //$token_captcha = explode('@', $result); //$token_cpf = $token_captcha[0]; //$imagem_cpf = 'data:image/png;base64,'.$token_captcha[1]; // esta imagem do captcha de CPF já está encodada base 64 } } } ?> processa.php: <?php require('funcoes.php'); // dados da postagem de formulário de CNPJ $cnpj = $_POST['cnpj']; // Entradas POST devem ser tratadas para evitar injections $captcha_cnpj = $_POST['captcha_cnpj']; // Entradas POST devem ser tratadas para evitar injections // dados da postagem do formulario de CPF $cpf = $_POST['cpf']; // Entradas POST devem ser tratadas para evitar injections $datanascim = $_POST['txtDataNascimento']; // Entradas POST devem ser tratadas para evitar injections $captcha_cpf = $_POST['captcha_cpf']; // Entradas POST devem ser tratadas para evitar injections $token_cpf = $_POST['token_cpf']; // Entradas POST devem ser tratadas para evitar injections if($cnpj AND $captcha_cnpj) { $getHtmlCNPJ = getHtmlCNPJ($cnpj, $captcha_cnpj); $campos = parseHtmlCNPJ($getHtmlCNPJ); } if($cpf AND $datanascim AND $captcha_cpf) { $getHtmlCPF = getHtmlCPF($cpf, $datanascim, $captcha_cpf, $token_cpf); $campos = parseHtmlCPF($getHtmlCPF); } print_r($campos); ?> funcoes.php: <?php // define caminho absoluto e relativo para arquivo cookie $pasta_cookies = 'cookies/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$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.'cnpj_'.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, '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]); // se não tem falg 1 no cookie então acrescenta if(!strstr($conteudo,'flag 1')) { // linha que deve ser inserida no cookie antes da consulta cnpj // observações argumentos separados por tab (chr(9)) e new line no final e inicio da linha (chr(10)) // substitui dois chr(10) padrão do cookie para separar cabecario do conteudo , adicionando o conteudo $linha , que tb inicia com dois chr(10) $linha = chr(10).chr(10).'www.receita.fazenda.gov.br FALSE /pessoajuridica/cnpj/cnpjreva/ FALSE 0 flag 1'.chr(10); // novo cookie com o flag=1 dentro dele , antes da linha de sessionname e sessionid $novo_cookie = str_replace(chr(10).chr(10),$linha,$conteudo); // apaga o cookie antigo unlink($cookieFile); // cria o novo cookie , com a linha flag=1 inserida $file = fopen($cookieFile, 'w'); fwrite($file, $novo_cookie); fclose($file); } // 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, '&'); // prepara headers da consulta $headers = array( 'Host: www.receita.fazenda.gov.br', 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', ); $ch = curl_init('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp'); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 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_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 pegar a resposta html da consulta pelo CPF na página da receita function getHtmlCPF($cpf, $datanascim, $captcha, $token) { $url = 'http://cpf.receita.fazenda.gov.br/situacao/ConsultaSituacao.asp'; // nova URL 29/maio/2017 para consulta CPF $cookieFile = COOKIELOCAL.'cpf_'.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, '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]); // prepara a variavel de session $cookie = $sessionName.'='.$sessionId; } // dados que serão submetidos a consulta por post $post = array ( //'txtToken_captcha_serpro_gov_br' => $token, 'txtTexto_captcha_serpro_gov_br' => $captcha, 'txtCPF' => $cpf, 'txtDataNascimento' => $datanascim, ); $post = http_build_query($post, NULL, '&'); // prepara headers da consulta $headers = array( 'Host: cpf.receita.fazenda.gov.br', 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', ); $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 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_COOKIE, $cookie); // continua a sessão anterior com os dados do captcha curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://cpf.receita.fazenda.gov.br/situacao/'); // Novo Referer 29/Maio/2017 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), '&nbsp;', '</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; } // Função para extrair o que interessa da HTML e colocar em array function parseHtmlCPF($html) { // respostas que interessam $campos = array( 'N&ordm; do CPF: <span class="clBold">', 'Nome: <span class="clBold">', 'Data Nascimento: <span class="clBold">', 'Situa&ccedil;&atilde;o Cadastral: <span class="clBold">', 'Data de Inscri&ccedil;&atilde;o no CPF: <span class="clBold">' ); // 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]),'</span>',$html2)); $html=$html2; } // devolve STATUS da consulta correto if(!$resultado[0]) { if(strstr($html3,'CPF incorreto')) {$resultado['status'] = 'CPF incorreto';} else if(strstr($html3,'n&atilde;o existe em nossa base de dados')) {$resultado['status'] = 'CPF não existe';} else if(strstr($html3,'Os caracteres da imagem n&atilde;o foram preenchidos corretamente')) {$resultado['status'] = 'Imagem digitada incorretamente';} else if(strstr($html3,'Data de nascimento informada')) {$resultado['status'] = 'Data de Nascimento divergente';} else {$resultado['status'] = 'Receita não responde';} } else {$resultado['status'] = 'OK';} return $resultado; } ?>
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.