@FabioDaros escreveu:
Galera nao esta retornando os dados append preenchidos. Alguem pode ajudar.
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;public class Main {
private JFrame mainFrame = new JFrame("CNPJ Catcher"); private JFrame popup = new JFrame("Resultado"); private JLabel cnpjLabel = new JLabel("Informe o CNPJ"); private JTextField cnpjTextField = new JTextField(); private JTextField captchaTextField = new JTextField(); private JButton enviarJButton = new JButton("Enviar"); private JButton trocarImagemJButton = new JButton("Trocar imagem"); private String cookie = ""; private String session = ""; public static void main(String[] args) { new Main().initMainFrame(); } public void initMainFrame() { getReceitaSessionData(); GridLayout gl = new GridLayout(3, 2); JFrame jf = new JFrame("CNPJ Catcher"); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setLayout(gl); jf.setSize(400, 250); jf.add(cnpjLabel); cnpjTextField.setSize(20, 100); cnpjTextField.setText("22873389000112"); // remover jf.add(cnpjTextField); final JLabel imageLabel = getCaptchaLabel(); imageLabel.setSize(200, 90); jf.add(imageLabel); jf.add(captchaTextField); /* classe anônima para o evento do btn Enviar */ enviarJButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { popup = new JFrame("Resultado " + new Date()); popup.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); popup.setSize(640, 480); JEditorPane textArea = new JEditorPane(); textArea.setSize(620, 460); //textArea.setContentType("text/html"); textArea.setText(getCleanFields(getData())); JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setSize(620, 460); popup.getContentPane().add(scrollPane, BorderLayout.CENTER); popup.setVisible(true); } }); /* classe anônima para o evento do btn Trocar Imagem */ trocarImagemJButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ImageIcon ii = new ImageIcon(getCnpjCaptcha()); imageLabel.setIcon(ii); } }); jf.add(enviarJButton); jf.add(trocarImagemJButton); jf.setVisible(true); } /** * Retorna uma conexão Http a partir de uma URL * @param url String representando a URL * @return HttpURLConnection */ public HttpURLConnection getHttpUrlConnection(String url) { try { return (HttpURLConnection) new URL(url).openConnection(); } catch (MalformedURLException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } /** * Pega os dados de sessão do site da Receita */ public void getReceitaSessionData() { try { HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp"); http.setRequestProperty("Cookie", "flag=0"); http.setInstanceFollowRedirects(true); http.connect(); Map<String, List<String>> reqMap = http.getHeaderFields(); StringBuilder sb = new StringBuilder(); for(Map.Entry<String, List<String>> e : reqMap.entrySet()) { for(String i : e.getValue()) { sb.append(e.getKey()) .append(": ") .append(i) .append("\n"); if(e.getKey() != null && e.getKey().startsWith("Set-Cookie") && i.contains("SESSION")) { session = i.split(";")[0].trim(); } } } http.disconnect(); } catch(IOException ex) { System.out.println("getReceitaSessionData(): não foi possível conectar"); ex.printStackTrace(); } } /** * Retorna o array de bytes da imagem * @param is * @return byte[] */ public byte[] getImageByteArray(InputStream is) { try { byte[] b1 = new byte[99999]; int b; int i = 0; while((b = is.read()) != -1) { b1[i] = (byte) b; i++; } byte[] b2 = Arrays.copyOf(b1, i); return b2; } catch(IOException ex) { ex.printStackTrace(); return null; } } /** * Retorna o objeto imagem correspondente ao captcha * @return Image */ public Image getCnpjCaptcha() { try { HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image"); http.setRequestProperty("Cookie", session + "; cookieCaptcha=;"); http.connect(); //TODO: remover 1 System.out.println("getCnpjCaptcha(): session enviada para a gerar a imagem: " + session); cookie = getCookieCaptcha(http.getHeaderField("Set-Cookie")); // TODO: remover 2 System.out.println("getCnpjCaptcha(): Set-Cookie: " + http.getHeaderField("Set-Cookie")); System.out.println("\n\n\nHeader: " + getRequestHeaders(http.getHeaderFields())); /* cria a imagem a partir dos bytes da requisição http */ Image img = java.awt.Toolkit.getDefaultToolkit().createImage(getImageByteArray(http.getInputStream())); // TODO remover 1 System.out.println("getCnpjCaptcha(): cookie: " + cookie); http.disconnect(); return img; } catch(Exception ex) { System.out.println("getCnpjCaptcha(): erro ao construir imagem captcha"); ex.printStackTrace(); return null; } } /** * Retorna um JLabel contendo a imagem do captcha * @return JLabel */ public JLabel getCaptchaLabel() { JLabel jl = new JLabel(); Icon icon = new ImageIcon(getCnpjCaptcha()); jl.setIcon(icon); return jl; } /** * Retira par cookie do source * @param src String de origem * @return String contendo o par=valor do cookie */ public String getCookieCaptcha(String src) { // TODO: remover 1 System.out.println("Full-cookie: " + src); String[] parts = src.split(";"); for(String item : parts) { if(item.trim().startsWith("cookieCaptcha")) { return item.trim(); } } return null; } /** * Exemplo do post: * origem=comprovante&cnpj=31456338000186&idLetra=hyhb&idSom=&submit1=Consultar&search_type=cnpj * * Retorna os dados lidos da receita * @return String */ public String getData() { try { HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp"); http.setRequestMethod("POST"); String cookieProperty = "flag=1; " + session + "; " + cookie; http.setRequestProperty("Cookie", cookieProperty); http.setInstanceFollowRedirects(false); http.setDoInput(true); http.setDoOutput(true); http.setUseCaches(false); String params = URLEncoder.encode("origem", "UTF-8") + "=" + URLEncoder.encode("comprovante", "UTF-8") + "&" + URLEncoder.encode("cnpj", "UTF-8") + "=" + URLEncoder.encode(cnpjTextField.getText(), "UTF-8") + "&" + URLEncoder.encode("idLetra", "UTF-8") + "=" + URLEncoder.encode(captchaTextField.getText(), "UTF-8") + "&" + URLEncoder.encode("idSom", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8") + "&" + URLEncoder.encode("submit1", "UTF-8") + "=" + URLEncoder.encode("Consultar", "UTF-8") + "&" + URLEncoder.encode("search_type", "UTF-8") + "=" + URLEncoder.encode("cnpj", "UTF-8"); http.setRequestProperty("Content-Length", "" + Integer.toString(params.getBytes().length)); http.connect(); System.out.println("Method: " + http.getRequestMethod()); DataOutputStream dos = new DataOutputStream(http.getOutputStream()); dos.writeBytes(params); dos.flush(); dos.close(); // TODO: remover 5 System.out.println("getCnpjCaptcha(): Response Cookie: " + http.getHeaderField("Set-Cookie")); System.out.println("getCnpjCaptcha(): Method: " + http.getRequestMethod()); System.out.println("getCnpjCaptcha(): Content: " + http.getContent().toString()); System.out.println("getCnpjCaptcha(): Content Type: " + http.getContentType().toString()); System.out.println("getCnpjCaptcha(): Response Code: " + http.getResponseCode()); BufferedReader br = new BufferedReader(new InputStreamReader(http.getInputStream())); String aux; StringBuilder inputStr = new StringBuilder(); while((aux = br.readLine()) != null) { inputStr.append(aux) .append("\n"); } br.close(); http.disconnect(); return getCnpjData(inputStr.toString()); } catch(Exception ex) { ex.printStackTrace(); return null; } } /** * TODO: remover * * Mostra o header da requisição * @param headerMap * @return String */ public String getRequestHeaders(Map<String, List<String>> headerMap) { StringBuilder sb = new StringBuilder(); for(Map.Entry<String, List<String>> e : headerMap.entrySet()) { for(String i : e.getValue()) { sb.append(e.getKey()) .append(": ") .append(i) .append("\n"); } } return sb.toString(); } /** * Recebe o link de redirecionamento e busca os dados da empresa * @param source * @return String */ public String getCnpjData(String source) { try { source = source.substring(source.indexOf("\"") + 1, source.lastIndexOf("\"")); HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/" + source.replaceAll("&", "&")); http.setDoInput(true); http.setDoOutput(true); http.setInstanceFollowRedirects(true); http.setRequestProperty("Cookie", "flag=1; " + cookie + "; " + session); http.connect(); BufferedReader br = new BufferedReader(new InputStreamReader(http.getInputStream(), Charset.forName("ISO-8859-1"))); String aux; StringBuilder inputStr = new StringBuilder(); while((aux = br.readLine()) != null) { inputStr.append(aux) .append("\n"); } br.close(); http.disconnect(); return inputStr.toString(); } catch(IOException ex) { ex.printStackTrace(); } return source; } /** * Retorna os campos que serão utilizados * @param data * @return */ public String getCleanFields(String data) { DataFilter df = new DataFilter(data); StringBuilder out = new StringBuilder(); String header = ""; header = "NOME EMPRESARIAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "NÚMERO DE INSCRIÇÃO"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "COMPROVANTE DE INSCRIÇÃO E DE SITUAÇÃO CADASTRAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "CÓDIGO E DESCRIÇÃO DAS ATIVIDADES ECONÔMICAS SECUNDÁRIAS"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "CÓDIGO E DESCRIÇÃO DA NATUREZA JURÍDICA"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "LOGRADOURO"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "NÚMERO"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "COMPLEMENTO"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "CEP"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "BAIRRO/DISTRITO"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "UF"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "SITUAÇÃO CADASTRAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "DATA DA SITUAÇÃO CADASTRAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "MOTIVO DE SITUAÇÃO CADASTRAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); header = "DATA DA SITUAÇÃO ESPECIAL"; out.append(header + "\t") .append(": ") .append(df.getInfo(header)) .append("\n"); return out.toString(); }
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/**
* Filtra os dados retornados pela receita
* @author jaumzera
*
*/
public class DataFilter {private String data; /** * Construtor * @param data String contendo os dados */ public DataFilter(String data) { try { this.data = data; clearData(); } catch(Exception ex) { this.data = ""; } } /** * Limpa as partes do HTML que não serão utilizados */ private void clearData() { data = data.substring(data.indexOf("<!-- Início Cabeçalho"), data.indexOf("Fim da tabela principal -->")); data = data.replaceAll("\n+|[\\s\\t]+", " ") .replaceAll("<!--.+?-->", ""); /* gambi_mode: on; * Substitui uma das palavras "Número" para evitar conflitos */ data = data.replaceAll("NÚMERO DE INSCRIÇÃO", "CNPJ"); } /** * Retorna a informação de acordo com o cabeçalho * @param header cabeçalho * @return String contendo a informação solicitada ou "" */ public String getInfo(String header) { try { int ini = data.indexOf(header) + header.length(); String info = data.substring(ini, data.indexOf("</td>", ini)); return info.replaceAll("<.+?>|[\t\n]+|[\\s]{2,}", " ").trim(); } catch(Exception ex) { return "*"; } } /** * Main para testes * @param args * @throws IOException */ public void main(String[] args) throws IOException { /* abre um arquivo local com os mesmos dados que a Receita retorna */ FileReader fr = new FileReader("C:\\Users\\Fabio\\Documents\\comprovante.html"); BufferedReader br = new BufferedReader(fr); String aux; StringBuilder sb = new StringBuilder(); while((aux = br.readLine()) != null) { sb.append(aux).append("\n"); } String html = sb.substring(sb.indexOf("<!-- Início Cabeçalho"), sb.indexOf("Fim da tabela principal -->")); html = html.replaceAll("\n+|[\\s\\t]+", " ") .replaceAll("<!--.+?-->", ""); String header = "NOME EMPRESARIAL"; int ini = html.indexOf(header) + header.length(); String info = html.substring(ini, html.indexOf("</td>", ini)); System.out.println(info.replaceAll("<.+?>|[\t\n]+|[\\s]{2,}", "").trim()); header = "TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)"; ini = html.indexOf(header) + header.length(); info = html.substring(ini, html.indexOf("</td>", ini)); System.out.println(info.replaceAll("<.+?>|[\t\n]+|[\\s]{2,}", " ").trim()); }
}
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class CnpjCatcher {
/* cookie de sessão do site da receita.fazenda.gov.br */ private String sessionId; /* cookie do captcha da imagem da receita.fazenda.gov.br */ private String cookieCaptcha; /* classe que filtra os dados retornados por receita.fazenda.gov.br */ private DataFilter dataFilter; /** * Construtor */ public CnpjCatcher() { /* carrega os dados de sessão da receita.fazenda.gov.br */ loadReceitaSessionData(); } /** * Retira par cookie do source * @param src String de origem * @return String contendo o par=valor do cookie */ private String getCookieCaptcha(String src) { String[] parts = src.split(";"); for(String item : parts) { if(item.trim().startsWith("cookieCaptcha")) { return item.trim(); } } return null; } /** * Retorna o array de bytes da imagem * @param is * @return byte[] */ private byte[] getImageByteArray(InputStream is) { try { byte[] b1 = new byte[99999]; int b; int i = 0; while((b = is.read()) != -1) { b1[i] = (byte) b; i++; } byte[] b2 = Arrays.copyOf(b1, i); return b2; } catch(IOException ex) { ex.printStackTrace(); return null; } } /** * Retorna uma conexão Http a partir de uma URL * @param url String representando a URL * @return HttpURLConnection */ private HttpURLConnection getHttpUrlConnection(String url) { try { return (HttpURLConnection) new URL(url).openConnection(); } catch (MalformedURLException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } /** * Pega os dados de sessão do site da Receita * @return String contendo o cookie correspondente ao session * gerado pelo site receita.fazenda.gov.br */ private void loadReceitaSessionData() { try { HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp"); http.setRequestProperty("Cookie", "flag=0"); http.setInstanceFollowRedirects(true); http.connect(); Map<String, List<String>> reqMap = http.getHeaderFields(); StringBuilder sb = new StringBuilder(); for(Map.Entry<String, List<String>> e : reqMap.entrySet()) { for(String i : e.getValue()) { if(e.getKey() != null && e.getKey().startsWith("Set-Cookie") && i.contains("SESSION")) { sessionId = i.split(";")[0].trim(); } } } http.disconnect(); } catch(IOException ex) { ex.printStackTrace(); } } /** * Retorna o array de bytes correspondente à imagem captcha * do site receita.fazenda.gov.br e armazena o cookie enviado * na variável cookieCaptcha * * @return byte[] correspondente à imagem */ public byte[] getCaptchaImageBytes() { if(sessionId == null) { throw new RuntimeException("Não há id de sessão"); } try { HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image"); http.setRequestProperty("Cookie", sessionId + "; cookieCaptcha=;"); http.connect(); cookieCaptcha = getCookieCaptcha(http.getHeaderField("Set-Cookie")); byte[] imageByteArray = getImageByteArray(http.getInputStream()); http.disconnect(); return imageByteArray; } catch(IOException ex) { ex.printStackTrace(); return null; } } /** * Exemplo do post: * origem=comprovante&cnpj=31456338000186&idLetra=hyhb&idSom=&submit1=Consultar&search_type=cnpj * * Retorna os dados lidos da receita * @return String */ public void postData(String captcha, String cnpj) { try { /* conecta e configura o header HTTP */ HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp"); http.setRequestMethod("POST"); String cookieProperty = "flag=1; " + sessionId + "; " + cookieCaptcha; http.setRequestProperty("Cookie", cookieProperty); http.setInstanceFollowRedirects(false); http.setDoInput(true); http.setDoOutput(true); http.setUseCaches(false); String params = URLEncoder.encode("origem", "UTF-8") + "=" + URLEncoder.encode("comprovante", "UTF-8") + "&" + URLEncoder.encode("cnpj", "UTF-8") + "=" + URLEncoder.encode(cnpj, "UTF-8") + "&" + URLEncoder.encode("idLetra", "UTF-8") + "=" + URLEncoder.encode(captcha, "UTF-8") + "&" + URLEncoder.encode("idSom", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8") + "&" + URLEncoder.encode("submit1", "UTF-8") + "=" + URLEncoder.encode("Consultar", "UTF-8") + "&" + URLEncoder.encode("search_type", "UTF-8") + "=" + URLEncoder.encode("cnpj", "UTF-8"); http.setRequestProperty("Content-Length", "" + Integer.toString(params.getBytes().length)); http.connect(); /* faz o POST */ DataOutputStream dos = new DataOutputStream(http.getOutputStream()); dos.writeBytes(params); dos.flush(); dos.close(); /* recebe os dados e armazena em um StringBuffer a página retornada */ /* NOTE: a página retornada, neste caso, é uma página de redirecionamento que * o HttpURLConnection não consegue seguir por si só. O método getCnpjData * retira a URL retornada dessa página e faz uma outra requisição ao servidor * receita.fazenda.gov.br para então ter acesso ao cartão de informações do * CNPJ especificado */ BufferedReader br = new BufferedReader(new InputStreamReader(http.getInputStream())); String aux; StringBuilder inputStr = new StringBuilder(); while((aux = br.readLine()) != null) { inputStr.append(aux).append("\n"); } br.close(); http.disconnect(); dataFilter = new DataFilter(getCnpjData(inputStr.toString())); } catch(Exception ex) { ex.printStackTrace(); throw new RuntimeException("A requisição retornou um erro: " + ex.getMessage()); } } /** * Recebe a página com o link de redirecionamento e busca os dados da empresa * @param source * @return String */ public String getCnpjData(String source) { try { /* Retira somente a URL do endereço href="..." */ source = source.substring(source.indexOf("\"") + 1, source.lastIndexOf("\"")); HttpURLConnection http = getHttpUrlConnection("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/" + source.replaceAll("&", "&")); http.setDoInput(true); http.setDoOutput(true); http.setInstanceFollowRedirects(true); http.setRequestProperty("Cookie", "flag=1; " + cookieCaptcha + "; " + sessionId); http.connect(); BufferedReader br = new BufferedReader(new InputStreamReader(http.getInputStream(), Charset.forName("ISO-8859-1"))); String aux; StringBuilder inputStr = new StringBuilder(); while((aux = br.readLine()) != null) { inputStr.append(aux) .append("\n"); } br.close(); http.disconnect(); return inputStr.toString(); } catch(IOException ex) { ex.printStackTrace(); } return source; } /** * Retorna um Map com os campos retornados pelo site receita.fazenda.gov.br * no formato: {nomeDoCampo=valor}. * * @param fieldList lista de campos que serão consultados * @return Map<String, String> contendo os valores associados à lista * especificada */ public Map<String, String> getCnpjDataMap(List<String> fieldList) { if(dataFilter == null) { throw new RuntimeException("Não existem dados no filtro"); } Map<String, String> resultMap = new HashMap<String, String>(); for(String item : fieldList) { resultMap.put(item, dataFilter.getInfo(item)); } return resultMap; }
}
Mensagens: 1
Participantes: 1