Ir para conteúdo
Entre para seguir isso  
Stopassolli

Logar no site receita PHP + cURL

Recommended Posts

Olá a todos.

Preciso importar dados da NFe/CTe com a chave + captcha.

A idéia é igual a sites como www.danfeonline.com.br que ao informar a chave + captcha, faz login e pega-se o HTML, filtrando as informações necessárias.

Segue abaixo alguns códigos que estou tentando fazer este processo, sem sucesso até o momento - estou parado no problema de "sessão expirou".

A idéia geral do código abaixo foi extraída da função para importar dados do CNPJ posta aqui no iMaster.

 

getcaptcha.php

$pasta_cookies = 'cookies/';
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();
$url = 'http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8%3d';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
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
$html = curl_exec($ch);
curl_close($ch);
// se tiver imagem , mostra
if(!empty($html)){
	$id_preciso_input = array(
		"__EVENTTARGET",
		"__EVENTARGUMENT",
		'__VIEWSTATE',
		'__VIEWSTATEGENERATOR',
		'__EVENTVALIDATION',
		'ctl00_ContentPlaceHolder1_token',
		'ctl00_ContentPlaceHolder1_captchaSom'
	);
	$id_preciso_img = "ctl00_ContentPlaceHolder1_imgCaptcha";
	$dom = new DOMDocument;
	@$dom->loadHTML($html);
	//PEGANDO VALORES DE INPUT
	foreach($dom->getElementsByTagName('input') as $link) {
		$id_input = $link->getAttribute('id');
		if(in_array($id_input,$id_preciso_input)){
			for($i=0;$i<count($id_preciso_input);$i++){
				if($id_input==$id_preciso_input[$i]){
					if($id_preciso_input[$i]=="ctl00_ContentPlaceHolder1_captchaSom"){$name_input = "captchaSom";}
					elseif($id_preciso_input[$i]=="ctl00_ContentPlaceHolder1_token"){$name_input = "token";}
					else{$name_input=$link->getAttribute('name');}
					$valor_input[$name_input] = $link->getAttribute('value');
				}
			}
		}
	}
	if(!empty($valor_input)){$_SESSION["valor_input"] = $valor_input;}
	//PEGANDO A IMAGEM
	foreach($dom->getElementsByTagName('img') as $link) {
		$id_imagem = $link->getAttribute('id');
		if($id_imagem==$id_preciso_img){
			$valor = $link->getAttribute('src');
			$texto = explode(",",$valor);
			$data = base64_decode($texto[1]);
			$img = imagecreatefromstring($data);
			header('Content-type: image/jpg');
			imagejpeg($img);
		}
	}
}
processa.php
<?php
require('funcoes2.php');
$chave_acesso = $_POST['txtChaveAcessoCompleta'];
$captcha = $_POST['txtCaptcha'];
$dados_form = array(	"__EVENTTARGET" => $_POST["__EVENTTARGET"],
						"__EVENTARGUMENT" => $_POST["__EVENTARGUMENT"],
						'__VIEWSTATE' => $_POST["__VIEWSTATE"],
						'__VIEWSTATEGENERATOR' => $_POST["__VIEWSTATEGENERATOR"],
						'__EVENTVALIDATION' => $_POST["__EVENTVALIDATION"],
						'ctl00$ContentPlaceHolder1$token' => $_POST["token"],
						'ctl00$ContentPlaceHolder1$captchaSom' => $_POST["captchaSom"],
						'hiddenInputToUpdateATBuffer_CommonToolkitScripts' => $_POST["hiddenInputToUpdateATBuffer_CommonToolkitScripts"]
);
// pega html resposta da receita
$getHtmlCNPJ = getHtmlCNPJ($chave_acesso, $captcha, $dados_form);
print_r($getHtmlCNPJ);
?>
funcoes2.php
<?php
// define caminho absoluto e relativo para arquivo cookie
$pasta_cookies = 'cookies/';
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($chave_acesso, $captcha, $dados_form){
	$campos_post = $dados_form;
	$conteudo = "";
    $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]);
		$cookie = $sessionName.'='.$sessionId;
	}
	header("Set-Cookie: $sessionName=$sessionId; path=/; www.receita.fazenda.gov.br; httpOnly" );
	if(!empty($_SESSION["valor_input"])){$valor_input = $_SESSION["valor_input"];}
	$campos_post = http_build_query($campos_post, NULL, '&');
    $ch = curl_init('http://www.nfe.fazenda.gov.br/portal/consultaCompleta.aspx?tipoConteudo=XbSeqxE8pl8=');
    curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_POST,count($campos_post));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $campos_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
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
    curl_setopt($ch, CURLOPT_REFERER, "www.nfe.fazenda.gov.br");
    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 - aqui dentro colocar id dos campos para pegar os dados
	$campos = array();
	// 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>')));
	echo $html;
	$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;
}
?>
index.php
<html>
    <head>
            <title>Pegar dados NFe na receita</title>
    </head>
    <body>
    <form method="post" action="processa.php">
            <p><span class="titleCats">Chave de acesso</span>
              <br />
              <input type="text" name="txtChaveAcessoCompleta" maxlength="44" required /> 
              <b style="color: red">Chave</b>
              <br />
              <img src="getcaptcha.php" border="0">
              <br />
              <input type="text" name="txtCaptcha" maxlength="6" required />
              <b style="color: red">Código da imagem</b>
              <br />
            </p>
            <p>
            <?php
			session_start();
			//echo "<pre>";print_r($_SESSION["valor_input"]);echo "</pre>";die();
			?>
              <input name="ctl00$ContentPlaceHolder1$btnConsultar" type="submit" value="Continuar" />
              <input name="__EVENTTARGET" type="hidden" value="<?php echo $_SESSION["valor_input"]["__EVENTTARGET"]; ?>"/>
              <input name="__EVENTARGUMENT" type="hidden" value="<?php echo $_SESSION["valor_input"]["__EVENTARGUMENT"]; ?>"/>
              <input name="__VIEWSTATE" type="hidden" value="<?php echo $_SESSION["valor_input"]["__VIEWSTATE"]; ?>"/>
              <input name="__VIEWSTATEGENERATOR" type="hidden" value="<?php echo $_SESSION["valor_input"]["__VIEWSTATEGENERATOR"]; ?>"/>
              <input name="__EVENTVALIDATION" type="hidden" value="<?php echo $_SESSION["valor_input"]["__EVENTVALIDATION"]; ?>"/>
              <input name="token" type="hidden" value="<?php echo $_SESSION["valor_input"]["token"]; ?>"/>
              <input name="captchaSom" type="hidden" value="<?php echo $_SESSION["valor_input"]["captchaSom"]; ?>"/>
              <input name="hiddenInputToUpdateATBuffer_CommonToolkitScripts" type="hidden" value=""/>
            </p>
    </form>
    </body>
</html>

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
Entre para seguir isso  

  • Conteúdo Similar

    • Por MAKAVELIQUE
      Pessoal, imaginem a seguinte situação: o usuário A clica no botão enviar no mesmo instante que o usuário B, caso a ação do sql seja um comando update no mesmo campo, id=7 por exemplo e isso acontecer exatamente no mesmo instante, ocorre perca de dados? 
      <?php $update = "UPDATE br_gang SET i='$i', data= NOW() WHERE id='$id'"; $query = mysqli_query($update, $conn) or die (mysqli_error($conn)); if($update==true){ echo "<script>alert ('DADOS SALVOS COM SUCESSO, BOA SORTE!');</script>"; } ?> Se isso acontecer e ocorrer perca de dados, qual o procedimento possível para resolver o problema?
    • Por Bobrinha
      Olá a todos.
       
      Tenho uma dúvida e não sei se é possível caso tenha alguma sugestão por favor avise.
       
      Adicionar resultado de um innerhtml dentro de um link atributo href é possível? ou seja eu tenho um input onde seleciono um ano 
       
      <select id="ano"> <option selected>2019</option> <option value="2018">2018</option> <option value="2017">2017</option> </select> <div id="anoAtual"></div> No query pego o valor ou seja o ano selecionado e jogo no html
       
      $("select").change(function () { document.getElementById("ano").innerHTML = document.getElementById("anoAtual").value; });  
      Agora vem a dúvida como eu jogo na URL? existe uma outra forma? é possível?
       
      <a href='resultado.php&ano=COMO JOGAR O ANO AQUI?'>  
       
    • Por MoiDVAec
      Boa tarde,
       
      Agradeço desde já a ajuda! Estou precisando conecta ao banco de dados e minha classe da o seguinte erro:
       
       Já fiz varias pesquisas ja fiz varias correções mas o erro persisti. Alguem pode me ajuda a entender onde errei?
       
      Segue o código:
       
      <?php abstract class banco{ //PROPRIEDADES public $servidor = "localhost:84"; public $usuario = "root"; public $senha = ""; public $nomeBanco = "ourlady"; public $conexao = NULL; public $dataset = NULL;//resultados das pesquisas public $linhasAfetadas = -1; //METODOS public function __construct(){ $this->connecta(); }//fim construtor public function __destruct(){ if($this->conexao != NULL): mysqli_close($this->conexao); endif; }//fim destrutor public function connecta(){ $con = $this->conexao = mysqli_connect($this->servidor,$this->usuario, $this->senha) or die($this->tratarErro(__FILE__,__FUNCTION__,mysqli_errno(),errorInfo(),True)); mysqli_select_db($con,$this->nomeBanco) or die($this->tratarErro(__FILE__,__FUNCTION__,mysqli_errno(),errorInfo(),True)); mysqli_set_charset($con,'utf8'); }// fim connecta public function inserirDados($objeto){ $conec = $this->connecta(); $erro = $this->tratarErro(__FILE__,__FUNCTION__); $sqlInserir = "INSERT INTO ".$objeto->tabela." ("; //loop inseri valores dentro do comando sql para ser inserido no banoc de dados for($i=0; $i<count($objeto->valores); $i++): $sqlInserir .= key($objeto->valores); //validação para inserir a virgula no meio do loop if($i < (count($objeto->valores)-1)): $sqlInserir .= ", "; else: $sqlInserir .= ") "; endif; next($objeto->valores); endfor; reset($objeto->valores); $sqlInserir .= "VALUES ("; for($i=0; $i<count($objeto->valores); $i++): // validação tenaria para puxar o segundo valor da array $sqlInserir .= is_numeric($objeto->valores[key($objeto->valores)]) ? $objeto->valores[key($objeto->valores)] : "'".$objeto->valores[key($objeto->valores)]."'"; //validação para inserir a virgula no meio do loop if($i < (count($objeto->valores)-1)): $sqlInserir .= ", "; else: $sqlInserir .= ");"; endif; next($objeto->valores); endfor; echo $sqlInserir; $query = mysqli_query($conec, $sqlInserir); return $query or $erro; }// fim inserir daddos public function tratarErro($arquivo=NULL, $rotina=NULL, $numErro=NULL, $msgErro=NULL, $geraExcept=FALSE){ if($arquivo==NULL) $arquivo="não informado"; if($rotina==NULL) $rotina="não informado"; if($numErro==NULL) $numErro=mysqli_connect_errno($this->conexao); if($msgErro==NULL) $msgErro=mysqli_connect_error($this->conexao); $resultado = 'Ocorreu o seguinte erro:<br/> <b>Arquivo</b>'.$arquivo.'<br/> <b>Rotina</b>'.$rotina.'<br/> <b>Erro</b>'.$numErro.'<br/> <b>Mensagem</b>'.$msgErro; if($geraExcept==False): echo($resultado); else : die($resultado); endif; }// fim tratarerro }// fim da claas banco ?>  
       
    • Por LuanMartinsTI
      Eu tenho o seguinte codigo para capturar minha camera e meu audio, toda vez que eu entro na pagina x ela executa o js e pede acesso a camera de quem acessa a pagina, porem eu vou bloquear essa pagina para que apenas eu ou pessoa autorizadas possam acessar, queria saber o seguinte, eu sei capturar o video e audio, mas como eu vou mostrar pro usuario o meu video e o meu audio??
      <script> video = document.createElement('video'); video.width = 320; video.height = 240; video.autoplay = true; var hasUserMedia = navigator.webkitGetUserMedia ? true : false; navigator.webkitGetUserMedia('video', function(stream){ video.src = webkitURL.createObjectURL(stream); }, function(error){ console.log("Navegador nao suporta", error); }); </script>  
    • Por allancisneiro
      pessoal boa tarde, estou construindo um arquivo HTML, porém estou com um problema de alinhamento do texto apartir do segundo<H1>.  já tentei  usar o comando align:"left". mas não funcionu.
      quem puder ajudar agradeço. a ideia é alinhar tudo à esquerda
       
      este arquivo contém este código-fonte:
       
      <!DOCTYPE html>
      <html>
      <head>
      <title>Título da página</title>
      <meta charset="utf-8"/>
      </head>
      <body>
      <h1>Lista não ordenada</h1>
      <ul>
      <li>LIVERPOOL</li>
      <li>CHELSEA</li>
      <li>MANCHESTER CITY</li>
      <li>MANCHESTER UNITED</li>
      <li>ARSENAL</li>
      <li>TOTTENHAM</li>

      <h1 align="left">Lista ordenada</h1>
      <OL>
      <li>LIVERPOOL</li>
      <li>CHELSEA</li>
      <li>MANCHESTER CITY</li>
      <li>MANCHESTER UNITED</li>
      <li>ARSENAL</li>
      <li>TOTTENHAM</li>

      </OL>
          
      </body>
      </html>

×

Informação importante

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