Ir para conteúdo
Vinoli

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

Recommended Posts

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

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 por hargon
Termo removido devido a solicitação do usuário

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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 por Massa191

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Muito bom amigo, vou testar a implementação, sua ajuda foi de granda valia. Obrigado pela contribuição.

Editado por William Bruno
Remover quote desnecessário

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

 

 

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

: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

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

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

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

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

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ço
Marcos Peli

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

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 por William Bruno
Remover quote desnecessário

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.