Capturando Captcha HTTP GET/RESPONSE (Valores Diferentes)

Olá Pessoal, estou com um problema… preciso acessar o site do Denatran e retornar os dados de uma determinada pessoa, ate ae tudo bem, consigo o codigo da pagina e passar os parametros (que são CPF, RENAVAN e o captcha)… Mas o problema é que a imagem do captcha que meu codigo baixa não é o mesmo que é gereado pelo site do Denatran e dae não passa na validação…
se alguem puder me dar uma ajuda… abaixo tem o codigo que estou utilizando…

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import com.DeathByCaptcha.DeCaptcha;
import com.kontato.allcheck.app.robot.acia.RobotUtil;
import com.kontato.allcheck.util.RegularExp;
import com.technique.engine.app.SystemParameter;
import com.technique.engine.util.ExceptionWarning;
import com.technique.engine.util.TechCommonKeys;

public class Denatran {
	private String cookie = "";

	@SuppressWarnings("deprecation")
	private String doGet() {
		try {
	        DefaultHttpClient httpclient = new DefaultHttpClient();

	        HttpGet httpget1 = new HttpGet("http://denatran.serpro.gov.br/Veiculo_Consulta.asp");
		
	        setHeader(httpget1);

	        HttpResponse response = httpclient.execute(httpget1);
	        HttpEntity entity = response.getEntity();

	        
	        String content = EntityUtils.toString(entity);
	        
	        System.out.println("Login form get: " + response.getStatusLine());
	        if (entity != null) {
	            entity.consumeContent();
	        }
	        
//	        System.out.println("Initial set of cookies:");
	        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
	        if (cookies.isEmpty()) {
	            System.out.println("None");
	        } else {
	            for (int i = 0; i < cookies.size(); i++) {
//	                System.out.println("- " + cookies.get(i).toString());
	                cookie += cookies.get(i).getName() + "=" + cookies.get(i).getValue() + ";";
	            }
	        }

			return content;

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

	private void setHeader(HttpPost httpPost1) {
		httpPost1.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
		httpPost1.setHeader("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.3");
		httpPost1.setHeader("Accept-Encoding","gzip,deflate,sdch");
		httpPost1.setHeader("Accept-Language","pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4");
		httpPost1.setHeader("Cache-Control","max-age=0");
		httpPost1.setHeader("Connection","keep-alive");
//		httpPost1.setHeader("Content-length","2055"); 
		httpPost1.setHeader("Content-Type","application/x-www-form-urlencoded");
		httpPost1.setHeader("Cookie",cookie);
//		httpPost1.setHeader("Host", "www.receita.fazenda.gov.br");
//		httpPost1.setHeader("Origin","http://www.receita.fazenda.gov.br");
//		httpPost1.setHeader("Referer","http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/ConsultaPublica.asp");
		httpPost1.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11");
	}

	private void setHeader(HttpGet httpget1) {
		httpget1.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
		httpget1.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
		httpget1.setHeader("Accept-Encoding", "gzip,deflate,sdch");
		httpget1.setHeader("Accept-Language", "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4");
		httpget1.setHeader("Cache-Control", "max-age=0");
		httpget1.setHeader("Connection", "keep-alive");
		httpget1.setHeader("Host", "denatran.serpro.gov.br");
		httpget1.setHeader("Referer", "http://denatran.serpro.gov.br/includes/menu_cidadao.html");
		httpget1.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11");
	}

	@SuppressWarnings("deprecation")
	private String consultarCPF(Map<String, String> form) {
		try {
	        HttpPost httpPost = new HttpPost("http://denatran.serpro.gov.br/Veiculo_Consulta_Result.asp");

	        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
	        nvps.add(new BasicNameValuePair("txtCaptcha", form.get("txtCaptcha") ));
	        nvps.add(new BasicNameValuePair("txtCPFCNPJ", form.get("txtCPFCNPJ") ));
	        nvps.add(new BasicNameValuePair("txtCodRenavam", form.get("txtCodRenavam") ));
	        nvps.add(new BasicNameValuePair("hdnMsg", "" ));
	        nvps.add(new BasicNameValuePair("hdnIntRC", "" ));

	        httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

	        setHeader(httpPost);
	        
	        DefaultHttpClient httpclient = new DefaultHttpClient();
	        HttpResponse response = httpclient.execute(httpPost);
	        HttpEntity entity = response.getEntity();

	        String content = EntityUtils.toString(entity);
	        
//	        System.out.println("Login form get: " + response.getStatusLine());
	        if (entity != null) {
	            entity.consumeContent();
	        }

	        /*
	        System.out.println("Post logon cookies:");
	        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
	        if (cookies.isEmpty()) {
	            System.out.println("None");
	        } else {
	            for (int i = 0; i < cookies.size(); i++) {
	                System.out.println("- " + cookies.get(i).toString());
	            }
	        }
	        */

			return content;

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

		return "";
	}

	private String getImagemCaptcha(String pagina) {
//		Pattern pat1 = Pattern.compile("<!-- Início AntiRobo-->.*?<!-- Fim AntiRobo-->", Pattern.CASE_INSENSITIVE + Pattern.DOTALL);
//		Pattern pat2 = Pattern.compile("guid=.*?'", Pattern.CASE_INSENSITIVE + Pattern.DOTALL);
		
//		String p = RegularExp.get( pat1, pagina );
//		if( p == null ) p = pagina;
		
//		p = RegularExp.get( pat2, p );
//		if( p == null ) p = "";

//		p = p.replaceAll("'", "").trim(); 
		String p = "http://denatran.serpro.gov.br/includes/captcha/captcha.asp";

		return p;
	}

	// ------------------------------------------------------------------------------------------------------------------------------
	// ------------------------------------------------------------------------------------------------------------------------------
	// ------------------------------------------------------------------------------------------------------------------------------

	private String download( String url ) throws ExceptionWarning {
		String path = SystemParameter.get("allcheck_produtos", TechCommonKeys.TAG_SYSTEM_PROPERTIES, TechCommonKeys.SYSTEM_ROOT_PATH ) + "allcheck_produtos/captcha/" ;
		String output = path + "captcha-" + System.currentTimeMillis() + ".jpg";

		try {
			URL server = new URL(url);
			HttpURLConnection connection = (HttpURLConnection)server.openConnection();
			connection.setRequestMethod("GET");
			connection.setDoInput(true);
			connection.setDoOutput(true);
			connection.setUseCaches(false);
			connection.addRequestProperty("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-shockwave-flash, */*");
			connection.addRequestProperty("Accept-Language", "en-us,zh-cn;q=0.5");
			connection.addRequestProperty("Accept-Encoding", "gzip, deflate");
			connection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 2.0.50727; MS-RTC LM 8)");
			connection.addRequestProperty("Host","denatran.serpro.gov.br");
			connection.addRequestProperty("Referer","http://denatran.serpro.gov.br/Veiculo_Consulta.asp");
			connection.addRequestProperty("Cookie", cookie);
			connection.connect();
			InputStream is = connection.getInputStream();		
			OutputStream os = new FileOutputStream(output);
			
			byte[] buffer = new byte[1024];		
			int byteReaded = is.read(buffer);
			while(byteReaded != -1) {
				os.write(buffer,0,byteReaded);
				byteReaded = is.read(buffer);
			}
			
			os.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return output;
	}

	private String limparTela(String pagina) {
		Pattern patMiolo = Pattern.compile("<table style=\"width: 540px;\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">.*?</table>", Pattern.CASE_INSENSITIVE + Pattern.DOTALL);

		String p = RegularExp.get( patMiolo, pagina );
		if( p == null ) p = pagina;
		
		return p;
	}

	public String processar( String renavam, String cpf ) {
		try {
			Denatran obj = new Denatran();
			String pagina = obj.doGet();
			String imagem = obj.getImagemCaptcha(pagina);
			
			String path = obj.download(imagem);
			String captcha = DeCaptcha.decode(path);
			captcha = captcha.replaceAll(" ", "").trim();
			
			Map<String, String> form = RobotUtil.tratarForm(pagina, "");
			form.put("txtCodRenavam", renavam);
			form.put("txtCPFCNPJ", cpf);
			form.put("txtCaptcha", captcha);
			
			pagina = obj.consultarCPF( form ); 
			pagina = obj.limparTela( pagina );
			
			if( !pagina.toLowerCase().contains("dados do veículo") ) {
				System.out.println( pagina );
				throw new Exception("Padrão inválido");
//			} else {
//				String[] campos = tratarResposta(pagina);
//				CadastroUnicoEntity cu = new CadastroUnicoEntity(); 
//				cu.atualizarDados( campos );				
			}
			
			return pagina;
		} catch (Exception e) {
			e.printStackTrace();
			
			return "Site do Detran indisponível, por favor, tente novamente";
		}
	}
}

Olá eliezerafael, estou precisando de uma solução parecida com a sua, no entanto eu não disponho das libs utilizadas por vc para resolver o problema do captcha.
No meu caso, poderia até mesmo envolver a ação manual de uma pessoa para digitar o captcha e então acessar a página seguinte… vc poderia me ajudar?

Boa tarde WVanelli, a lib que utilizei foi o HTTPClient para fazer o acesso via GET ou POST e baixar as informações da pagina…

Grato pela pronta resposta, eliezerafael !
Mas eu estava me referindo às libs de código fonte privado (DeathByCaptcha, RobotUtil, etc).
Sem elas eu não consigo rodar o seu trecho de código.

E como a empresa onde trabalho não pretende comprar este tipo de solução, e sim desenvolver uma solução interna… eu estou tentando implementar uma página onde o usuário digite os comandos solicitados pelo captcha (ou seja, com a quebra manual do captcha) da página - ‘http://consulta.tesouro.fazenda.gov.br/transferencias_voluntarias_novosite/index.asp’ -> item II - e em seguida consiga capturar os dados que serão mostrados na página posterior.

Abraços.

eliezerafael você conseguiu resolver o problema? Estou com o mesmo problema que você. Se puder ajudar agradeço.

Não quero ser chato cara… mas o captcha justamente foi feito para barrar pesquisas por “maquina” e garantir que é uma pessoa que esta buscando os dados…

acho que dificilmente vocês vão conseguir…

Cara, acho que tem sim uma saída, fiz alguns testes capturando o link do captcha e solicitando o usuário que digitasse o código, assim o usuário não iria precisar digitar todos os dados do formulário, apenas o código que aparecesse para ele. Estou tentando agora com primefaces e JSF, criei um formulário para receber a imagem, porém ainda estou com alguns erros…