Automatizar consulta de CNPJ

estou tentando fazer conforme passo a passo que se vem caminhando e estou com o seguinte código:

[code]public class NewClass {

public static void main(String[] args) throws IOException {

    // Criando o cliente  
    DefaultHttpClient 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  
    CookieStore cookie = new BasicCookieStore();

    // Criando o contexto de conexão  
    HttpContext contexto = new BasicHttpContext();

    // Adicionando o coockie store no contexto de conexão  
    contexto.setAttribute(ClientContext.COOKIE_STORE, cookie);

    // Criando o método de acesso  
    HttpGet requisição1 = new HttpGet("http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp");

    // Resposta  
    HttpResponse resposta = cliente.execute(requisição1, contexto);

    // Escrever informações  
    System.out.println("Status Line: " + resposta.getStatusLine());

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    // Buscando a entidade  
    HttpEntity entidade = resposta.getEntity();

     // Transformando o conteúdo em uma string  
    String html = null;
    try {
        html = EntityUtils.toString(entidade);
    } catch (IOException | ParseException exception) {
 // Ocultado  
    }

// Busco o documento estruturado
HTMLDocument document = (new DocumentoHtml()).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”, “”);
}
}

    // Escrever informações  
    System.out.println("Encoding: " + entidade.getContentEncoding());
    System.out.println("Tamanho: " + entidade.getContentLength());
    System.out.println("Tipo: " + entidade.getContentType());

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    // Baixar o stream  
    InputStream entrada = entidade.getContent();

    // Cria um stream de leitura  
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entrada, "LATIN1"));
    
    

    // Cria o receptor de linha  
    String linha;

    // Cria o acumulador  
    String acumulador = "";

    // Para cada linha  
    while ((linha = bufferedReader.readLine()) != null) {
        // Escreva  
        System.out.println(linha);
        acumulador += "\n" + linha;
    }

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    acumulador = acumulador.substring(acumulador.indexOf("/scripts/captcha/Telerik.Web.UI.WebResource.axd?"));

    acumulador = acumulador.substring(0, acumulador.indexOf("'"));

    System.out.println(acumulador.replaceAll("amp;", ""));

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    HttpGet requisição2 = new HttpGet("http://www.receita.fazenda.gov.br" + acumulador.replaceAll("amp;", "").replaceAll("cah", "rca"));

    // Resposta  
    resposta = cliente.execute(requisição2, contexto);

    // Escrever informações  
    System.out.println("Status Line: " + resposta.getStatusLine());

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    // Buscando a entidade  
    entidade = resposta.getEntity();

    // Escrever informações  
    System.out.println("Encoding: " + entidade.getContentEncoding());
    System.out.println("Tamanho: " + entidade.getContentLength());
    System.out.println("Tipo: " + entidade.getContentType());

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    // Baixar o stream  
    entrada = entidade.getContent();

    ByteArrayOutputStream out;
    try (InputStream in = new BufferedInputStream(entrada)) {
        out = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int n = 0;
        while (-1 != (n = in.read(buf))) {
            out.write(buf, 0, n);
        }
        out.close();
    }

    byte[] response = out.toByteArray();
    try (FileOutputStream fos = new FileOutputStream("captcha.jpeg")) {
        fos.write(response);
    }

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    String captcha = JOptionPane.showInputDialog("Entre com o captcha:");

    // Criando o método de acesso  
    HttpPost requisição3 = new HttpPost("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp");

    // Lista de parâmetros  
    List<NameValuePair> nameValuePairs = new ArrayList<>();

    // Adicionando os parâmetros  
    nameValuePairs.add(new BasicNameValuePair("origem", "comprovante"));
    nameValuePairs.add(new BasicNameValuePair("search_type", "cnpj"));
    nameValuePairs.add(new BasicNameValuePair("cnpj", "20589462000101"));
    nameValuePairs.add(new BasicNameValuePair("captcha", captcha));
    nameValuePairs.add(new BasicNameValuePair("captchaAudio", ""));
    nameValuePairs.add(new BasicNameValuePair("submit1", "Consultar"));
    nameValuePairs.add(new BasicNameValuePair("viewstate", viewstate));

    // Encapsulando  
    UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");

    // A adição dos parâmetros  
    requisição3.setEntity(urlEncodedFormEntity);

    // Resposta  
    resposta = cliente.execute(requisição3, contexto);

    // Escrever informações  
    System.out.println("Status Line: " + resposta.getStatusLine());

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    // Buscando a entidade  
    entidade = resposta.getEntity();

    // Escrever informações  
    System.out.println("Encoding: " + entidade.getContentEncoding());
    System.out.println("Tamanho: " + entidade.getContentLength());
    System.out.println("Tipo: " + entidade.getContentType());

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

    // Baixar o stream  
    entrada = entidade.getContent();

    // Cria um stream de leitura  
    bufferedReader = new BufferedReader(new InputStreamReader(entrada));

    // Para cada linha  
    while ((linha = bufferedReader.readLine()) != null) {
        // Escreva  
        System.out.println(linha);
    }

    // Separador  
    System.out.println();
    System.out.println("---------------------------------------------------------");
    System.out.println();

}

}[/code]
está dando a seguinte exceção:

[code]
Status Line: HTTP/1.1 200 OK


Encoding: null
Tamanho: 8205
Tipo: Content-Type: text/html


Exception in thread “main” java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:167)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:137)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at NewClass.main(NewClass.java:142)
Java Result: 1[/code]

alguem pode me ajudar e me direcionar para dar o proximo passo?

minha linha 142 é:

        while ((linha = bufferedReader.readLine()) != null) {

Mudaram somente os parametros?

Pessoal, desculpem a insistência,porem eu realmente gostaria de conseguir fazer isso, porem estou sem saber o que fazer pois no laço está dando o erro acima colocado, ficaria muito agradecido se pudessem me ajudar.

olá himorrivel … estou tentando desenvolver a mesma consulta, esta me retornando o mesmo erro

logo apos fazer a requisicao2, me retorna:

Status Line: HTTP/1.1 200 OK  
  
---------------------------------------------------------  
  
Encoding: null  
Tamanho: 8205  
Tipo: Content-Type: text/html

e apos entrar com o captcha e fazer a requisicao3, me retorna

HTTP/1.1 302 Object moved

tem um codigo em C# para comparação dos parametros e ter uma idéia das requisicões, revirei esse outro codigo para ver o que esta diferente, em comparação com nosso codigo, provavelmente é o cookie, mas não consegui identificar exatamente… se quiser dar uma olhada, aqui esta:

http://tdaweb.com.br/base-de-conhecimento/missao-consulta-cnpj-site-da-receita-em-asp-net-para-webform-e-c/

se quizer conversar sobre isso…estamos aqui

Abraço !

Segue meu código abaixo que esta funcionando perfeitamente.

    private DefaultHttpClient cliente;
    private BasicCookieStore cookie;
    private BasicHttpContext contexto;
    private HttpResponse resposta;

    @PostConstruct
    public void init() {
        // 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");
            // 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", "");
                 }
            }
            //http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp
            // Crio a segunda requisição  
            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);
            // converte os bytes da imagem para base64
            String captchaBase64 = new BASE64Encoder().encode(captcha);
            // atribui o valor da imagem ao objeto que sera reotnrado
            receitaFederalConsulta.setImagemCaptcha(captchaBase64);
            receitaFederalConsulta.setCaptcha(null);
        } catch (Exception e) {
            logger.error(e);
        }
        return receitaFederalConsulta;
    }
    
    @Override
    public ReceitaFederalConsulta getValues(ReceitaFederalConsulta receitaFederalConsulta) throws Exception {
        // Criando o método de acesso  
        HttpPost requisicao3 = new HttpPost("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp");  
        // Lista de parâmetros  
        List<NameValuePair> nameValuePairs = new ArrayList<>();
        // Adicionando os parâmetros  
        nameValuePairs.add(new BasicNameValuePair("origem", "comprovante"));  
        nameValuePairs.add(new BasicNameValuePair("search_type", "cnpj"));  
        nameValuePairs.add(new BasicNameValuePair("cnpj", MaskUtil.cnpj(receitaFederalConsulta.getCnpj())));    
        nameValuePairs.add(new BasicNameValuePair("txtTexto_captcha_serpro_gov_br", receitaFederalConsulta.getCaptcha().toLowerCase()));
        nameValuePairs.add(new BasicNameValuePair("submit1", "Consultar"));
        // Encapsulando  
        UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
        requisicao3.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);
        // definindo a entidade
        requisicao3.setEntity(urlEncodedFormEntity);  
        // resposta
        resposta = cliente.execute(requisicao3, 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);
        setValues(elementIterator, receitaFederalConsulta);
        if (StringUtils.isBlank(receitaFederalConsulta.getNumeroDeInscricao())) {
            throw new Exception("Caracteres inválido, uma nova imagem foi gerada.");
        }
        if (StringUtils.isNotBlank(receitaFederalConsulta.getCidade()) && StringUtils.isNotBlank(receitaFederalConsulta.getUf())) {
            receitaFederalConsulta.setCidadeEntity(cidadeService.getByNomeAndUf(receitaFederalConsulta.getCidade(), receitaFederalConsulta.getUf()));
        }
        return receitaFederalConsulta;
    }

Obrigado himorrivel e grinche … ambas soluções realmente estão funcionando… novamente Obrigado a todos

galera criei um projeto no github para tentar fazer consulta de cpf automatizada quebrando o captcha está meio ruim quem quiser ajudar a melhorar ta ai o link https://github.com/nivaldojunior/CAPTCHA

Acredito que isso seja um pouco complicado, visto o lixo que é a imagem do captcha.
Eu tentei usar o tesseract, ele não acerta uma imagem sequer, realmente eu acho que isso é bem complicado.
Mas boa sorte ai.

Acredito que isso seja um pouco complicado, visto o lixo que é a imagem do captcha.
Eu tentei usar o tesseract, ele não acerta uma imagem sequer, realmente eu acho que isso é bem complicado.
Mas boa sorte ai.[/quote]

eu consegui meu amigo com se você ver no github a taxa de acerto é bem baixa mas se você colocar em um loop em uns 2 min ele busca pra você! precisa de um tratamento de imagem melhor mas eu não entendo muito por isso estou pedindo ajuda para melhorar

Pessoal, pode parecer irônico, porem deu problema no meu HD e acabei perdendo as informações, o guj mudou as informações e acabou perdendo também alguns dados e por estes códigos aqui postado não estou conseguindo fazer voltar a funcionar, tem como passar todo o código em funcionamento? Obrigado desde já!

Olá estou tentando utilizar seu codigo, porem nao conseguindo você pode me enviar os imports deste codigo ?

Qual versão da biblioteca htmlunit foi utilizada ? não estou conseguindo implementar o código.

Olá grinche!
Sei que o tópico é antigo, mas gostaria de saber se
vc pode postar o código completo, estou adaptando o código que você postou porém não estou obtendo sucesso, algumas partes do código, estão indefinidas, com se estivesse faltando a definição de alguns métodos e classes, por exemplo o método getHTMLDocument(html) e a Entidade NameValuePair. Estou precisando urgente dessa solução para a empresa onde trabalho, atualmente tenho uma aplicação Java Web Start. Se puder postar o código completo aqui, ficarei grato.

er

Ai galera tem o código completo aqui https://github.com/guiobome10/folha

A Infosimples oferece automação de consultas públicas na Internet:

https://infosimples.com/

A SERPRO deve oferecer em breve esse serviço, porém com diversas limitações:

https://apigov.serpro.gov.br/

Existe algum de graça?

Ou algum tutorial que ensine criar algum para o CAPTCHA ?

Desenterrando o tópico…
A Refeita federal mudou a forma do Captcha… agora é o famoso “eu não sou um robô”…
Alguém já conseguiu algo p/ fazer a consulta do CNPJ?

Ai

https://www.receitaws.com.br/v1/cnpj/27865757000102

Basta passar o CNPJ.

Agora, pra CPF ai é outra história.

Olá, para quem precisar, tenho webservice para resolver o catpcha da receita/nfe.
Também tenho consulta direta apenas pelo CNPJ, apenas com CPF (sem data de nascimento), e apenas usando a chave de acesso da nfe, já te retorno o XML.
Contato: powersistemasautomacao@gmail.com