ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Ajuda com com consulta site da Receita

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Sex Jan 09, 2015 12:23 pm    Assunto: Ajuda com com consulta site da Receita Responder com Citação

Boa tarde Galera.

Estou tendo dificuldades de fazer uma pesquisa do cpf do usuario no site da receita.
Eu consigo acessar o site via componente delphi7, preencher o campo do CPF e ate exibir a imagem do captcha, mas me deparei com as imagens.
A imagem que é exibida no site da receita é diferente da imagem exibida no outro webbrowser. Acho que terei que capturar a imagem da pagina aberta e em determinado tempo pois existe tempo de sessão.

A dificuldade é como posso capturar a imagem e como faço isto e como posso capturar a segunda pagina para exibir no programa delphi.
necessito disto apenas para exibir ao usuario que faz um cadastro se o cpf da pessoa é realmente dela e se esta regular.

link do site:
http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/cpf/ConsultaPublica.asp
http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/cpf/ConsultaPublica.asp

link da imagem do captcha:
http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/cpf/captcha/gerarCaptcha.asp?opt=image
http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/cpf/captcha/gerarCaptcha.asp?opt=image

Grato.
JJMalka.[/b]
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Sex Jan 09, 2015 12:56 pm    Assunto: Responder com Citação

o acbr ja faz isso. da uma olhada no codigo dele
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Dom Jan 11, 2015 10:34 pm    Assunto: Responder com Citação

joemil escreveu:
o acbr ja faz isso. da uma olhada no codigo dele


Pelo que entendi o projeto esta apresentando problemas.

O componente esta dando erro no delphi7.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Sex Jan 16, 2015 11:24 pm    Assunto: achei um codigo que resolve, alguem sabe migrar pra delphi? Responder com Citação

Consultar nome de uma pessoa física usando CPF na Receita Federal com PHP
Publicado em 4 de dezembro de 2014
1
Recentemente me deparei com a seguinte situação. Precisava buscar o nome correto de uma pessoa, e a única maneira confiável de se fazer isso seria através da receita federal. Como a receita não disponibiliza uma maneira pública de realizar esse tipo de consulta através de um web service o que se pode fazer é através de uma página disponibilizada no próprio site da receita
(http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPf/ConsultaPublica.asp).

Analisando o funcionamento desta página, percebi uma maneira de fazer uma consulta a receita passando alguns parâmetros a este formulário que é usado nessa página. O grande problema da automatização completa desta consulta é que o formulário tem um captcha (aquelas imagens que são geradas aleatoriamente para evitar justamente esse uso automatizado por outros sites).

Uma das maneiras possíveis de se resolver esse problema seria capturar a imagem gerada pelo site da receita federal e exibi-la dentro do meu site e fazer com que o usuário digitasse o texto contido nessa imagem. Até ai nenhuma novidade, mas como efetivamente fazer isso?

Vou descrever uma solução que encontrei:

Primeiramente faz-se uma requisição para a URL que se gera a imagem do captcha, obtendo a imagem propriamente dita e ID de sessão gerado pelo site da receita. Esse ID de sessão é a chave para conseguir validar o captcha, caso contrário, o mesmo não será validadado. Segue o código para obtenção da imagem.

function getCaptcha()
{
try {
$httpRequest = new \HttpRequest("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/captcha/gerarCaptcha.asp");
$httpRequest->setHeaders(array(
"Accept" => "image/png,image/*;q=0.8,*/*;q=0.5",
"Host" => "www.receita.fazenda.gov.br"
));
$resp = $httpRequest->send();
$body = $resp->getBody();
$cookie = explode(";", $resp->getHeader("Set-Cookie"));
$resposta = [
'img' => base64_encode($body),
'id' => $cookie[0]
];
} catch (\Exception $e) {

}
return $resposta;
}

Para exibir a imagem do captcha no site basta pegar a imagem codificada em base64 e adiciona-la a uma tag <img> com o resultado da chamada da função anterior:

$res = getCaptcha();
$img_captcha = $res['img'];
$img = '<img>';


O ID de sessão retornado será usado na requisição seguinte para efetivamente ter acesso aos dados da pessoa no site da receita. A seguir o código que faz a requisição a URL da receita e obtém os dados.

function getInformacoesPessoaRF($id_sessao, $texto_do_captcha) {
try {
$httpRequest = new \HttpRequest("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp", HTTP_METH_POST);
$httpRequest->setHeaders(array(
"Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host" => "www.receita.fazenda.gov.br"
));
list($sessionName, $sessionId) = explode("=", $id_sessao);
$httpRequest->setCookies([
$sessionName => $sessionId
]);
$httpRequest->setPostFields([
"Enviar" => "Consultar",
"txtCPF" => $_POST['cpf'],
"txtTexto_captcha_serpro_gov_br" => $texto_do_captcha
]);
$resp = $httpRequest->send();
$body = $resp->getBody();

$dom = new \DOMDocument();
@$dom->loadHTML($body);

$xpath = new \DOMXPath($dom);
$q = $xpath->query('//span[@class="clConteudoDados"]');
$cpf = explode(":", $q->item(0)->nodeValue);
$nome = explode(":", $q->item(1)->nodeValue);
$status = explode(":", $q->item(2)->nodeValue);
return [
$cpf, $nome, $status
];
} catch (\Exception $e) {

}
return $resposta;
}



De posse do ID de sessão, basta passa-lo a função getInformacoesPessoaRF, juntamente com o texto digitado do captcha, como segue:

$id_sessao = $res['id'];
$informacoes = getInformacoesPessoaRF($id_sessao, $_POST['texto_captcha']);



E ai está, as informações que tanto queríamos. Vale ressaltar que as requisições HTTP realizadas são feitas usando a biblioteca HttpRequest, que não vem instalada por padrão no PHP. Com pouca adaptação é possível fazer o mesmo procedimento usando cURL que é padrão na grande maioria das instalações do PHP. Espero ajudar e qualquer observação é só comentar.

site de Leonardo Sales;
www.leonardosales.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Massa191
Novato
Novato


Registrado: Sábado, 7 de Fevereiro de 2015
Mensagens: 1

MensagemEnviada: Sáb Fev 07, 2015 6:54 pm    Assunto: Re: achei um codigo que resolve, alguem sabe migrar pra delphi? Responder com Citação

jjmalka escreveu:
Consultar nome de uma pessoa física usando CPF na Receita Federal com PHP
Publicado em 4 de dezembro de 2014
1
Recentemente me deparei com a seguinte situação. Precisava buscar o nome correto de uma pessoa, e a única maneira confiável de se fazer isso seria através da receita federal. Como a receita não disponibiliza uma maneira pública de realizar esse tipo de consulta através de um web service o que se pode fazer é através de uma página disponibilizada no próprio site da receita
(http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPf/ConsultaPublica.asp).

Analisando o funcionamento desta página, percebi uma maneira de fazer uma consulta a receita passando alguns parâmetros a este formulário que é usado nessa página. O grande problema da automatização completa desta consulta é que o formulário tem um captcha (aquelas imagens que são geradas aleatoriamente para evitar justamente esse uso automatizado por outros sites).

Uma das maneiras possíveis de se resolver esse problema seria capturar a imagem gerada pelo site da receita federal e exibi-la dentro do meu site e fazer com que o usuário digitasse o texto contido nessa imagem. Até ai nenhuma novidade, mas como efetivamente fazer isso?

Vou descrever uma solução que encontrei:

Primeiramente faz-se uma requisição para a URL que se gera a imagem do captcha, obtendo a imagem propriamente dita e ID de sessão gerado pelo site da receita. Esse ID de sessão é a chave para conseguir validar o captcha, caso contrário, o mesmo não será validadado. Segue o código para obtenção da imagem.

function getCaptcha()
{
try {
$httpRequest = new \HttpRequest("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/captcha/gerarCaptcha.asp");
$httpRequest->setHeaders(array(
"Accept" => "image/png,image/*;q=0.8,*/*;q=0.5",
"Host" => "www.receita.fazenda.gov.br"
));
$resp = $httpRequest->send();
$body = $resp->getBody();
$cookie = explode(";", $resp->getHeader("Set-Cookie"));
$resposta = [
'img' => base64_encode($body),
'id' => $cookie[0]
];
} catch (\Exception $e) {

}
return $resposta;
}

Para exibir a imagem do captcha no site basta pegar a imagem codificada em base64 e adiciona-la a uma tag <img> com o resultado da chamada da função anterior:

$res = getCaptcha();
$img_captcha = $res['img'];
$img = '<img>';


O ID de sessão retornado será usado na requisição seguinte para efetivamente ter acesso aos dados da pessoa no site da receita. A seguir o código que faz a requisição a URL da receita e obtém os dados.

function getInformacoesPessoaRF($id_sessao, $texto_do_captcha) {
try {
$httpRequest = new \HttpRequest("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp", HTTP_METH_POST);
$httpRequest->setHeaders(array(
"Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host" => "www.receita.fazenda.gov.br"
));
list($sessionName, $sessionId) = explode("=", $id_sessao);
$httpRequest->setCookies([
$sessionName => $sessionId
]);
$httpRequest->setPostFields([
"Enviar" => "Consultar",
"txtCPF" => $_POST['cpf'],
"txtTexto_captcha_serpro_gov_br" => $texto_do_captcha
]);
$resp = $httpRequest->send();
$body = $resp->getBody();

$dom = new \DOMDocument();
@$dom->loadHTML($body);

$xpath = new \DOMXPath($dom);
$q = $xpath->query('//span[@class="clConteudoDados"]');
$cpf = explode(":", $q->item(0)->nodeValue);
$nome = explode(":", $q->item(1)->nodeValue);
$status = explode(":", $q->item(2)->nodeValue);
return [
$cpf, $nome, $status
];
} catch (\Exception $e) {

}
return $resposta;
}



De posse do ID de sessão, basta passa-lo a função getInformacoesPessoaRF, juntamente com o texto digitado do captcha, como segue:

$id_sessao = $res['id'];
$informacoes = getInformacoesPessoaRF($id_sessao, $_POST['texto_captcha']);



E ai está, as informações que tanto queríamos. Vale ressaltar que as requisições HTTP realizadas são feitas usando a biblioteca HttpRequest, que não vem instalada por padrão no PHP. Com pouca adaptação é possível fazer o mesmo procedimento usando cURL que é padrão na grande maioria das instalações do PHP. Espero ajudar e qualquer observação é só comentar.

site de Leonardo Sales;
www.leonardosales.com.br


Obrigado Jjmalka (Leandro Soares) por compartilhar sua solução

Adaptei sua solução a Um script que utiliza a Bibl. Curl , com a diferença que leio os dados gravados no cookie gerado na primeira chamada , ao invéz de pegalos no cabeçario headers.

Funciona muito bem.

Abraços.
Marcos Peli
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB