Automatizar consulta de CNPJ

hmmm
vou testar aqui, qualquer coisa eu respondo

muito obrigado.

Cara, deu certo

Muito obrigado! xD

Estou debugando o código do perotto…
Comigo funciona corretamente até a parte do Captcha.
Não entendi pq na variavel catcha não está passando nenhuma informação.
Apresenta - Contribuinte, Acesso no permitido.
Aconteceu alguma alteração no captcha da RF?!

Olá MeninodaVila!

Eu estou com o mesmo problema, porém usando outro código em Ruby. Exatamente o mesmo sintoma que o seu. Capturo o captcha, mas não consigo evoluir.

Eu encontrei isso aqui lá na RFB:

http://idg.receita.fazenda.gov.br/noticias/ascom/2015/janeiro/receita-libera-consulta-ao-novo-comprovante-de-inscricao-do-cnpj

Eu não consigo também encontrar o que mudou na dinâmica do site. Na teoria só adicionaram novos campos, mas não prática parece que não foi o que aconteceu.

Estou tentando coisas por aqui desde sexta-feira, mas até agora nada. Vou continuar tentando, mas torço que alguém consiga encontrar primeiro que eu.

Boa noite,

Devido a mudança no site da Receita, o meu código parou de funcionar e já “quebrei a cabeça” bastante em tentar achar a solução.
Alguém conseguiu?

Alguém já conseguiu algo?

Boa tarde pessoal.
Apesar de não desenvolver em java, eu estou com o mesmo problema, porém pelas perguntas eu percebi que eu estou com umas ideias diferentes e eu acredito que possamos nos ajudar.
O que eu percebi que foi alterado é o seguinte, anteriormente havia no link da pesquisa da imagem um identificador único que retornava a imagem exibida no site, então no momento do post era necessário passar todas informações como cnpj, viewstate, origem, captcha, etc como parâmetros e junto passar o cookie inicial que era recebido na primeira requisição do site de consulta da receita federal, após as alterações o que mudou é que agora não há mais identificador na linha do link da imagem, e nem o campo viewstate no documento, tudo é por cookie, inclusive a busca da imagem.
Eu ainda não consegui fazer funcionar, mas eu vou fazer mais alguns testes amanhã e sexta e vou acompanhar o tópico aqui, se eu evoluir eu vou postar o que eu consegui.

Percebi que ao enviar o cnpj e o captcha ele faz uma especie de "redirecionamento " e nesse redirecionamento, faz uma validação também.

Sim, ele faz pelo menos 2 direcionamentos que devem ser feitos mantendo o mesmo cookie original.

Está bem complicado, pelo que vi em um forum de PHP o pessoal teve o mesmo problema… resolveram passando o mesmo session id para todas as requisições.
Fiz algumas alterações e mesmo assim não consegui resolver o problema.

Abri um tópico no GUJ, se quiserem acompanhar…

http://www.guj.com.br/36433-erro-ao-obter-captcha-ao-consultar-cnpj-no-site-da-receita

Bom, eu consegui fazer funcionar novamente no meu sistema.
A busca da imagem também deve ter o cookie original para que a imagem seja válida de acordo com a requisição, do contrário não funciona.

Tem como postar como fez?

Eu vou descrever como eu fiz, pois eu não desenvolvi a solução em java, atualmente eu trabalho com progress 4GL, então as coisas funcionam bem diferente, inclusive eu precisei fazer todas as requisições do site via sockets, definindo até os cabeçalhos http.
Basicamente eu faço o seguinte:
1 - Requisição no site da receita federal para buscar os parâmetros de inicialização, hoje só considero o cookie pois não existe mais o viewstate.
2 - Requisição da imagem, a imagem pra mim é um problema pois eu não consigo descarregar ela via 4gl, então eu utilizo um programa auxiliar para isso (wget), esse programa suporta que eu diga pra ele qual é o cookie que ele tem que passar por parâmetro na requisição da imagem, então eu passo o mesmo cookie retornado no primeiro passo.
3 - No post de consulta do cnpj eu estou passando o mesmo cookie que foi recebido no passo 1 e que eu também passei na imagem, e como parâmetros eu passo a seguinte lista:
‘origem=comprovante&cnpj=’ + {&cnpj} + ‘&txtTexto_captcha_serpro_gov_br=’ + {&textoCaptcha} + ‘&submit1=Consultar&search_type=cnpj’
4 - Para cada requisição que eu faço no site da receita federal, eu vejo se o retorno contém redirecionamento, então conforme o o local indicado eu faço uma nova requisição contendo o mesmo cookie inicial e os parâmetros indicados pelo retorno.

Não sei se vai ajudar muito.

Observe que no código abaixo eu passo o mesmo cookie para ambas requisições, debuguei agora e ao retornar a primeira conexão os cookies são armazenados no meu objeto e passo o mesmo para a segunda requisição e mesmo assim não consigo obter mais a imagem.

[code]
public ReceitaFederalConsultaService() {
// Criando o cliente
cliente = new DefaultHttpClient();
// Adicionando um sistema de redireção
cliente.setRedirectStrategy(new LaxRedirectStrategy());
// Mantendo a conexão sempre ativa
cliente.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy());
// Criando o container de cookies
cookie = new BasicCookieStore();
// Criando o contexto de conexão
contexto = new BasicHttpContext();
// Adicionando o coockie store no contexto de conexão
contexto.setAttribute(ClientContext.COOKIE_STORE, cookie);
}

@Override
public ReceitaFederalConsulta getFormInfo() {
    ReceitaFederalConsulta receitaFederalConsulta = new ReceitaFederalConsulta();
    try {
        // Criando o método de acesso  
        HttpGet requisicao1 = new HttpGet("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp");
        requisicao1.setHeader("Cookie", "flag=0");
        // Resposta  
        resposta = cliente.execute(requisicao1, contexto);  
        // Buscando a entidade  
        HttpEntity entidade = resposta.getEntity();  
        // Transformando o conteúdo em uma string  
        String html = EntityUtils.toString(entidade);  
        // Busco o documento estruturado  
        HTMLDocument document = getHTMLDocument(html);  
        // Busco todos os elementos em forma de iterador  
        ElementIterator elementIterator = new ElementIterator(document);  
        // Crio o elemento que vai recepcionar  
        Element element;  
        //Crio o viewstate para receber um valor para o método post futuro  
        String viewstate = "";  
        // Crio o imgcaptcha para receber um valor do link do captcha  
        String imgcaptcha = "";  
        // Enquanto existir próximo elemento  
        while ((element = elementIterator.next()) != null) {  
             // Se for um input  
             if (element.getName().equals(HTML.Tag.INPUT.toString()) && ((String) element.getAttributes().getAttribute(HTML.Attribute.NAME)).equalsIgnoreCase("viewstate")) {  
                 // Passo para a variável o valor do viewstate  
                 viewstate = (String) element.getAttributes().getAttribute(HTML.Attribute.VALUE);  
             }  
             // Se for um img  
             if (element.getName().equals(HTML.Tag.IMG.toString()) && ((String) element.getAttributes().getAttribute(HTML.Attribute.ID)).equalsIgnoreCase("imgcaptcha")) {  
                 // Passo para a variável o valor do imgcaptcha  
                 imgcaptcha = "http://www.receita.fazenda.gov.br" + ((String) element.getAttributes().getAttribute(HTML.Attribute.SRC)).replaceAll("amp", "");
             }  
        }  
        // Crio a segunda requisição  
        HttpGet requisicao2 = new HttpGet(imgcaptcha);
        // resposta
        resposta = cliente.execute(requisicao2, contexto);  
        // Buscando a entidade  
        entidade = resposta.getEntity(); 
        // obtendo os bytes da imagem
        byte[] captcha = EntityUtils.toByteArray(entidade);  
        // atribui o valor do viewstate ao objeto a ser retornado
        receitaFederalConsulta.setViewstate(viewstate);
        // converte a imagem para um objeto streamedContent
        StreamedContent imagemCaptcha = new DefaultStreamedContent(new ByteArrayInputStream(captcha),  "image/jpeg");  
        // atribui o valor da imagem ao objeto que sera reotnrado
        receitaFederalConsulta.setImagemCaptcha(imagemCaptcha);
        receitaFederalConsulta.setCaptcha(null);
    } catch (Exception e) {
        logger.error(e);
    }
    return receitaFederalConsulta;
}[/code]

[quote=grinche]Observe que no código abaixo eu passo o mesmo cookie para ambas requisições, debuguei agora e ao retornar a primeira conexão os cookies são armazenados no meu objeto e passo o mesmo para a segunda requisição e mesmo assim não consigo obter mais a imagem.
[/quote]

Tenta fazer o seguinte substitua a leitura dos atributos do elemento da imagem para o caminho fixo, apenas para teste:

http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp

Mesmo que você não passe um cookie na requisição da imagem ele irá retornar uma imagem.

Claro que se requisitar a resposta de um captcha com um determinado cookie e uma imagem de outro, haverá um retorno de erro, mas tudo bem, é apenas para identificar onde está o problema, se é na identificação do link da imagem ou em outro local.

Mesmo fazendo uma requisição para essa url e tentando gravar o retorno em disco nada é gravado.

            HttpGet requisicao2 = new HttpGet("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp");
            // resposta
            resposta = cliente.execute(requisicao2, contexto);  
            // Buscando a entidade  
            entidade = resposta.getEntity(); 
            // obtendo os bytes da imagem
            byte[] captcha = EntityUtils.toByteArray(entidade);


            java.io.File file = new java.io.File("/home/gaspar/anexos/teste/imagem.jpg");
            FileOutputStream in = new FileOutputStream(file) ;
            in.write(captcha);
            in.close();

rsrs ta funcionando… anteriormente um JPG era retornado e agora é um PNG
verifiquei que o arquivo foi criado mas não conseguia abrir, o mesmo estava com 8kb ai renomeei o mesmo pra png e funcionou…

[quote=grinche]Mesmo fazendo uma requisição para essa url e tentando gravar o retorno em disco nada é gravado.

[code]
HttpGet requisicao2 = new HttpGet(“http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp”);
// resposta
resposta = cliente.execute(requisicao2, contexto);
// Buscando a entidade
entidade = resposta.getEntity();
// obtendo os bytes da imagem
byte[] captcha = EntityUtils.toByteArray(entidade);

        java.io.File file = new java.io.File("/home/gaspar/anexos/teste/imagem.jpg");
        FileOutputStream in = new FileOutputStream(file) ;
        in.write(captcha);
        in.close();

[/code][/quote]

Infelizmente nessa parte eu não tenho como ajudar, mas é estranho pois se você colocar esse link diretamente no navegador ele traz uma imagem.

Um detalhe que eu não sei se influencia, no seu código mais detalhado há o seguinte comando:

O tipo de imagem não é jpeg, o tipo é png.

Consegui resolver…
Primeiro que a imagem agora retornada é do tipo PNG.
segundo que os parâmetros a serem passados para obter as informações também mudaram.

Abaixo segue os parâmetros que estou passando e que estão funcionando.

        nameValuePairs.add(new BasicNameValuePair("origem", "comprovante"));  
        nameValuePairs.add(new BasicNameValuePair("search_type", "cnpj"));  
        nameValuePairs.add(new BasicNameValuePair("cnpj", cnpj));    
        nameValuePairs.add(new BasicNameValuePair("txtTexto_captcha_serpro_gov_br", captcha));
        nameValuePairs.add(new BasicNameValuePair("submit1", "Consultar"));

rpasini1 muito obrigado pela ajuda.

Obrigado pessoal, o meu aqui funcionou com as mudanças dos parâmetros e do tipo da imagem como o grinche falou.