Automatizar consulta de CNPJ

79 respostas
D

Bom dia pessoal, estou precisando automatizar uma consulta de CNPJ.

A idéia inicial é que ao cadastrar um cnpj de um cliente, o usuário consiga consultar o cnpj na página da receita (no campo cnpj tem uma lupa para pesquisar, e ao clicar nela abre uma janela com o campo cnpj preenchido e outro para preencher o valor do captcha com um botão consultar ou pode abrir a página da receita mesmo).

O que preciso mesmo é criar um serviço externo para isto, ou servlet, e ao chamar este serviço, ele quem deve abrir a tela com os campos para consultar conforme mencionado acima ou abrir a página da receita mesmo, e ao clicar em consultar, este serviço me retorne um json ou xml dos dados do cnpj (estes dados serão pegos da página retornada pela receita após a consulta) consultado para que o sistema em questão possa ler estes dados para então preencher estes dados de forma automática.

Alguém tem alguma idéia de como eu poderia fazer está consulta?

Outras sugestões também são bem vinda.

Este é o link da página da receita o qual o serviço deverá acessar para consulta e retorna um json ou xml:

http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp

Ps.: A idéia é a mesma que esta aqui: http://www.guj.com.br/java/54900-automatizar-processo-de-consulta-de-cnpj
Só que tem que ser em JAVA mesmo.

Se alguém puder me ajudar ou ter alguma dica, será muito bem vinda :wink:

Obrigado, Daniel.

79 Respostas

D

Boa tarde a todos.

Depois de muito pesquisar, fazer testes com API’s Apache HttpClient, HttpUnit (Descontinuado) e HtmlUnit, a um tempo atrás cheguei a uma solução com HtmlUnit.

O problema até então que tive com HttpClient foi com javascript o qual o mesmo não tem suporte.

Abaixo tem um exemplo de como utilizar o HtmlUnit:

http://blog.alexandresoli.com.br/?p=112

Siga este exemplo obtendo primeiramente uma instância do WebClient, com ela você acessa a url a qual contém o captcha (http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image) e em seguida a página de consulta do CNPJ (http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp) com o valor do captcha.

Esta API também ajuda bastante a filtrar o conteúdo html, com ela é possível obter trechos de uma página através de tags html, id, nome e etc. Ela foi desenvolvida com finalidade de teste em sistemas, porém foi uma solução util para mim dinamizar a consulta de CNPJ que também será util para de CPF.

Att,
Daniel.

R

Pessoal, Tentei fazer o proposto no título (acessar o site da receita e com os dados do captcha e o cnpj) mas não obtive sucesso… Alguma luz?

D

Olá Ricardo, acho que lhe respondi por e-mail também, como eu disse, de uma pesquisada no HtmlUnit que vai facilita. Ele é bem fácil de usar, pois é capaz de simular um browser e suporta javascript.

Att,
Daniel.

R

Daniel, Boa Tarde

Você tem um exemplo de como carregar o captcha com webclient no jlabel usando a mesma instância da página que o captcha aparece?

D

Opa, bom dia, pode colar o que você tentou até agora?

Att,
Daniel.

R
//definicao do browser
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);

// página da receita
HtmlPage url = webClient.getPage("http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp");


aqui eu tinha que pegar imagem do captcha da url acima e mostrar em um jlabel, mas não sei como. Se eu colocar a url do captcha ele vai me dar outra imagem, ou seja
um cptcha diferente da url acima.

// pega o form html
HtmlForm form = url.getForms().get(0);

form.getInputByName("cnpj").setValueAttribute("cnpj_empresa");
form.getInputByName("idLetra").setValueAttribute("letra captcha");

HtmlPage subm = form.getInputByName("submit1").click();

System.out.println(subm.asXml);
D

Boa tarde, ta no caminho, porém, você tem que primeiro acessar a URL do captcha para obter a imagem gerada e salvar no disco para que ela possa ser visualizada.

Para obter o captcha você faz da seguinte forma:

String urlCaptcha = "http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image";

WebClient cliente = new WebClient(BrowserVersion.getDefault());
        
        WebRequest reqCaptcha = new WebRequest(new URL(urlCaptcha));
        reqCaptcha.setHttpMethod(HttpMethod.GET);
        InputStream imgCaptcha = cliente.getPage(reqCaptcha).getWebResponse().getContentAsStream();

Acima você obtem o captcha via inputstream, basta apenas salvar no disco para que possa ser visualizada para informa os caracteres.

Agora é só fazer exatamente o que você fez no seu utilizando a mesma instância do webcliente (isso fará uma requisição na mesma sessão a qual você obteve a imagem do captcha) passando o cnpj e os caracteres do captcha.

Qualquer coisa, estamos ai.

Abraço,
Daniel.

R

Daniel,

Muito Obrigado por sua ajuda, não teria conseguido sem a sua ajuda.

Só mais um detalhe: No computador de casa funciona blz, no da Empresa não funciona. em casa eu uso o Chrome como navegador padrão
e no trablaho eu uso o mozila. Já instalei o Chrome no trabalho já mudei o BrowserVersion.getDefault() para BrowserVersion.FIREFOX_3_6
e nada. Você já se deparou com esse tipo de erro?

O erro é o seguinte:

Exception in thread main ======= EXCEPTION START ========

Exception class=[java.lang.RuntimeException]

com.gargoylesoftware.htmlunit.ScriptException: Exception invoking jsxSet_innerHTML

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:595)

at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)

at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499)

at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:973)

at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:349)

at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:220)

at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:240)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:598)

at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:556)

at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1142)

at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1044)

at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206)

at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329)

at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3018)

at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2005)

at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452)

at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:225)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179)

at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221)

at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106)

at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433)

at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:311)

at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)

at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)

at Visao.teste.main(teste.java:79)

Caused by: java.lang.RuntimeException: Exception invoking jsxSet_innerHTML

at net.sourceforge.htmlunit.corejs.javascript.MemberBox.invoke(MemberBox.java:198)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject$GetterSlot.setValue(ScriptableObject.java:317)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.putImpl(ScriptableObject.java:2569)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.put(ScriptableObject.java:470)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.putProperty(ScriptableObject.java:2251)

at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.setObjectProp(ScriptRuntime.java:1647)

at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.setObjectProp(ScriptRuntime.java:1637)

at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1407)

at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:854)

at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164)

at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429)

at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:267)

at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3183)

at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:175)

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:490)

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:589)

 30 more

Caused by: java.lang.NoSuchMethodError: org.apache.xpath.compiler.FunctionTable.installFunction(Ljava/lang/String;Ljava/lang/Class;)I

at com.gargoylesoftware.htmlunit.html.xpath.XPathAdapter.initFunctionTable(XPathAdapter.java:54)

at com.gargoylesoftware.htmlunit.html.xpath.XPathAdapter.(XPathAdapter.java:69)

at com.gargoylesoftware.htmlunit.html.xpath.XPathUtils.evaluateXPath(XPathUtils.java:128)

at com.gargoylesoftware.htmlunit.html.xpath.XPathUtils.getByXPath(XPathUtils.java:72)

at com.gargoylesoftware.htmlunit.html.DomNode.getByXPath(DomNode.java:1365)

at com.gargoylesoftware.htmlunit.html.HtmlPage.setCheckedRadioButton(HtmlPage.java:1893)

at com.gargoylesoftware.htmlunit.html.HtmlRadioButtonInput.setChecked(HtmlRadioButtonInput.java:100)

at com.gargoylesoftware.htmlunit.html.HtmlRadioButtonInput.onAddedToPage(HtmlRadioButtonInput.java:187)

at com.gargoylesoftware.htmlunit.html.HtmlPage.notifyNodeAdded(HtmlPage.java:1712)

at com.gargoylesoftware.htmlunit.html.DomNode.fireAddition(DomNode.java:887)

at com.gargoylesoftware.htmlunit.html.DomNode.appendChild(DomNode.java:875)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.addNodeToRightParent(HTMLParser.java:546)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.startElement(HTMLParser.java:510)

at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)

at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)

at org.cyberneko.html.HTMLTagBalancer.startElement(HTMLTagBalancer.java:732)

at org.cyberneko.html.HTMLTagBalancer.emptyElement(HTMLTagBalancer.java:779)

at org.cyberneko.html.filters.DefaultFilter.emptyElement(DefaultFilter.java:144)

at org.cyberneko.html.filters.NamespaceBinder.emptyElement(NamespaceBinder.java:302)

at org.cyberneko.html.HTMLScanner$ContentScanner.scanStartElement(HTMLScanner.java:2649)

at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2022)

at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452)

at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parseFragment(HTMLParser.java:161)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parseFragment(HTMLParser.java:121)

at com.gargoylesoftware.htmlunit.javascript.host.html.HTMLElement.parseHtmlSnippet(HTMLElement.java:916)

at com.gargoylesoftware.htmlunit.javascript.host.html.HTMLElement.jsxSet_innerHTML(HTMLElement.java:840)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at net.sourceforge.htmlunit.corejs.javascript.MemberBox.invoke(MemberBox.java:172)

 45 more

Enclosed exception:

java.lang.RuntimeException: Exception invoking jsxSet_innerHTML

at net.sourceforge.htmlunit.corejs.javascript.MemberBox.invoke(MemberBox.java:198)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject$GetterSlot.setValue(ScriptableObject.java:317)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.putImpl(ScriptableObject.java:2569)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.put(ScriptableObject.java:470)

at net.sourceforge.htmlunit.corejs.javascript.ScriptableObject.putProperty(ScriptableObject.java:2251)

at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.setObjectProp(ScriptRuntime.java:1647)

at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.setObjectProp(ScriptRuntime.java:1637)

at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1407)

at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:854)

at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164)

at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429)

at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:267)

at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3183)

at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:175)

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:490)

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:589)

at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)

at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)

at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499)

at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:973)

at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:349)

at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:220)

at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:240)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:598)

at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:556)

at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1142)

at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1044)

at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206)

at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329)

at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3018)

at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2005)

at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452)

at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:225)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179)

at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221)

at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106)

at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433)

at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:311)

at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)

at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)

at Visao.teste.main(teste.java:79)

Caused by: java.lang.NoSuchMethodError: org.apache.xpath.compiler.FunctionTable.installFunction(Ljava/lang/String;Ljava/lang/Class;)I

at com.gargoylesoftware.htmlunit.html.xpath.XPathAdapter.initFunctionTable(XPathAdapter.java:54)

at com.gargoylesoftware.htmlunit.html.xpath.XPathAdapter.(XPathAdapter.java:69)

at com.gargoylesoftware.htmlunit.html.xpath.XPathUtils.evaluateXPath(XPathUtils.java:128)

at com.gargoylesoftware.htmlunit.html.xpath.XPathUtils.getByXPath(XPathUtils.java:72)

at com.gargoylesoftware.htmlunit.html.DomNode.getByXPath(DomNode.java:1365)

at com.gargoylesoftware.htmlunit.html.HtmlPage.setCheckedRadioButton(HtmlPage.java:1893)

at com.gargoylesoftware.htmlunit.html.HtmlRadioButtonInput.setChecked(HtmlRadioButtonInput.java:100)

at com.gargoylesoftware.htmlunit.html.HtmlRadioButtonInput.onAddedToPage(HtmlRadioButtonInput.java:187)

at com.gargoylesoftware.htmlunit.html.HtmlPage.notifyNodeAdded(HtmlPage.java:1712)

at com.gargoylesoftware.htmlunit.html.DomNode.fireAddition(DomNode.java:887)

at com.gargoylesoftware.htmlunit.html.DomNode.appendChild(DomNode.java:875)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.addNodeToRightParent(HTMLParser.java:546)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.startElement(HTMLParser.java:510)

at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)

at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)

at org.cyberneko.html.HTMLTagBalancer.startElement(HTMLTagBalancer.java:732)

at org.cyberneko.html.HTMLTagBalancer.emptyElement(HTMLTagBalancer.java:779)

at org.cyberneko.html.filters.DefaultFilter.emptyElement(DefaultFilter.java:144)

at org.cyberneko.html.filters.NamespaceBinder.emptyElement(NamespaceBinder.java:302)

at org.cyberneko.html.HTMLScanner$ContentScanner.scanStartElement(HTMLScanner.java:2649)

at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2022)

at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499)

at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452)

at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parseFragment(HTMLParser.java:161)

at com.gargoylesoftware.htmlunit.html.HTMLParser.parseFragment(HTMLParser.java:121)

at com.gargoylesoftware.htmlunit.javascript.host.html.HTMLElement.parseHtmlSnippet(HTMLElement.java:916)

at com.gargoylesoftware.htmlunit.javascript.host.html.HTMLElement.jsxSet_innerHTML(HTMLElement.java:840)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at net.sourceforge.htmlunit.corejs.javascript.MemberBox.invoke(MemberBox.java:172)

 45 more

======= EXCEPTION END ========
D

Opa, não se preocupe com browsers a instala, o htmlunit é independente deles.

Qual versão do htmlunit você está usando em casa e na empresa?

Se for a mesma, certifique-se de que todas as dependências do htmlunit que você está usando na empresa são as mesmas a qual você está usando em casa.

Att,
Daniel.

B

Pessoal,

Existe um site que disponibiliza uma api ( biblioteca, .dll) para consultar os dados da receita federal, sintegra e outros sites:

http://knu.com.br

Contratei aqui pra minha empresa e funciona muito bem. Usamos para confirmar dados cadastrais de clientes a partir de um CPF ou CNPJ (nome completo, razão social, situação cadastral, endereço, etc). É bom também para confirmar se a empresa existe e não apenas validar se o CNPJ ou CPF são válidos. Recomendo.

R
Daniel,

Estou com um problema no htmlUnit ao acessar o site da NFE nacional, tem como você me ajudar? segue o erro:

1º Erro:

SEVERE: Error loading JavaScript from [http://10.200.140.64:8001/estatistica/grupos/www.nfe.fazenda.gov.br.js].
org.apache.http.conn.HttpHostConnectException: Connection to http://10.200.140.64:8001 refused
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:158)
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
        at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.loadJavaScriptFromUrl(HtmlPage.java:1008)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:950)
        at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:349)
        at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:220)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:642)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$400(JavaScriptEngine.java:79)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:590)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:973)
        at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:349)
        at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:220)
        at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:240)
        at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:598)
        at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
        at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:556)
        at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1142)
        at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1044)
        at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206)
        at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329)
        at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3018)
        at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2005)
        at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908)
        at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499)
        at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789)
        at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:225)
        at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179)
        at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221)
        at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106)
        at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:311)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)
        at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)
        at Csv.java.main(java.java:93)
Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:519)
        at com.gargoylesoftware.htmlunit.SocksSocketFactory.connectSocket(SocksSocketFactory.java:89)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
        ... 46 more

2º Erro:

com.gargoylesoftware.htmlunit.ScriptException: Sys.ArgumentOutOfRangeException: Sys.ArgumentOutOfRangeException: Value must be an integer.
Parameter name: x
Actual value was Infinity. (http://www.nfe.fazenda.gov.br/PORTAL/ScriptResource.axd?d=T-l-YtOmK8s3W0iyiAKvgoDF0r1kFNQPezHXZu1_tj_SiF5czsApyksqym1FhbZs12Mdr9b4W_Sghsr-Y3uHAsMvRjz_hzBN7nG33iIV93RCZBlqfIi0x2Dp50_eVUgVmhAiIed4qTM2OzwEOwgjTUH_O-r6PqgaZG0aoCsMgYfuirYO0&t=ffffffff940d030f#3908)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:595)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:545)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:520)
        at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:896)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventListeners(EventListenersContainer.java:162)
        at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:221)
        at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:725)
        at com.gargoylesoftware.htmlunit.html.HtmlElement$2.run(HtmlElement.java:866)
        at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:871)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1240)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1195)
        at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1158)
        at Csv.java.main(java.java:109)
Caused by: net.sourceforge.htmlunit.corejs.javascript.JavaScriptException: Sys.ArgumentOutOfRangeException: Sys.ArgumentOutOfRangeException: Value must be an integer.
Parameter name: x
Actual value was Infinity. (http://www.nfe.fazenda.gov.br/PORTAL/ScriptResource.axd?d=T-l-YtOmK8s3W0iyiAKvgoDF0r1kFNQPezHXZu1_tj_SiF5czsApyksqym1FhbZs12Mdr9b4W_Sghsr-Y3uHAsMvRjz_hzBN7nG33iIV93RCZBlqfIi0x2Dp50_eVUgVmhAiIed4qTM2OzwEOwgjTUH_O-r6PqgaZG0aoCsMgYfuirYO0&t=ffffffff940d030f#3908)
        at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1057)
        at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:854)
        at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164)
        at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429)
        at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:267)
        at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3183)
        at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:162)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$4.doRun(JavaScriptEngine.java:538)
        at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:589)
        ... 16 more
JavaScriptException value = Sys.ArgumentOutOfRangeException: Sys.ArgumentOutOfRangeException: Value must be an integer.
Parameter name: x
Actual value was Infinity.
== CALLING JAVASCRIPT ==

  function () {
      var e = {};
      try {
          e = Sys.UI.DomElement._getWindow(element).event;
      }
      catch (ex) {
      }
      return handler.call(element, new Sys.UI.DomEvent(e));
  }

======= EXCEPTION END ========

Se puder me ajudar, agradeço d+.

D

Bom dia ricardomnlima.

O primeiro erro pode ser a causa de uma url inacessível, se no browser você consegue acessar normalmente tente definir setTimeout(0) em sua instância webclient que a principio também já é uma configuração padrão.
Se caso ainda não resolver sendo que no browser funciona normalmente, é possível que você tenha que definir o proxy em sua instância webclient, para isto use o método setProxyConfig(ProxyConfig);

O segundo erro é uma exceção javascript, alguma string foi passada no lugar de um inteiro, mas exceções javascript na maioria das vezes são lançadas pelo htmlunit e grande parte não afetará o decorrer de sua aplicação.

Se caso mesmo assim o problema não tenha sido resolvido, poste o seu código para que eu faça testes aqui.

Att,
Daniel.

R

Boa Noite Daniel ,

Tentei e não consegui… não tenho a minima noção onde possa ta o erro.
Segue o Código:

public static void main(String args[])  {

       //definicao do browser
WebClient webClient = new WebClient(BrowserVersion.getDefault());



String urlCaptcha = "http://www.nfe.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image";

//WebClient cliente = new WebClient(BrowserVersion.getDefault());

        WebRequest reqCaptcha = null;
        try {
            reqCaptcha = new WebRequest(new URL(urlCaptcha));
        } catch (MalformedURLException ex) {
            Logger.getLogger(java.class.getName()).log(Level.SEVERE, null, ex);
        }
        reqCaptcha.setHttpMethod(HttpMethod.GET);
        InputStream imgCaptcha = null;

        try {

             imgCaptcha = webClient.getPage(reqCaptcha).getWebResponse().getContentAsStream();



        } catch (IOException ex) {
            Logger.getLogger(java.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FailingHttpStatusCodeException ex) {
            Logger.getLogger(java.class.getName()).log(Level.SEVERE, null, ex);
        }

        Image image = null;
        try {
            image = ImageIO.read(imgCaptcha);
        } catch (IOException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }

        //Exibir o captcha
        JFrame frame = new JFrame();
        JLabel label = new JLabel(new ImageIcon(image));
        frame.getContentPane().add(label, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
        //entrada do texto do captcha
        String idLetras = JOptionPane.showInputDialog("Digite o captcha");


// página da receita
HtmlPage url = null;

        System.out.println("Passei");
        try {
            url = webClient.getPage("http://www.nfe.fazenda.gov.br/PORTAL/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=");
        } catch (IOException ex) {
            Logger.getLogger(java.class.getName()).log(Level.SEVERE, null, ex.getMessage());
        }




// pega o form html



HtmlForm form = url.getForms().get(0);

form.getInputByName("ctl00$ContentPlaceHolder1$txtChaveAcessoCompleta").setValueAttribute("52111202782071000461550010004544861625249045");
form.getInputByName("ctl00$ContentPlaceHolder1$txtCaptcha").setValueAttribute(idLetras.trim());

HtmlPage subm = null;
        try {
            subm = form.getInputByName("ctl00$ContentPlaceHolder1$btnConsultar").click();
        } catch (IOException ex) {
            Logger.getLogger(java.class.getName()).log(Level.SEVERE, null, ex);
        }

System.out.println(subm.asXml());
    }
J

to precisando dessa parada ai tambem alguem poderia postar o codigo ai pra gente entender??

D

Boa tarde ricardomnlima.

Tente com a seguinte url que deverá funcionar:
http://www.nfe.fazenda.gov.br/PORTAL/consulta.aspx?tipoConsulta=completa

ao invés de:
http://www.nfe.fazenda.gov.br/PORTAL/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=

jschilling, o código do ricardomnlima está correto, porém, alterando a url deverá funcionar como mencionei acima.

Att,
Daniel.

R

Boa Tarde Daniel,

Muito obrigado pela Atenção. A URL funcionou perfeitamente, matou o primeiro erro, só que o segundo erro ainda persiste,
você tem alguma ideia de como eu posso arrumar esse erro?

Ataxexe

Bugs99:
Pessoal,

Existe um site que disponibiliza uma api ( biblioteca, .dll) para consultar os dados da receita federal, sintegra e outros sites:

http://knu.com.br

Contratei aqui pra minha empresa e funciona muito bem. Usamos para confirmar dados cadastrais de clientes a partir de um CPF ou CNPJ (nome completo, razão social, situação cadastral, endereço, etc). É bom também para confirmar se a empresa existe e não apenas validar se o CNPJ ou CPF são válidos. Recomendo.

Fiquei com medo disto:

Uma simples biblioteca precisar de 1MB de stack size não me cheira bem. Não sei se é porque

Fiquei com medo de mais isto aqui:

A classe já foge do padrão por estar em letras minúsculas e já me entra com métodos estáticos. Colocar isso pra testar vai exigir no mínimo um componente pra encapsular as chamadas já que usar em ambiente de teste vai custar caro porque a biblioteca cobra por consulta e não por uso. Olhando a documentação da parte Java dá pra ver que não tem nada lá que siga ao menos as convenções de código (uma porrada de underscore em vez de camel, por exemplo).

D

ricardomnlima:
Boa Tarde Daniel,

Muito obrigado pela Atenção. A URL funcionou perfeitamente, matou o primeiro erro, só que o segundo erro ainda persiste,
você tem alguma ideia de como eu posso arrumar esse erro?

Bom dia Ricardo,

Tente fazer a consulta especificando um BrowserVersion em sua instância WebClient como você vinha fazendo a princípio como segue abaixo:

new WebClient(BrowserVersion.FIREFOX_3_6);

ao invés de:

new WebClient(BrowserVersion.getDefault())

O getDefault retorna o IE7, pode ser que tenha algo na página que não tenha sido processado com o padrão IE7.

Att,
Daniel.

R

Boa tarde Daniel,

Funcionou perfeitamente com a alteração, só que o link que você me passou ele sempre redireciona para página principal, testei
no navegador e faz a mesma coisa.

URL Nova: http://www.nfe.fazenda.gov.br/PORTAL/consulta.aspx?tipoConsulta=completa
URL ANTIGA: http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=

A url antiga eu usava e dava certo antes, agora não sei porque não funciona mais.

Você tem alguma ideia de como funciona essas url’s e qual seria a certa para funcionar a pesquisa?

magnolohan

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

perotto

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:

// 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();
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.

G

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.

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.

benignoms

Utilize o Jsoup:

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

perotto

Guilherme da Costa utilizei UTF 8.

Este exemplo está funcionando aqui.

Cuide principalmente com a variável viewstate.

Qualquer problema me avisa.

Att.

G

perotto:
Guilherme da Costa utilizei UTF 8.

Este exemplo está funcionando aqui.

Cuide principalmente com a variável viewstate.

Qualquer problema me avisa.

Att.

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.

perotto

Isso mesmo.

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

Att. Perotto.

O

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

perotto

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("origem", "comprovante"));
        nameValuePairs.add(new BasicNameValuePair("search_type", "cnpj"));
        nameValuePairs.add(new BasicNameValuePair("cnpj", cnpj));
        // Veja que o Captcha é necessário nos parâmetros
        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;
        try {
            // Pelo fonte da página da receita o sistema adequado de parâmetros é em UTF-8
            urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
        } 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("IgnoreCharsetDirective", Boolean.TRUE);
        InputStream inputStream = new ByteArrayInputStream(html.getBytes());
        try {
            editorKit.read(inputStream, document, 0);
        } catch (IOException | BadLocationException ex) {
            return null;
        }
        return document;
    }
}
O

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?

perotto

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.

D

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.

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.

D

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.

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

Até mais.

macbird

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

O

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.

O

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”?

A

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.

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.

A

hmmm
vou testar aqui, qualquer coisa eu respondo

muito obrigado.

A

Cara, deu certo

Muito obrigado! xD

MeninodaVila

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?!

C

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.

O

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?

O

Alguém já conseguiu algo?

R

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.

O

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

R

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

G

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

R

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.

O

Tem como postar como fez?

R

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.

G

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.

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;
    }
R

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.

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.

G

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();
G

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…

R
grinche:
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();

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:

StreamedContent imagemCaptcha = new DefaultStreamedContent(new ByteArrayInputStream(captcha), "image/jpeg");

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

G

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.

D

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

H

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

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();

    }

}
está dando a seguinte exceção:
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

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

minha linha 142 é:
while ((linha = bufferedReader.readLine()) != null) {
O

Mudaram somente os parametros?

H

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.

M

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 !

G

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;
    }
M

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

N

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

R

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.

N

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.

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

H

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á!

G

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

T

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

L

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.

A

er

gilmarturci

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

barbolo

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/

olavo69

Existe algum de graça?

Ou algum tutorial que ensine criar algum para o CAPTCHA ?

O

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?

edumatias

Ai

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

Basta passar o CNPJ.

Agora, pra CPF ai é outra história.

P

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: [email removido]

Criado 27 de setembro de 2011
Ultima resposta 5 de ago. de 2018
Respostas 79
Participantes 29