Automatizar consulta de CNPJ

Já estou a um tempo procurando está solução, pois já vi em uns projetos em que
é só digitar o cnpj ou cpf e o sistema pega estes dados na receita e faz o cadastro.

eu encontrei um anuncio no mercado livre de alguém vendendo um código se não conseguir resolver
estou pensando em comprar.

este aqui
http://produto.mercadolivre.com.br/MLB-431609484-pesquisar-cnpj-e-cpf-na-receita-codigo-fonte-em-java-_JM

Estou com o mesmo problema.

Com o HtmlUnit simplesmente dá um erro e não abre.

Com o HttpClient da Apache consigo baixar o site de consulta, buscar o captcha e salvar.

Porém quando envio o formulário via Post (como está no código fonte da página) acontece 02 coisas (se não passo o ViewState nos parâmetros) ele retorna a mesma página que estava (é claro que com um novo Captcha), (se passo o ViewState nos parâmetros) ele me redireciona a uma página contendo a mensagem: parâmetros inválidos.

Simplesmente não sei mais aonde pode estar o erro, isso está me esquentando a cabeça.

Caso alguém se interesse, aqui está o código que possuo no momento e que não funciona:

[code]// 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();

    // 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/Cnpjreva_Solicitacao2.asp");

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

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

    // 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]

Resolvi meu problema alterando a requisição 3 para este link:

HttpPost requisição3 = new HttpPost(http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp);

E usando esses parâmetros na requisição 3:

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

Onde cnpj, captcha e viewstate são variáveis. Cnpj = o cnpj que estou buscando, catpcha = aos caracteres da imagem e viewstate é igual ao valor da variável viewstate dentro do código fonte da página.

Foi isto ai, por ora está funcionando.

[quote=perotto]Resolvi meu problema alterando a requisição 3 para este link:

HttpPost requisição3 = new HttpPost(http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp);

E usando esses parâmetros na requisição 3:

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

Onde cnpj, captcha e viewstate são variáveis. Cnpj = o cnpj que estou buscando, catpcha = aos caracteres da imagem e viewstate é igual ao valor da variável viewstate dentro do código fonte da página.

Foi isto ai, por ora está funcionando.[/quote]

perotto,

Qual codificação você utilizou para enviar a requisição3?

Utilizando seu exemplo aqui usei a ISO-8859-1, mas recebi o seguinte retorno:

Sysout:

---------------------------------------------------------

Status Line: HTTP/1.1 302 Object moved

---------------------------------------------------------

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

---------------------------------------------------------

<head><title>Object moved</title></head>
&lt;body&gt;&lt;h1&gt;Object Moved&lt;/h1&gt;This object may be found <a >here</a>.&lt;/body&gt;

---------------------------------------------------------

Se puder me ajudar, ficarei muito agradecido.

Utilize o Jsoup:

Na minha opinião é a melhor biblioteca para html parser.

Guilherme da Costa utilizei UTF 8.

Este exemplo está funcionando aqui.

Cuide principalmente com a variável viewstate.

Qualquer problema me avisa.

Att.

[quote=perotto]Guilherme da Costa utilizei UTF 8.

Este exemplo está funcionando aqui.

Cuide principalmente com a variável viewstate.

Qualquer problema me avisa.

Att.[/quote]

Perotto, obrigadão cara, troquei para UTF-8 e funcionou.

Era tão fácil… agora só pegar o conteúdo que interessa da resposta.

Abraço.

Isso mesmo.

Demorei para descobrir. Mas já melhorei bastante essa funcionalidade para as minhas aplicações.

Att. Perotto.

perotto, se não for muito incomodo, teria como postar o fonte atualizado e funcionando?

Infelizmente não posso disponibilizar o todo o código fonte atualizado, pois há neles alguns códigos sigilosos da empresa.

Porém posso te passar a sequência de acesso e os parâmetros.

       // 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
        BasicCookieStore cookie = new BasicCookieStore();

        // Criando o contexto de conexão
        BasicHttpContext 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;
        try {
            resposta = cliente.execute(requisição1, contexto);
        } catch (IOException exception) {
            // Ocultado
        }

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

        // Transformando o conteúdo em uma string
        String html;
        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", "");
            }
        }

        // Crio a segunda requisição
        HttpGet requisição2 = new HttpGet(imgcaptcha);

        // Resposta
        try {
            resposta = cliente.execute(requisição2, contexto);
        } catch (IOException exception) {
            // Ocultado
        }

        // Crio o captcha que vai receber o código
        String captcha;

        // Buscando a entidade
        entidade = resposta.getEntity();
        try {
            // Esse código CRIA A IMAGEM DO CAPTCHA
            new ImageIcon(EntityUtils.toByteArray(entidade));
            // Dê algum jeito de mostrar isso para o usuário e pegar o retorno
        } catch (IOException exception) {
            // Ocultado
        }

        // Se o captcha for nulo, pare tudo
        if (captcha == null) {
            // Ocultado
        }

        if (captcha.isEmpty()) {
            // Ocultado
        }

        // 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&lt;NameValuePair&gt; nameValuePairs = new ArrayList&lt;&gt;();

        // Adicionando os parâmetros
        nameValuePairs.add(new BasicNameValuePair(&quot;origem&quot;, &quot;comprovante&quot;));
        nameValuePairs.add(new BasicNameValuePair(&quot;search_type&quot;, &quot;cnpj&quot;));
        nameValuePairs.add(new BasicNameValuePair(&quot;cnpj&quot;, cnpj));
        // Veja que o Captcha é necessário nos parâmetros
        nameValuePairs.add(new BasicNameValuePair(&quot;captcha&quot;, captcha));
        nameValuePairs.add(new BasicNameValuePair(&quot;captchaAudio&quot;, &quot;&quot;));
        nameValuePairs.add(new BasicNameValuePair(&quot;submit1&quot;, &quot;Consultar&quot;));
        nameValuePairs.add(new BasicNameValuePair(&quot;viewstate&quot;, viewstate));

        // Encapsulando
        UrlEncodedFormEntity urlEncodedFormEntity;
        try {
            // Pelo fonte da página da receita o sistema adequado de parâmetros é em UTF-8
            urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, &quot;UTF-8&quot;);
        } catch (UnsupportedEncodingException exception) {
            // Ocultado
        }

        // A adição dos parâmetros
        requisição3.setEntity(urlEncodedFormEntity);
        try {
            // Resposta
            resposta = cliente.execute(requisição3, contexto);
        } catch (IOException exception) {
            // Ocultado
        }

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

        // Pego o código fonte e jogo na string
        try {
            html = EntityUtils.toString(entidade);
        } catch (IOException | ParseException exception) {
            // Ocultado
        }

        // Busco o documento estruturado
        document = (new DocumentoHtml()).getHTMLDocument(html);

        // Busco todos os elementos em forma de iterador
        elementIterator = new ElementIterator(document);

        // Enquanto existir próximo elemento
        while ((element = elementIterator.next()) != null) {
            // Dentro dos elementos estão as informações para se pegar, porém não tenho autorização de divulgá-las.
            // Use a criatividade que você irá recuperar todos os dados necessários dentro deste While.
        }

Isto é tudo que posso "mostrar", mas daí pra frente é só verificar o conteúdo e tudo mais.

A Classe utilizada DocumentoHTML, segue abaixo:

/**
 * Classe dedicada a transformação de String em um documento HTML estruturado para Swing.
 *
 * @author Alexandre Perotto
 */
public class DocumentoHtml {
    /**
     * Método que recebe uma String e a converte para HTMLDocument.
     *
     * @param html
     * @return documento HTML ou nulo
     */
    public HTMLDocument getHTMLDocument(String html) {
        HTMLEditorKit editorKit = new HTMLEditorKit();
        HTMLDocument document = (HTMLDocument) editorKit.createDefaultDocument();
        document.putProperty(&quot;IgnoreCharsetDirective&quot;, Boolean.TRUE);
        InputStream inputStream = new ByteArrayInputStream(html.getBytes());
        try {
            editorKit.read(inputStream, document, 0);
        } catch (IOException | BadLocationException ex) {
            return null;
        }
        return document;
    }
}

Primeiramente obrigado por postar uma excelente solução.

Eu consegui ler o captcha, exibi-lo e enviar o código com JSF e ajax.
Recebo a página com o “cartão do CNPJ” mas não consigo capturar os parametros.
Onde tem o nome, vem algo p-implied.
Seria possível mostrar como pega pelo menos um campo?

O código a seguir é PARCIAL, portanto se executá-lo como está você não obterá sucesso.

	// Enquanto existir próximo elemento
        while ((element = elementIterator.next()) != null) {
            QUEBRA:
            {
                if (element.getName().equals(HTML.Tag.TD.toString())) {
                    String conteúdo;
                    try {
                        conteúdo = (String) element.getDocument().getText(element.getStartOffset(), element.getEndOffset() - element.getStartOffset());
                    } catch (BadLocationException exception) {
                        // Ocultado
                    }
                    if (!conteúdo.contains("NÚMERO DE INSCRIÇÃO")) {
                        break QUEBRA;
                    }
                    if (!conteúdo.contains("DATA DE ABERTURA")) {
                        break QUEBRA;
                    }
                    if (!conteúdo.contains("NOME EMPRESARIAL")) {
                        break QUEBRA;
                    }
                    if (!conteúdo.contains("TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)")) {
                        break QUEBRA;
                    }

                    // Esses IF's continuam até terminar todos os "Nomes" que quero dentro da página (VEJA o Cartão CNPJ para entender).

		    // Este é um objeto criado apenas para guardar os dados capturados
                    ElementoCnpj elementoCnpj = new ElementoCnpj();

		    // Aqui capturo o CNPJ
                    int index = 0;
                    int pos1 = conteúdo.indexOf("NÚMERO DE INSCRIÇÃO", index);
                    index = pos1;
                    int pos2 = conteúdo.indexOf("COMPROVANTE DE INSCRIÇÃO E DE SITUAÇÃO CADASTRAL", index);
                    index = pos2;
                    elementoCnpj.setCnpj(limparString(conteúdo.substring(pos1 + "NÚMERO DE INSCRIÇÃO".length(), pos2)).substring(0, 18));

		    // Aqui capturo a Data de Abertura
		    pos1 = conteúdo.indexOf("DATA DE ABERTURA", index);
                    index = pos1;
                    pos2 = conteúdo.indexOf("NOME EMPRESARIAL", index);
                    index = pos2;
                    elementoCnpj.setDataAbertura(limparString(conteúdo.substring(pos1 + "DATA DE ABERTURA".length(), pos2)));

		    // Faço isto para tudo que eu quiser capturar.

                    return elementoCnpj;
                }
            }
        }

Vamos as explicações.

Veja nos códigos anteriormente postados que ‘elementIterator’ é obtido depois de uma “estruturação” do Html da página.

Feito isto eu simplesmente “rodo” a página elemento a elemento. Então vasculho TAG a TAG Html até identificar um ponto de coleta.

A página do Cartão de CNPJ é estruturada especialmente em “TD” e existe (logo no início) uma “super TD” que contém todos os dados do cartão, então é este “super TD” que procuro em meu código.

Então, eu coleto o conteúdo da TD e faço uma série de verificações assim ‘!conteúdo.contains(“NÚMERO DE INSCRIÇÃO”)’ se o conteúdo não tiver o Número de Inscrição, … e todos os outros campos Literalmente Escritos no Cartão de CNPJ significa que não é esta TD e então salto o código para o próximo passo.

Caso o conteúdo contenha todas essas palavras chaves, significa que estou na tabela com os dados.

Então simplesmente faço uma busca entre um campo chave e outro e obviamente o que está entre as chaves é o conteúdo referente à primeira chave.

Porém como estou trabalhando com o código fonte da página, muito “lixo” pode surgir entre os códigos, então faço uma limpeza especial para a página com este método.

        private String limparString(String string) {
		// Retirar caracter misterioso da página da Receita Federal :D.
        	string = string.replace((char) 10, ' ');
		// Retirar caracter misterioso da página da Receita Federal :D.
	        string = string.replace((char) 160, ' ');
		// Retirar os preenchimentos com '*' nos cadastros não preenchidos.
	        string = string.replaceAll("\\*", "");
	        return string.trim();
	}

Faço isto para todos os campos até esgotar a busca.

OBSERVAÇÃO¹: Reforçando, antes que alguém critique o código, este código é PARCIAL, portanto usem-o como exemplo e o completem para as suas necessidades. Para tirar maiores dúvidas consultem também o final do código dos meus últimos posts.

OBSERVAÇÃO²: O código é para Desktop.

Att.

Bom Dia pessoal,

Estou utilizando esse código do perotto como base pra fazer essa consulta pra web com jsf.
Na maquina que desenvolvo ta rodando 100%, porém quando coloco em um servidor com linux ele se perde.
Acaba me trazendo a resposta com caracteres estranhos no lugar de acentos, como se não identificasse o charset,
Segue a baixo o trecho do código que faz a requisição:

try {
            HttpPost requisição3 = new HttpPost("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp");

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("origem", "comprovante"));
            nameValuePairs.add(new BasicNameValuePair("search_type", "cnpj"));
            nameValuePairs.add(new BasicNameValuePair("cnpj", getCliente().getPessoa().getDocumento()));
            nameValuePairs.add(new BasicNameValuePair("captcha", getCaptcha()));
            nameValuePairs.add(new BasicNameValuePair("captchaAudio", ""));
            nameValuePairs.add(new BasicNameValuePair("submit1", "Consultar"));
            nameValuePairs.add(new BasicNameValuePair("viewstate", getViewstate()));

            UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, Charset.forName("UTF-8"));
            requisição3.setEntity(urlEncodedFormEntity);
            setResposta(getHttpCliente().execute(requisição3, getContexto()));
            setEntidade(getResposta().getEntity());
            setEntrada(getEntidade().getContent());
            
            setBufferedReader(new BufferedReader(new InputStreamReader(getEntrada())));
            List<String> linhasAux = new ArrayList<String>();
            List<String> linhas = new ArrayList<String>();
            while ((linhaAux = getBufferedReader().readLine()) != null) {
                linhasAux.add(html2text(getLinhaAux()));
            }
            for (String l : linhasAux) {
                if (l.trim().length() > 0) {
                    linhas.add(l.trim());
                }
            }
            String[] linha = linhas.toArray(new String[linhas.size()]);
            for(String l : linha)
                System.out.println(l);
    }

Quem puder me ajudar agradeço.

Olá, tente modificar a seguinte linha:

setBufferedReader(new BufferedReader(new InputStreamReader(getEntrada())));

Para isto

setBufferedReader(new BufferedReader(new InputStreamReader(getEntrada(), "ISO-8859-1")));

Qualquer problema, fique trocando o Charset até achar algum adequado para sua aplicação.

Não testei o código, mas acredito que funcione.

Att.

[quote=perotto]Olá, tente modificar a seguinte linha:

setBufferedReader(new BufferedReader(new InputStreamReader(getEntrada())));

Para isto

setBufferedReader(new BufferedReader(new InputStreamReader(getEntrada(), "ISO-8859-1")));

Qualquer problema, fique trocando o Charset até achar algum adequado para sua aplicação.

Não testei o código, mas acredito que funcione.

Att.[/quote]

Perfeito mestre. Muito obrigado, me quebrou um galhão agora…
=D

Até mais.

Ola Ricardo estou precisando de algo semelhante ao que você implementou. Será que você poderia me ajudar??

Boa noite,

Eu rodo em minha máquina local tanto no windows quanto no linux.
Mas quando eu subo p/ o servidor linux, aparece somente um quadrado cinza sem as letras do captcha.

Alguém saberia me dizer o porque?

Desde já, obrigado.

Pessoal,
Como eu disse, não estou conseguindo rodar a captura da imagem captcha no meu servidor;
Já tentei ver se era alguma porta bloqueada e etc…

Sabendo que essa parte do codigo:

	HttpContext localContext = new BasicHttpContext();
	localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

Onde o tomcat tenta “jogar” o cookie que o site da receita armazena em nosso “browser”?

Comigo acontece a mesma coisa.

Acho que a receita tem um modo de bloquear o ip do servidor, pois quando joguei em meu servidor de testes ele funcionou.
Porém, logo depois, passou a não funcionar mais.
Sempre apresentando o mesmo quadrado cinza.

Estou ficando louco ja kkkkkk

Alguma dica?
Agradeço.

Quando vc testa localhost funciona, certo?

Solução:
Vc tem que salvar a imagem em seu servidor, e depois passar a imagem salva p/ o usuário.
Se passar a url da imagem da RF, o cookies está com o servidor e o usuário da máquina diferente não os tem.
Acaba gerando uma uma imagem cinza.

Qualquer dúvida, pode perguntar.