Aplicação para validar cpf no site da receita

Ola pessoal, estou tentando fazer uma aplicação que tem como objetivo a pessoa digitar seu cpf e o programa vai no site da receita e pega o nome da pessoa baseado no cpf que ela digitou.
Procurando no google encontrei uma solução em php: http://cacovsky.wordpress.com/2011/02/06/php-curl-cookies-sessions-cpf-e-site-da-receita-federal/
Meu objetivo é pegar a imagem e o cookie do captcha, e enviar os parametros cpf, letras e cookie via post, para entao conseguir retornar o site com o nome da pessoa.
No codigo que fiz ele retorna a mesma pagina de consulta e nao a pagina do resultado…

	public static void main(String args[]){
	    URL url;
		try {
			//url do captcha
			url = new URL("http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image&v=" + new Date().getTime());
			URLConnection conn = url.openConnection();
	       
	        Image image = ImageIO.read(url);	        

	        //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");
	        
	        //capturar o cookie
	        String headerName;
	        String cookie = "";
	        for (int i=1; (headerName = conn.getHeaderFieldKey(i))!=null; i++) {
	        	if (headerName.equals("Set-Cookie"))                  
	        		cookie = conn.getHeaderField(i);          
	        }
	        
	        cookie = cookie.split(";")[0];
	        System.out.println(cookie);
	        
	        //url da consulta
	        url = new URL("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp");
	        //url = new URL("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp");
	        conn = url.openConnection();
	     	             	        
	        //cria os parametros	        
	        String parametros = URLEncoder.encode("txtCPF", "UTF-8") + "=" + URLEncoder.encode("cpfvalido", "UTF-8");
            parametros += "&" + URLEncoder.encode("idLetra", "UTF-8") + "=" + URLEncoder.encode(idLetras, "UTF-8");            
            //parametros += "&" + URLEncoder.encode("idSom", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");            
            parametros += "&" + URLEncoder.encode("Enviar", "UTF-8") + "=" + URLEncoder.encode("Consultar", "UTF-8");            

            conn.setDoOutput(true);
            conn.setDoInput(true);            
            
            //seta as propriedades de request
            conn.setRequestProperty("Cookie", cookie);
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            conn.setRequestProperty("Referer", "http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp?Error=1");
                       
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(parametros);
            wr.flush();

            //pega o retorno
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String s = "";
            
            while (null != ((s = rd.readLine()))) {  
            	System.out.println(s);
            } 
            
            wr.close();
            rd.close();
            
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
	}

alguma luz?

cara tem um componente no java o jeditorpane
ele aceita html talves seja mais facil usando ele

ola elton santos.
infelizmente nao posso usar esse componente, pois preciso que o usuário apenas interaja com a interface do meu programa, a parte de consultar o cpf na receita tem q ser transparente para o usuário final.
e esse codigo que coloquei é apenas para testar e tentar fazer ele funcionar, o sistema onde irei aplicar isso é um sistema web
mesmo assim obrigado! :slight_smile:

Não rodei seu exemplo, mas suponho que esteja retornando a página de consulta pois alguma parametro não seja passado corretamente. Tem ver ser no html que é retornado não volta uma mensagem de erro.

o erro que ele retorna na página é de que as letras informadas do captcha esta errado.
talvez seja o cookie do captcha q ele não esta enviando na consulta, mas ate onde achei, essa maneira de enviar o cookie esta certo…

Tem sim, vc não pode usar o Http Client da apache? ele facilita o tratamento de cookies

furutani , utilizei o httpClient como vc disse e não obtive resultado, basicamente acontece o mesmo q utilizando o urlconnection

aldrato, conseguiu algo a repeito do seu problema? Pois estou precisando fazer a mesma coisa, só que para cnpj.

daniel, ainda não consegui fazer funcionar, e pior que eu estou com outras atividades e acabei deixando ele de lado, quando tiver mais tempo irei continuar tentando.

Aldrato, consegui chegar a uma solução na semana retrasada o que pode lhe ajudar também.

Segue o link abaixo:

http://www.guj.com.br/java/253715-resolvido-automatizar-consulta-de-cnpj

Att,
Daniel

a receita nao disponibiliza isso via webservice? o que vc esta fazendo ateh funciona … ateh a hora que a URL mudar, ae seu programa para de funcionar … ou seja, vc esta construindo um castelo de cartas …

Daniel, irei tentar fazer da maneira como vc disse, caso consiga postarei aqui o resultado
Obrigado pela ajuda!

balrog, existe sim um webservice, só que é pago, e isto é apenas para ajudar na validação do cnpj e consistência dos dados, caso a página mude, isso vai apenas para um serviço de validação, não um sistema.

Além do mais, não foi isto que o nosso amigo aldrato pediu?

aldrato, vai postando o que você vai conseguindo que irei ajudando sem problemas.

Abraço a todos.

aldrato, Você coseguiu acessar o site para ler o html?

ricardomnlima, apenas consegui retornar a mesma pagina de consulta e nao a pagina com o restuldado do nome

aldrato, lendo a página vi que você conseguiu pegar o erro que vem da página (letra diferente da imagem etc.) como você fez para pegar essa menssagem de erro? se puder postar o código eu agradeço.

ricarod o codigo é:

public static void main(String args[]){
	    URL url;
	    HttpURLConnection conn;
		try {
			//ativarProxy();
			//url do captcha
			
			url = new URL("http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image&v=" + new Date().getTime());
			conn = (HttpURLConnection) url.openConnection();
			       
	        Image image = ImageIO.read(conn.getInputStream());	        

	        //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");
	        String headerName;
	        String cookie = "";
	        frame.dispose();
	        
	        //capturar o cookie
	        for (int i=1; (headerName = conn.getHeaderFieldKey(i))!=null; i++) {
	        	if (headerName.equals("Set-Cookie"))                  
	        		cookie = conn.getHeaderField(i);          
	        }
	        
	        cookie = cookie.split(";")[0];
	        System.out.println(cookie);
	        
	        //url da consulta
	        url = new URL("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp");
	        //url = new URL("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp");
	     	        
	        conn = (HttpURLConnection) url.openConnection();
	        //cria os parametros	        
	        String parametros = URLEncoder.encode("txtCPF", "UTF-8") + "=" + URLEncoder.encode("01715789377", "UTF-8");
	        parametros += "&" + URLEncoder.encode("idLetra", "UTF-8") + "=" + URLEncoder.encode(idLetras, "UTF-8");            
	        //parametros += "&" + URLEncoder.encode("idSom", "UTF-8") + "=";            
	        parametros += "&" + URLEncoder.encode("Enviar", "UTF-8") + "=" + URLEncoder.encode("Consultar", "UTF-8");            
	        
	        conn.setDoOutput(true);
            conn.setDoInput(true);    
            conn.setInstanceFollowRedirects(false);
            conn.setRequestMethod("POST");
            
            //cookie = "cookieCaptcha=NTB/MXdqZAiFZsfiE5ZRQDJ7h564PBjvwIHdN9cbEog=";
            
            //seta as propriedades de request
            conn.setRequestProperty("Host", "www.receita.fazenda.gov.br");
            //conn.setRequestProperty("Cookie", URLEncoder.encode(cookie, "UTF-8"));
            conn.setRequestProperty("Cookie", cookie);
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0");
            conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            conn.setRequestProperty("DNT", "1");
            conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
            conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
            conn.setRequestProperty("Accept-Language", "pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3");
            conn.setRequestProperty("Referer", "http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp");
            
            System.out.println(conn.getRequestProperties());
            DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
            wr.writeBytes(parametros);
            wr.flush();           
            
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String s = "";
            String parametroTotal = "";
            
            while (null != ((s = rd.readLine()))) {  
            	System.out.println("0"+s);
            	if(s.contains("Login")){
            		parametroTotal = s;
            	}
            } 
                                   
           for (int i=1; (headerName = conn.getHeaderFieldKey(i))!=null; i++) {
            	System.out.println(headerName + ": " + conn.getHeaderField(i));
            	if(headerName.equals("Set-Cookie"))
            		cookie = conn.getHeaderField(i).split(";")[0] +"; "+ cookie;
           }

           wr.close();
           rd.close();
            
           String login = parametroTotal.split("Login=")[1].split("&")[0];
           String senha = parametroTotal.split("Senha=")[1].split("\"")[0];
           
           System.out.println(login);
           System.out.println(senha);
           
           //começa novo redirecionamento
           ///
           /////
           
           url = new URL("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp");
	        //url = new URL("http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublicaExibir.asp");
	        conn = (HttpURLConnection) url.openConnection();
	     	             	        
	        //cria os parametros	        
	       parametros = URLEncoder.encode("CPF", "UTF-8") + "=" + URLEncoder.encode("01715789377", "UTF-8");
	       parametros += "&" + URLEncoder.encode("Login", "UTF-8") + "=" + URLEncoder.encode(login, "UTF-8");            
	       parametros += "&" + URLEncoder.encode("Senha", "UTF-8") + "=" + URLEncoder.encode(senha, "UTF-8");            
           parametros += "&" + URLEncoder.encode("idLetra", "UTF-8") + "=" + URLEncoder.encode(idLetras, "UTF-8");            

           conn.setDoOutput(true);
           conn.setDoInput(true);    
           conn.setInstanceFollowRedirects(false);
           conn.setRequestMethod("GET");
           
           //seta as propriedades de request
           conn.setRequestProperty("Host", "www.receita.fazenda.gov.br");
           //conn.setRequestProperty("Cookie", URLEncoder.encode(cookie, "UTF-8"));
           conn.setRequestProperty("Cookie", cookie);
           conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0");
           conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
           conn.setRequestProperty("DNT", "1");
           conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
           conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
           conn.setRequestProperty("Accept-Language", "pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3");
           conn.setRequestProperty("Referer", "http://www.receita.fazenda.gov.br/Aplicacoes/ATCTA/CPF/ConsultaPublica.asp");
           
           
           System.out.println(conn.getRequestProperties());
           
           OutputStreamWriter wr2 = new OutputStreamWriter(conn.getOutputStream());
           wr2.write(parametros);
           wr2.flush();           
           
           rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
           
           while (null != ((s = rd.readLine()))) {  
        	   System.out.println(s);
           } 
           
         for (int i=1; (headerName = conn.getHeaderFieldKey(i))!=null; i++) {
            	System.out.println(headerName + ": " + conn.getHeaderField(i));   
           }

		} catch (Exception e) {
			e.printStackTrace();
		}  
	}

pode perceber q ele retorna a mesma pagina com consulta mas com o parametro ConsultaPublica.asp?Error=3

Existe um site que disponibiliza uma api ( biblioteca, .dll) que pode ser usada 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.

Bugs99 , obrigado pela dica!

porque voces nao usam o www.soawebservices.com.br ?