Ir para conteúdo
Vinoli

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

Recommended Posts

3 horas atrás, Tiago Silveira disse:

 

Então os dados de cpf estão retornando indisponível desde domingo, ainda não voltou e já estou pensando em um plano B pois a nossa aplicação de cadastro parou de funcionar totalmente por isso. Não sei do CNPJ pois não uso.

 

Tenta dar permissão CHMOD 777 na pasta de cookies. Em localhost por padrão funciona pois as pastas no pc já tem tal permissão. Tive problema parecido com isso qo subir para produção e ao dar permissão a pasta funcionou normalmente.

 

 

 

Já liberei todas as permissões possíveis para a pasta de consulta, incluindo a de cookies internamente. Da mesma forma que baixei, eu testei na minha maquinha, vi que funcionou, e subi para o servidor para fazer os testes. Liberei todas as permissões de leitura, escrita, acesso do apache, etc.. para pasta. O Curl está ativado, tudo funcionando corretamente, porém apenas na hora de recuperação dos dados da empresa que dá isso, não retorna nada, como se tivesse ocorrido um erro na receita.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Jhonatan G. disse:

 

Já liberei todas as permissões possíveis para a pasta de consulta, incluindo a de cookies internamente. Da mesma forma que baixei, eu testei na minha maquinha, vi que funcionou, e subi para o servidor para fazer os testes. Liberei todas as permissões de leitura, escrita, acesso do apache, etc.. para pasta. O Curl está ativado, tudo funcionando corretamente, porém apenas na hora de recuperação dos dados da empresa que dá isso, não retorna nada, como se tivesse ocorrido um erro na receita.

Boa tarde

 

Hoje minha aplicação conseguiu validar 5 solicitações de 269 cadastros, por isso acredito que não seja problema de url.

Compartilhar este post


Link para o post
Compartilhar em outros sites
35 minutos atrás, cap_alts disse:

Boa tarde

 

Hoje minha aplicação conseguiu validar 5 solicitações de 269 cadastros, por isso acredito que não seja problema de url.

 

Então pela url de acesso do próprio site da receita ele dá como não responde. "SRFB: Sistema Indisponível. Tente mais tarde. "

 

O link que usamos é esse aqui http://cpf.receita.fazenda.gov.br/situacao/ConsultaSituacao.asp

 

por isso que deve ter conseguido retorno algumas vezes. Provavelmente está ou sobrecarregado ou está se tornando depreciado, já que a receita muda a forma meio que constantemente. Até atualmente o link usado para consulta pelo próprio site já não é mais esse!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal

 

Nos últimas semanas os links de consulta da receita tem passado por instabilidades.
Não sei se estão fazendo testes com novas alterações nas consultas, se é problema de rota, ou alguma outra coisa.

De fato a consulta de CPF mesmo quando realizada diretamente no site da receita através do navegador passou a responder "serviço indisponível, tente mais tarde"

 

Nos últimos 5 dias porém ,está bem estável, e retornando os dados de CPF e CNPJ corretamente

Infelizmente este é o preço que se paga ao utilizar serviços públicos "gratuitos".

 

Abraço a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 17/07/2017 at 16:07, Massa191 disse:

Olá Pessoal

 

Nos últimas semanas os links de consulta da receita tem passado por instabilidades.
Não sei se estão fazendo testes com novas alterações nas consultas, se é problema de rota, ou alguma outra coisa.

De fato a consulta de CPF mesmo quando realizada diretamente no site da receita através do navegador passou a responder "serviço indisponível, tente mais tarde"

 

Nos últimos 5 dias porém ,está bem estável, e retornando os dados de CPF e CNPJ corretamente

Infelizmente este é o preço que se paga ao utilizar serviços públicos "gratuitos".

 

Abraço a todos

 

Boa! Mas então, parou de novo hehe! Ontem testei estava tudo ok. Hoje minha aplicação parou e fui verificar o link e realmente está com problemas novamente. Concordo.. Essa situação "gratuíta" não é a melhor solução!

 

Negocio é aguardar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa noite, completo leigo, nem sei o que php LOL.

Instalei o xampp, coloquei os scripts na em /htdocs, consegui executar o "localhost/index.php" e coloquei la o cnpj e a imagem, entretanto o script não deveria salvar os dados da entidade de alguma forma para automatizar a parada?

 

Adiantando que eu já deixei as pastas de cookies e cookies_CNPJ na pasta do htdocs e deixei elas habilidades para escrita também

 

Se me recomendarem uma leitura ou video eu ficarei muito grato tb :)

 

segue imagem:

Capture.PNG

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

 

minha consulta funcionava bem até o final de semana, na segunda-feira parou de funcionar.

A Receita Federal parou de usar captcha tradicional, passaram a usar o recaptcha da Google e isso ferrou a minha consulta.

Alguém está passando por isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 25/10/2017 at 09:29, felipebmfaria disse:

Pessoal,

 

minha consulta funcionava bem até o final de semana, na segunda-feira parou de funcionar.

A Receita Federal parou de usar captcha tradicional, passaram a usar o recaptcha da Google e isso ferrou a minha consulta.

Alguém está passando por isso?

Bom dia!

Uso o código do Massa e meu também parou, só retorna o Array com "Receita não responde", alguém consegue verificar e me ajudar neste erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato a RFB passou a utilizar o reCaptcha da Google em suas consultas. 

Mas pude perceber que eles disponibilizam um captcha sonoro. O que nada mais faz levar-nos ao antigo sistema de autenticação com as captchas antigas. 

Acredito que bastará atualizar os links em nossas aplicações. 

Por exemplo:

Consulta CNPJ com reCaptcha Google:

https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp

Consulta CNPJ com captch da própria RFB:

https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_solicitacao3.asp

 

Ah... os links da RFB estão bem intermitentes esses dias. Poderá que o link com captch antigo diga indisponível. Mas ele está funcional como informei. Só ter paciência para usa-lo. 

 

Vejam que no link é a "Consulta 3". Bastaria mudar o 2 pro 3. 

Ainda não analisei cookies, etc, nem alterei na minha aplicação, pois está no trabalho, mas em breve testarei e poderei colocar mais resultados aqui. 

Grande abraço!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 12/11/2017 at 16:47, Ricardo Gandra disse:

De fato a RFB passou a utilizar o reCaptcha da Google em suas consultas. 

Mas pude perceber que eles disponibilizam um captcha sonoro. O que nada mais faz levar-nos ao antigo sistema de autenticação com as captchas antigas. 

Acredito que bastará atualizar os links em nossas aplicações. 

Por exemplo:

Consulta CNPJ com reCaptcha Google:

https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp

Consulta CNPJ com captch da própria RFB:

https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_solicitacao3.asp

 

Ah... os links da RFB estão bem intermitentes esses dias. Poderá que o link com captch antigo diga indisponível. Mas ele está funcional como informei. Só ter paciência para usa-lo. 

 

Vejam que no link é a "Consulta 3". Bastaria mudar o 2 pro 3. 

Ainda não analisei cookies, etc, nem alterei na minha aplicação, pois está no trabalho, mas em breve testarei e poderei colocar mais resultados aqui. 

Grande abraço!

 

Ricardo bom dia!

 

apenas mudar o direcionamento dos links não resolveu... Você possui essa integração rodando?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 12/11/2017 at 16:47, Ricardo Gandra disse:

De fato a RFB passou a utilizar o reCaptcha da Google em suas consultas. 

Mas pude perceber que eles disponibilizam um captcha sonoro. O que nada mais faz levar-nos ao antigo sistema de autenticação com as captchas antigas. 

Acredito que bastará atualizar os links em nossas aplicações. 

Por exemplo:

Consulta CNPJ com reCaptcha Google:

https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp

Consulta CNPJ com captch da própria RFB:

https://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_solicitacao3.asp

 

Ah... os links da RFB estão bem intermitentes esses dias. Poderá que o link com captch antigo diga indisponível. Mas ele está funcional como informei. Só ter paciência para usa-lo. 

 

Vejam que no link é a "Consulta 3". Bastaria mudar o 2 pro 3. 

Ainda não analisei cookies, etc, nem alterei na minha aplicação, pois está no trabalho, mas em breve testarei e poderei colocar mais resultados aqui. 

Grande abraço!

 

 

Também percebi que possui a opção do captcha sonoro. Mas no caso do CPF, que anteriormente o captcha era gerado a partir de um script isolado (https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATCTA/CPF/ConsultaSituacao/captcha/gerarCaptcha.asp), nesta opção do captcha sonoro ele gera direto um png (base 64). Tentei adaptar o código gerando este png (via CURL), mas após o submit ele gera novamente um erro no recaptcha do Google, indicando que se trata de um domínio não autorizado.

 

Como tentei adaptar o código muito rapidamente, não sei se de repente estou fazendo alguma besteira, mas se conseguir algo estarei postando aqui. No entanto minha dúvida é se não é possível mesmo gerar o recaptcha Google através do CURL? Alguém já pesquisou sobre? O que vi é que é necessário duas chaves: um site-key que está divulgado no próprio código fonte (html) e outro secret-key, o qual esse acredito não ser possível descobrir.

 

Quem tiver alguma novidade, favor compartilhar pessoal.

Abraço!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
}
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 22/02/2018 at 14:37, CriS 4devs disse:

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;
}
?>

 

 

Muito Bem @CriS 4devs

 

Estou implementando esta solução no repositório Oficial em GitHub, afim de promover mais um "suspiro" de vida para estes scripts.

 

Mas saibam que esta solução é temporária, e quando a receita resolver atualizar a consulta por captcha sonoro, eliminando estes links defasados para links atualizados com o reCaptcha do Google, o projeto muito provavelmente morrerá.

 

Tenho estudado formas de espelhar o recaptcha, e acho pouco provável encontrar uma solução definitiva viável em função da validação de domínio realizadas por eles.

 

Abraço a Todos !

Marcos Peli

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal

 

Acabo de atualizar o GitHub Oficial do Projeto.

 

https://github.com/Massa191/Consultas_CNPJ_CPF_Receita_Federal

 

Consultas de CPF e CNPJ funcionando.

 

Os estudos e testes que realizei até o momento a respeito do reCaptcha do Google foram infrutíferos, devido a validação de domínio realizada pelos javascripts do google,

 

Portanto, aproveitem enquanto a Fazenda mantem os links para consulta via captcha sonoro ativos.

 

Abraços a todos
Marcos Peli

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 24/02/2018 at 10:55, Massa191 disse:

 

Muito Bem @CriS 4devs

 

Estou implementando esta solução no repositório Oficial em GitHub, afim de promover mais um "suspiro" de vida para estes scripts.

 

Mas saibam que esta solução é temporária, e quando a receita resolver atualizar a consulta por captcha sonoro, eliminando estes links defasados para links atualizados com o reCaptcha do Google, o projeto muito provavelmente morrerá.

 

Tenho estudado formas de espelhar o recaptcha, e acho pouco provável encontrar uma solução definitiva viável em função da validação de domínio realizadas por eles.

 

Abraço a Todos !

Marcos Peli

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Pessoal, desculpe desenterrar a conversa.

Estou tentando fazer funcionar esta solução do @Massa191, porem acho que o link do recaptcha esta errado, a receita não retorna e depois para de funcionar.

Como vocês pegam o link? Não estou localizando
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Atualizado hoje 26/03/2020
Funcionando as consultas de CPF e CNPJ para captcha Sonoro enquanto a receita as disponibilizar em paralelo ao recaptcha google

 

agradeçam ao COVID19 , que motivou-me a encontrar uma solução para viabilizar a utilização desta ferramenta em vossos e-comerce.

 

Abraço a todos

https://github.com/Massa191/Consultas_CNPJ_CPF_Receita_Federal

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

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