Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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>Também estou tentando corrigir isso ja faz 20 dias...rsss qualquer novidade eu posto aqui ok!
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.
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:
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
Muito bom amigo, vou testar a implementação, sua ajuda foi de granda valia. Obrigado pela contribuição.
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...
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
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);$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);
}
?>>
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
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);$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.
:yes: :yes: :yes: :yes: :yes: :coolio:
: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.
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
>
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!
Eu estava desde quarta feira passada fundindo a cabeça nos javascripts da receita , kkkkk.
Foi ontem , quando vi o post no forum activedelphi que a coisa desenrolou.
Daí foi só dar aquela adaptada , rs
Estamos ai
Abraços
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
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:
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
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
< 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
Cookie: ASPSESSIONIDCARTQRDC=GECCAGJCMNADNDEEDLJMOFAK; flag=1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Connection: keep-alive
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Content-Length: 111
Content-Type: application/x-www-form-urlencoded
< HTTP/1.1 302 Object moved
< Date: Thu, 19 Feb 2015 03:50:12 GMT
< Server: Microsoft-IIS/6.0
< X-Powered-By: ASP.NET
< Location: Cnpjreva_Solicitacao2.asp?cnpj=11111111111111
< Content-Length: 166
< Content-Type: text/html
< Cache-control: private
<
* Ignoring the response-body
* Connection #0 to host www.receita.fazenda.gov.br left intact
* Issue another request to this URL: 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp?cnpj=11111111111111'
* Violate RFC 2616/10.3.3 and switch from POST to GET
* Re-using existing connection! (#0) with host www.receita.fazenda.gov.br
* Connected to www.receita.fazenda.gov.br (161.148.231.100) port 80 (#0)
GET /pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp?cnpj=11111111111111 HTTP/1.1
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
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);$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_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) $campos = parseHtmlCNPJ($getHtmlCNPJ);
print_r($campos);
}
?>
Abraço
Marcos Peli
Olá Marcos!
Puxa, muito obrigado pela ajuda!
Vou implementar a imagem diretamente, como você sugeriu!
Grande abraço
Fabricio
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.
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.
Amigo
A Receita , pra variar.... , alterou ontem o javascript , que agora altera o cookie antes do envio do form , adicionando o parâmetro flag=1 no cookie para depois fazer a validação por session.
Passei o dia todo tentando encontrar uma solução.
Encontre agora a noite
Amanhã posto a solução
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/VIq0cxO.jpg&key=a3c052e4f67d5819c7a6930caf2a11970ea2485ac581bc81cce2eb71d7cc63f5" alt="VIq0cxO.jpg" />
Solução:
Altere o script :
funcoes.php
por este logo abaixo
<?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]);
// 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, '&');
$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;
}
?>
NÃO ESQUECA DE CRIAR A PASTA:
cookies_cnpj
no mesmo diretório onde vão estar os 4 Scripts.
Cara tentei implementar, mas continua a dizer que o capcha esta errado tem como você colocar seus fontes aqui?
Obrigado.
Lá vai então novamente !!!!!!!!!!!!!!!!!!!!!!!
São 4 SCRIPTS
LEMBRE-SE de criar a pasta cookies_cnpj no mesmo diretório onde vc. subir os 4 scripts
1 - 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>
2 - 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]);
// 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, '&');
$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;
}
?>
3 - 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);$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
// 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_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
?>
4 - processa.php
<?php
require('funcoes.php');
$cnpj = $_POST['CNPJ'];
$captcha = $_POST['CAPTCHA'];
// pega html resposta da receita
$getHtmlCNPJ = getHtmlCNPJ($cnpj, $captcha);
if($getHtmlCNPJ) $campos = parseHtmlCNPJ($getHtmlCNPJ);
print_r($campos);
}
?>
Caso vc. continue com o mesmo problema ,
1 - verifique se a Bibl CURL está ativa em seu phpinfo()
2 - Echoe o resultado HTML (Variavel $getHtmlCNPJ do script processa.php) para ver a resposta da receita ao invés do array
3 - abra o cookie gerado antes e apos a consulta se foi acrescentada a linha com o parâmetro flag=1
Abraço
Marcos Peli
www.receita.fazenda.gov.br FALSE / FALSE 0 ASPSESSIONIDSSDARBDB JNNEEJNCOFPLKICCAOCOKJHB
curl
cURL support enabled
cURL Information 7.21.0
Age 3
Features
AsynchDNS No
Debug No
GSS-Negotiate Yes
IDN Yes
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols dict, file, ftp, ftps, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host x86_64-pc-linux-gnu
SSL Version OpenSSL/0.9.8o
ZLib Version 1.2.3.4
libSSH Version libssh2/1.2.6
com o echo no $getHtmlCNPJ tras a tela de erro da receita.
e o cookie antes e depois continua do mesmo jeito como pode ver acima
Ainda continua dando a mensagem de "Imagem digitada incorretamente"
Amigo
Seu problema são as diretivas http://php.net/manual/pt_BR/filesystem.configuration.php#ini.allow-url-fopen , daí fopen não abrir com os parâmetros atuais.
ou vc. muda as diretivas allow_url_fopen em seu php , ou vc. faz a seguinte alteração no Script funcoes.php
exclua esta linha no inicio do script:
define('HTTPCOOKIELOCAL', 'http://'.$_SERVER['SERVER_NAME'].str_replace(pathinfo($_SERVER['SCRIPT_FILENAME'],PATHINFO_BASENAME),'',$_SERVER['SCRIPT_NAME']).$pasta_cookies);
inclua esta no lugar:
define('HTTPCOOKIELOCAL',$pasta_cookies);
E seus problemas deverão terminar , rs
Abraço
Marcos Peli
Em tempo ,... Esta alteração tb. deve ser feita nas primeiras linhas do script getcaptcha.php
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:
class cpf_receita
{
/*
*/
$post = array
(
'txtCPF' => $cpf,
'txtTexto_captcha_serpro_gov_br' => $captha,
'captchaAudio' => '',
'Enviar' => 'Consultar',