none
[Resolvido] Ajuda a Consultar CNPJ no site http://www.receita.fazenda.gov.br/ usando WebClient

    Question

  • Amigos boa noite estou tentando executar uma consulta de cnpj no site da sefaz. eu consigo fazer em delphi porem estou a algumas semanas estudando c# e gostaria de replicar esta consulta no c# abaixo vo posta o meu código de como estou fazendo

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Windows.Forms;
    
    namespace LeituraWeb
    {
        public partial class Form1 : Form
        {
    
            String viewState;
            public String Dominio_ReceitaFederal = "http://www.receita.fazenda.gov.br/";
            public String GetData_ReceitaFederal = "pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp";
            public String PostData_ReceitaFederal = "pessoajuridica/cnpj/cnpjreva/valida.asp";
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnGo_Click(object sender, EventArgs e)
            {
    
                int PosString;
                String StrViewState = "<input type=hidden id=viewstate name=viewstate value='";
                String StrImagemCaptcha = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti robô' src='";
                String UrlImagemCaptcha = "";
                String HtmlResult = "";
    
                using (WebClient wc = new WebClient()){
                    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                    HtmlResult = wc.DownloadString(Dominio_ReceitaFederal + GetData_ReceitaFederal);
                }
    
                if (HtmlResult.Length > 0)
                {
                    viewState = HtmlResult;
    
                    // executando um crop do viewstate para utilizar no post
                    PosString = viewState.IndexOf(StrViewState);
                    viewState = viewState.Substring(PosString + StrViewState.Length);
                    PosString = viewState.IndexOf("'>");
                    viewState = viewState.Substring(0, PosString);
    
                    //executando um crop na url da imagem 
                    UrlImagemCaptcha = HtmlResult;
                    PosString = UrlImagemCaptcha.IndexOf(StrImagemCaptcha);
                    UrlImagemCaptcha = UrlImagemCaptcha.Substring(PosString + StrImagemCaptcha.Length);
                    PosString = UrlImagemCaptcha.IndexOf("'>");
                    UrlImagemCaptcha = UrlImagemCaptcha.Substring(0, PosString);
                    UrlImagemCaptcha = UrlImagemCaptcha.Replace("amp;", "");                
    
                    // populando a imagem do captcha dentro de um picturebox
                    if (UrlImagemCaptcha.Length > 0)
                        pictureBox1.Image = new System.Drawing.Bitmap(new System.IO.MemoryStream(new System.Net.WebClient().DownloadData(Dominio_ReceitaFederal + UrlImagemCaptcha)));
                }
                else
                {
                    viewState = "";
                }
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                WebRequest request = WebRequest.Create(Dominio_ReceitaFederal + PostData_ReceitaFederal);
    
                // Formatando o ViewState Recebido
                string fviewstate = viewState;
                fviewstate = System.Uri.EscapeDataString(System.Uri.UnescapeDataString(fviewstate));
    
                // inserindo os campos a serem postados
                string postData = "";
                postData = postData + "origem=comprovante&";
                postData = postData + "viewstate=" + fviewstate + "&";
                postData = postData + "cnpj=00000000000000&";
                postData = postData + "captcha=000000&";
                postData = postData + "captchaAudio=&";
                postData = postData + "submit1=Consultar&";
                postData = postData + "search_type=cnpj";
    
                // montando a requisicao
    
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);           
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = byteArray.Length;
    
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();
    
                WebResponse response = request.GetResponse();           
                dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string responseFromServer = reader.ReadToEnd();
    
                // ---------- erro aqui !!!
                // retorno da sefaz ---- sempre retorna -- Parametros Inválidos
                Console.WriteLine(responseFromServer);
    
                reader.Close();
                dataStream.Close();
                response.Close();
            }
    
        }
    }


    a minha tecnica é a seguinte Abrir um WebClient e recuperar a url da imagem e seu viewstate depois postar o viewstate, os campos de consulta, o resultado do captcha porem acho que o problema esta na codificação do request para o url de validação alguem ai consegue me ajudar?? no exemplo estou usando winforms para poder facilitar.


    Sunday, July 21, 2013 11:02 PM

Answers

  • Olha testando aqui também percebi que existia um timeout e vi que ela é dada por um erro na classe HttpWebRequest porem tem um jeito de faze-la rodar direitinho usando threads

    fiz um refactory na classe para faze-la funcionar

    A Minha Classe agora esta assim

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace LeituraWeb
    {
        public class ConsultaCnpjReceita
        {
            private String _erro;
            private CookieContainer cookieContainer = new CookieContainer();
            private String UrlDominio = "http://www.receita.fazenda.gov.br";
            private String UrlBase = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/";
            private String UrlGet = "cnpjreva_solicitacao2.asp";
            private String UrlPost = "Valida.asp";
            private String viewState;
            private String RetornoHtml = "";
            public String ErroDetectado { get{ return _erro;} }
    
            #region Recupera a Imagem do Captcha
            /// <summary>
            /// Chamada inicial da classe, resposável por popular a imagem e criar os cookies em memória
            /// para serem confrontados no ato do post de validação
            /// </summary>
            /// <returns></returns>
            public Bitmap RecuperaCaptcha(){
                String HtmlResponse;            
                _erro = null;            
                int PosString;
                String StrViewState = "<input type=hidden id=viewstate name=viewstate value='";
                String StrImagemCaptcha = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti rob";
                String UrlImagemCaptcha = "";
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UrlBase + UrlGet);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "GET";
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.Timeout = 20000;
                try{
                    StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                    HtmlResponse = stHtml.ReadToEnd();
                    stHtml.Close();
                    viewState = HtmlResponse;
                    PosString = viewState.IndexOf(StrViewState);
                    if (PosString >= 0)
                        viewState = viewState.Substring(PosString + StrViewState.Length);
                    PosString = viewState.IndexOf("'>");
                    if (PosString >= 0)
                        viewState = viewState.Substring(0, PosString);
                    UrlImagemCaptcha = HtmlResponse;
                    PosString = UrlImagemCaptcha.IndexOf(StrImagemCaptcha);
                    if (PosString >= 0)
                        UrlImagemCaptcha = UrlImagemCaptcha.Substring(PosString + 8 + StrImagemCaptcha.Length);
                    PosString = UrlImagemCaptcha.IndexOf("'>");
                    if (PosString >= 0)
                        UrlImagemCaptcha = UrlImagemCaptcha.Substring(0, PosString);
                    UrlImagemCaptcha = UrlImagemCaptcha.Replace("amp;", "");
                } catch (Exception ex) {
                    _erro = ex.Message;
                }                       
                try{
                    if (UrlImagemCaptcha.Length > 0)
                        return new System.Drawing.Bitmap(new System.IO.MemoryStream(new System.Net.WebClient().DownloadData(UrlDominio + UrlImagemCaptcha)));
                    else
                        return null;
                }
                catch (Exception ex){
                    _erro = ex.Message;
                    return null;
                }
            }
            #endregion
    
            #region Consulta os Dados na Sefaz
            /// <summary>
            /// Consulta a Secretaria da Fazenda os Dados enviados para retornar o Cartão com os Dados do CNPJ
            /// </summary>
            /// <param name="cnpj"></param>
            /// <param name="captcha"></param>
            public void Consulta(string cnpj, string captcha){
                _erro = null;
                if (cnpj.Length == 0)
                    _erro = "CNPJ não informado";
                else if (captcha.Length == 0)
                    _erro = "Imagem de Validação não informado";            
                if (_erro == null) {                         
                    // Montando a Lista de Parametros para o post
                    var parametros = "origem=comprovante&" +
                                     "viewstate=" + System.Uri.EscapeDataString(viewState) + "&" +
                                     "cnpj=" + System.Uri.EscapeDataString(cnpj) + "&" +
                                     "captcha=" + System.Uri.EscapeDataString(captcha) + "&" +
                                     "captchaAudio=&" +
                                     "submit1=Consultar&" +
                                     "search_type=cnpj";
                    try{
                        MyHttpPost(parametros);
                    }
                    catch (Exception ex){
                        _erro = "Ocorreu uma excessão ao consultar o site da Receita Federal\n\n" + ex.Message;
                    }
                }
            }
            #endregion
    
            #region Retorno em Formato Html
            /// <summary>
            /// Retorno em Html da Requisição enviada a Sefaz
            /// </summary>
            /// <returns></returns>
            public string RetornoEmHtml(){
                return RetornoHtml;
            }
            #endregion
    
            #region Execução do Post com os parametros preenchidos
            private void MyHttpPost(String parametros){
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UrlBase + UrlPost);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "POST";
                httpWebRequest.Timeout = 20000;
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.ContentLength = parametros.Length;
                try{
                    StreamWriter stParametros = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("ISO-8859-1"));
                    stParametros.Write(parametros);
                    stParametros.Close();
                    HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                    // Encaminha para o autoredirecionamento
                    if (response.StatusCode == HttpStatusCode.Found){
                        string redirUrl = response.Headers["Location"];
                        MyHttpGet(redirUrl);
                    }
                    // Encaminha o Retorno do Html com Erro de Validação
                    if (response.StatusCode == HttpStatusCode.OK){
                        StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                        MontaRetorno(stHtml.ReadToEnd());
                        stHtml.Close();
                    }
                    response.Close();
                }
                catch (Exception ex) {
                    _erro = ex.Message;
                }
            }
            #endregion
    
            #region AutoRedirecionamento planejado
            private void MyHttpGet(String url){
                if (!url.Contains("http")){
                    url = UrlBase + url;
                }
                try{
                    HttpWebRequest httpWebRequestGet = (HttpWebRequest)WebRequest.Create(url);
                    httpWebRequestGet.CookieContainer = cookieContainer;
                    httpWebRequestGet.ContentType = "application/x-www-form-urlencoded";
                    httpWebRequestGet.Method = WebRequestMethods.Http.Get;
                    httpWebRequestGet.AllowAutoRedirect = false;
                    var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, httpWebRequestGet.BetterEndGetResponse, this).ContinueWith(asyncResult =>
                    {
                        var response = asyncResult.Result as HttpWebResponse;
                        string redirUrl = response.Headers["Location"];
                        if (response.StatusCode == HttpStatusCode.Found){
                            MyHttpGet(redirUrl);
                        } else{
                            if (response.StatusCode == HttpStatusCode.OK){
                                StreamReader stHtml = new StreamReader(httpWebRequestGet.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                                MontaRetorno(stHtml.ReadToEnd());
                                stHtml.Close();
                            }
                        }
                        response.Close();
                    });
                }
                catch (Exception ex) {
                    _erro = ex.Message;
                }
            }
            #endregion
    
            private void MontaRetorno(String response){
                if (response.Contains("Erro na Consulta")){
                    _erro = "A imagem de validação se encontra incorreta. Verifique e tente novamente.";
                }
                RetornoHtml = response;
            }
    
            /*internal void PreencheFicha(CadastroCNPJ cad)
            {
                if (RetornoHtml.Length > 0) {
                    if (RetornoHtml.Contains("Erro na Consulta")) {
                        throw new Exception("A imagem de validação se encontra incorreta. Verifique e tente novamente.");
                    }
                }
                if (RetornoHtml.Length == 0) {
                    throw new Exception("Não foi possível recuperar um retorno da Secretaria da Fazenda. Verifique e tente novamente.");
                }
            }*/
        }
    
        #region WebRequestExtensions
        public static class WebRequestExtensions
        {
            public static WebResponse BetterEndGetResponse(this WebRequest request, IAsyncResult asyncResult)
            {
                try{
                    return request.EndGetResponse(asyncResult);
                }
                catch (WebException wex){
                    if (wex.Response != null){
                        return wex.Response;
                    }
                    throw;
                }
            }
    
            public static WebResponse BetterGetResponse(this WebRequest request)
            {
                try{
                    return request.GetResponse();
                }
                catch (WebException wex){
                    if (wex.Response != null){
                        return wex.Response;
                    }
                    throw;
                }
            }
        }
        #endregion
    
    }

    A Chamada dela eu faço desta forma

            #region BOTAO CONSULTA DE DADOS
            private void button2_Click(object sender, EventArgs e){
                Cursor cursor;
                cursor = this.Cursor;           
    
                try{
                    this.Cursor = Cursors.WaitCursor;
                    ConsultaCnpj.Consulta(edCNPJ.Text, edCAPTCHA.Text);                
                }
                catch (Exception ex){
                    MessageBox.Show(ex.Message);
                }
                if (ConsultaCnpj.ErroDetectado != null){
                    MessageBox.Show(ConsultaCnpj.ErroDetectado);
                } else {
                    try{
                        memoEdit2.Text = ConsultaCnpj.RetornoEmHtml();
                    }
                    catch (Exception ex){
                        MessageBox.Show(ex.Message);
                    }
                }
                this.Cursor = cursor;
            }
            #endregion
    
            #region BOTAO RECUPERA IMAGEM
            private void button1_Click(object sender, EventArgs e){
                edCAPTCHA.Text = "";
                Cursor cursor;
                cursor = this.Cursor;           
                this.Cursor = Cursors.WaitCursor;
                Bitmap bit = ConsultaCnpj.RecuperaCaptcha();
                if (bit != null)
                    pictureBox1.Image = bit;            
                else 
                    MessageBox.Show("Não foi possível recuperar a imagem de validação do site da Receita Federal");
                this.Cursor = cursor;
            }
            #endregion

    e com isso não tive mais problema algum com a consulta

    a solução esta na extensão da classe httpwebrequest onde agora requisita por thread



    Sunday, July 28, 2013 6:33 PM

All replies

  • Para todos que querem o código e nunca conseguiram fazer funcionar ta ai o exemplo totalmente funcional de como transpor os redirects e acessar o html do comprovante, agora é só dar um crop no html dos campos e encaminhar para a entidade


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Windows.Forms;
    using Microsoft.VisualBasic;
    
    namespace LeituraWeb
    {
        public partial class Form1 : Form
        {
            
            CookieContainer cookieContainer = new CookieContainer();
            
    
            String UrlDominio = "http://www.receita.fazenda.gov.br";
            String UrlBase = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/";
            String UrlGet = "cnpjreva_solicitacao2.asp";
            String UrlPost = "Valida.asp";
                            
            public Form1(){
                InitializeComponent();
            }
    
    
            private void button1_Click(object sender, EventArgs e)
            {
                String viewState;
                String HtmlResponse;
    
                int PosString;
                String StrViewState     = "<input type=hidden id=viewstate name=viewstate value='";
                String StrImagemCaptcha = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti rob";
                String UrlImagemCaptcha = "";
    
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( UrlBase + UrlGet );
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "GET";
                httpWebRequest.AllowAutoRedirect = false;
    
                StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                HtmlResponse = stHtml.ReadToEnd();
                stHtml.Close();
    
                viewState = HtmlResponse;                        
                PosString = viewState.IndexOf(StrViewState);
                viewState = viewState.Substring(PosString + StrViewState.Length);
                PosString = viewState.IndexOf("'>");
                viewState = viewState.Substring(0, PosString);
                
                UrlImagemCaptcha = HtmlResponse;
                PosString = UrlImagemCaptcha.IndexOf(StrImagemCaptcha);
                UrlImagemCaptcha = UrlImagemCaptcha.Substring(PosString + 8 + StrImagemCaptcha.Length);
                PosString = UrlImagemCaptcha.IndexOf("'>");
                UrlImagemCaptcha = UrlImagemCaptcha.Substring(0, PosString);
                UrlImagemCaptcha = UrlImagemCaptcha.Replace("amp;", "");
    
                if (UrlImagemCaptcha.Length > 0)
                    pictureBox1.Image = new System.Drawing.Bitmap(new System.IO.MemoryStream(new System.Net.WebClient().DownloadData(UrlDominio + UrlImagemCaptcha)));
    
                // Usando a referencia Microsoft.VisualBasic para gerar o inputDialog 
                var captcha = Interaction.InputBox("Imagem do Captcha?", "Imagem do Captcha?", "");
                var cnpj = Interaction.InputBox("Número do CNPJ?", "Número do CNPJ?", "");
    
                // Montando a Lista de Parametros para o post
                var parametros = "origem=comprovante&" +
                                 "viewstate=" + System.Uri.EscapeDataString(viewState) + "&" +
                                 "cnpj=" + cnpj +"&" +
                                 "captcha=" + captcha + "&" +
                                 "captchaAudio=&" +
                                 "submit1=Consultar&" +
                                 "search_type=cnpj";
    
                MyHttpPost(parametros);  
    
            }
    
            #region Execução do Post com os parametros preenchidos
            public void MyHttpPost(String parametros)
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UrlBase + UrlPost);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                
                httpWebRequest.Method = "POST";
                httpWebRequest.AllowAutoRedirect = false;
    
                httpWebRequest.ContentLength = parametros.Length;
    
                StreamWriter stParametros = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("ISO-8859-1")); 
                stParametros.Write(parametros);
                stParametros.Close();
                
                HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                
                // Encaminha para o autoredirecionamento
                if (response.StatusCode == HttpStatusCode.Found){
                    string redirUrl = response.Headers["Location"];
                    MyHttpGet(redirUrl);
                }
    
                // Encaminha o Retorno do Html com Erro de Validação
                if (response.StatusCode == HttpStatusCode.OK){
                    StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                    RetornoHtml(stHtml.ReadToEnd());
                }
            }
            #endregion
    
            #region AutoRedirecionamento planejado
            public void MyHttpGet(String url){
                if (!url.Contains("http")){
                    url = UrlBase + url;
                }
    
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "GET";
                httpWebRequest.AllowAutoRedirect = false;
    
                HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                string redirUrl = response.Headers["Location"];
    
                if (response.StatusCode == HttpStatusCode.Found){
                    MyHttpGet(redirUrl);
                } else {
                    if (response.StatusCode == HttpStatusCode.OK){
                        StreamReader stIn = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                        RetornoHtml(stIn.ReadToEnd());
                    }
                }
            }
            #endregion
    
            public void RetornoHtml(String response){
                memoEdit2.Text = response;
            }
    
        }
    }

    se existir algum jeito mais limpo de fazer por favor contribua pois estou começando agora em em c#



    Tuesday, July 23, 2013 2:43 AM
  • Meu amigo vou testar esse código, porém de lhe digo antes , se esse foi o seu start em C# imagino como será a sua jornada , meus parabéns pois já pegou algo que realmente nós faz quebrar muito a cabeça.

    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    Tuesday, July 23, 2013 3:37 AM
  • parceiro seu codigo está dando erro de TIMEOUT

    o que pode ser??

    Para todos que querem o código e nunca conseguiram fazer funcionar ta ai o exemplo totalmente funcional de como transpor os redirects e acessar o html do comprovante, agora é só dar um crop no html dos campos e encaminhar para a entidade


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Windows.Forms;
    using Microsoft.VisualBasic;
    
    namespace LeituraWeb
    {
        public partial class Form1 : Form
        {
            
            CookieContainer cookieContainer = new CookieContainer();
            
    
            String UrlDominio = "http://www.receita.fazenda.gov.br";
            String UrlBase = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/";
            String UrlGet = "cnpjreva_solicitacao2.asp";
            String UrlPost = "Valida.asp";
                            
            public Form1(){
                InitializeComponent();
            }
    
    
            private void button1_Click(object sender, EventArgs e)
            {
                String viewState;
                String HtmlResponse;
    
                int PosString;
                String StrViewState     = "<input type=hidden id=viewstate name=viewstate value='";
                String StrImagemCaptcha = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti rob";
                String UrlImagemCaptcha = "";
    
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( UrlBase + UrlGet );
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "GET";
                httpWebRequest.AllowAutoRedirect = false;
    
                StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                HtmlResponse = stHtml.ReadToEnd();
                stHtml.Close();
    
                viewState = HtmlResponse;                        
                PosString = viewState.IndexOf(StrViewState);
                viewState = viewState.Substring(PosString + StrViewState.Length);
                PosString = viewState.IndexOf("'>");
                viewState = viewState.Substring(0, PosString);
                
                UrlImagemCaptcha = HtmlResponse;
                PosString = UrlImagemCaptcha.IndexOf(StrImagemCaptcha);
                UrlImagemCaptcha = UrlImagemCaptcha.Substring(PosString + 8 + StrImagemCaptcha.Length);
                PosString = UrlImagemCaptcha.IndexOf("'>");
                UrlImagemCaptcha = UrlImagemCaptcha.Substring(0, PosString);
                UrlImagemCaptcha = UrlImagemCaptcha.Replace("amp;", "");
    
                if (UrlImagemCaptcha.Length > 0)
                    pictureBox1.Image = new System.Drawing.Bitmap(new System.IO.MemoryStream(new System.Net.WebClient().DownloadData(UrlDominio + UrlImagemCaptcha)));
    
                // Usando a referencia Microsoft.VisualBasic para gerar o inputDialog 
                var captcha = Interaction.InputBox("Imagem do Captcha?", "Imagem do Captcha?", "");
                var cnpj = Interaction.InputBox("Número do CNPJ?", "Número do CNPJ?", "");
    
                // Montando a Lista de Parametros para o post
                var parametros = "origem=comprovante&" +
                                 "viewstate=" + System.Uri.EscapeDataString(viewState) + "&" +
                                 "cnpj=" + cnpj +"&" +
                                 "captcha=" + captcha + "&" +
                                 "captchaAudio=&" +
                                 "submit1=Consultar&" +
                                 "search_type=cnpj";
    
                MyHttpPost(parametros);  
    
            }
    
            #region Execução do Post com os parametros preenchidos
            public void MyHttpPost(String parametros)
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UrlBase + UrlPost);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                
                httpWebRequest.Method = "POST";
                httpWebRequest.AllowAutoRedirect = false;
    
                httpWebRequest.ContentLength = parametros.Length;
    
                StreamWriter stParametros = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("ISO-8859-1")); 
                stParametros.Write(parametros);
                stParametros.Close();
                
                HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                
                // Encaminha para o autoredirecionamento
                if (response.StatusCode == HttpStatusCode.Found){
                    string redirUrl = response.Headers["Location"];
                    MyHttpGet(redirUrl);
                }
    
                // Encaminha o Retorno do Html com Erro de Validação
                if (response.StatusCode == HttpStatusCode.OK){
                    StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                    RetornoHtml(stHtml.ReadToEnd());
                }
            }
            #endregion
    
            #region AutoRedirecionamento planejado
            public void MyHttpGet(String url){
                if (!url.Contains("http")){
                    url = UrlBase + url;
                }
    
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "GET";
                httpWebRequest.AllowAutoRedirect = false;
    
                HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                string redirUrl = response.Headers["Location"];
    
                if (response.StatusCode == HttpStatusCode.Found){
                    MyHttpGet(redirUrl);
                } else {
                    if (response.StatusCode == HttpStatusCode.OK){
                        StreamReader stIn = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                        RetornoHtml(stIn.ReadToEnd());
                    }
                }
            }
            #endregion
    
            public void RetornoHtml(String response){
                memoEdit2.Text = response;
            }
    
        }
    }

    se existir algum jeito mais limpo de fazer por favor contribua pois estou começando agora em em c#




    Thursday, July 25, 2013 2:16 PM
  • Olha testando aqui também percebi que existia um timeout e vi que ela é dada por um erro na classe HttpWebRequest porem tem um jeito de faze-la rodar direitinho usando threads

    fiz um refactory na classe para faze-la funcionar

    A Minha Classe agora esta assim

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace LeituraWeb
    {
        public class ConsultaCnpjReceita
        {
            private String _erro;
            private CookieContainer cookieContainer = new CookieContainer();
            private String UrlDominio = "http://www.receita.fazenda.gov.br";
            private String UrlBase = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/";
            private String UrlGet = "cnpjreva_solicitacao2.asp";
            private String UrlPost = "Valida.asp";
            private String viewState;
            private String RetornoHtml = "";
            public String ErroDetectado { get{ return _erro;} }
    
            #region Recupera a Imagem do Captcha
            /// <summary>
            /// Chamada inicial da classe, resposável por popular a imagem e criar os cookies em memória
            /// para serem confrontados no ato do post de validação
            /// </summary>
            /// <returns></returns>
            public Bitmap RecuperaCaptcha(){
                String HtmlResponse;            
                _erro = null;            
                int PosString;
                String StrViewState = "<input type=hidden id=viewstate name=viewstate value='";
                String StrImagemCaptcha = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti rob";
                String UrlImagemCaptcha = "";
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UrlBase + UrlGet);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "GET";
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.Timeout = 20000;
                try{
                    StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                    HtmlResponse = stHtml.ReadToEnd();
                    stHtml.Close();
                    viewState = HtmlResponse;
                    PosString = viewState.IndexOf(StrViewState);
                    if (PosString >= 0)
                        viewState = viewState.Substring(PosString + StrViewState.Length);
                    PosString = viewState.IndexOf("'>");
                    if (PosString >= 0)
                        viewState = viewState.Substring(0, PosString);
                    UrlImagemCaptcha = HtmlResponse;
                    PosString = UrlImagemCaptcha.IndexOf(StrImagemCaptcha);
                    if (PosString >= 0)
                        UrlImagemCaptcha = UrlImagemCaptcha.Substring(PosString + 8 + StrImagemCaptcha.Length);
                    PosString = UrlImagemCaptcha.IndexOf("'>");
                    if (PosString >= 0)
                        UrlImagemCaptcha = UrlImagemCaptcha.Substring(0, PosString);
                    UrlImagemCaptcha = UrlImagemCaptcha.Replace("amp;", "");
                } catch (Exception ex) {
                    _erro = ex.Message;
                }                       
                try{
                    if (UrlImagemCaptcha.Length > 0)
                        return new System.Drawing.Bitmap(new System.IO.MemoryStream(new System.Net.WebClient().DownloadData(UrlDominio + UrlImagemCaptcha)));
                    else
                        return null;
                }
                catch (Exception ex){
                    _erro = ex.Message;
                    return null;
                }
            }
            #endregion
    
            #region Consulta os Dados na Sefaz
            /// <summary>
            /// Consulta a Secretaria da Fazenda os Dados enviados para retornar o Cartão com os Dados do CNPJ
            /// </summary>
            /// <param name="cnpj"></param>
            /// <param name="captcha"></param>
            public void Consulta(string cnpj, string captcha){
                _erro = null;
                if (cnpj.Length == 0)
                    _erro = "CNPJ não informado";
                else if (captcha.Length == 0)
                    _erro = "Imagem de Validação não informado";            
                if (_erro == null) {                         
                    // Montando a Lista de Parametros para o post
                    var parametros = "origem=comprovante&" +
                                     "viewstate=" + System.Uri.EscapeDataString(viewState) + "&" +
                                     "cnpj=" + System.Uri.EscapeDataString(cnpj) + "&" +
                                     "captcha=" + System.Uri.EscapeDataString(captcha) + "&" +
                                     "captchaAudio=&" +
                                     "submit1=Consultar&" +
                                     "search_type=cnpj";
                    try{
                        MyHttpPost(parametros);
                    }
                    catch (Exception ex){
                        _erro = "Ocorreu uma excessão ao consultar o site da Receita Federal\n\n" + ex.Message;
                    }
                }
            }
            #endregion
    
            #region Retorno em Formato Html
            /// <summary>
            /// Retorno em Html da Requisição enviada a Sefaz
            /// </summary>
            /// <returns></returns>
            public string RetornoEmHtml(){
                return RetornoHtml;
            }
            #endregion
    
            #region Execução do Post com os parametros preenchidos
            private void MyHttpPost(String parametros){
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UrlBase + UrlPost);
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "POST";
                httpWebRequest.Timeout = 20000;
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.ContentLength = parametros.Length;
                try{
                    StreamWriter stParametros = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("ISO-8859-1"));
                    stParametros.Write(parametros);
                    stParametros.Close();
                    HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                    // Encaminha para o autoredirecionamento
                    if (response.StatusCode == HttpStatusCode.Found){
                        string redirUrl = response.Headers["Location"];
                        MyHttpGet(redirUrl);
                    }
                    // Encaminha o Retorno do Html com Erro de Validação
                    if (response.StatusCode == HttpStatusCode.OK){
                        StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                        MontaRetorno(stHtml.ReadToEnd());
                        stHtml.Close();
                    }
                    response.Close();
                }
                catch (Exception ex) {
                    _erro = ex.Message;
                }
            }
            #endregion
    
            #region AutoRedirecionamento planejado
            private void MyHttpGet(String url){
                if (!url.Contains("http")){
                    url = UrlBase + url;
                }
                try{
                    HttpWebRequest httpWebRequestGet = (HttpWebRequest)WebRequest.Create(url);
                    httpWebRequestGet.CookieContainer = cookieContainer;
                    httpWebRequestGet.ContentType = "application/x-www-form-urlencoded";
                    httpWebRequestGet.Method = WebRequestMethods.Http.Get;
                    httpWebRequestGet.AllowAutoRedirect = false;
                    var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, httpWebRequestGet.BetterEndGetResponse, this).ContinueWith(asyncResult =>
                    {
                        var response = asyncResult.Result as HttpWebResponse;
                        string redirUrl = response.Headers["Location"];
                        if (response.StatusCode == HttpStatusCode.Found){
                            MyHttpGet(redirUrl);
                        } else{
                            if (response.StatusCode == HttpStatusCode.OK){
                                StreamReader stHtml = new StreamReader(httpWebRequestGet.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                                MontaRetorno(stHtml.ReadToEnd());
                                stHtml.Close();
                            }
                        }
                        response.Close();
                    });
                }
                catch (Exception ex) {
                    _erro = ex.Message;
                }
            }
            #endregion
    
            private void MontaRetorno(String response){
                if (response.Contains("Erro na Consulta")){
                    _erro = "A imagem de validação se encontra incorreta. Verifique e tente novamente.";
                }
                RetornoHtml = response;
            }
    
            /*internal void PreencheFicha(CadastroCNPJ cad)
            {
                if (RetornoHtml.Length > 0) {
                    if (RetornoHtml.Contains("Erro na Consulta")) {
                        throw new Exception("A imagem de validação se encontra incorreta. Verifique e tente novamente.");
                    }
                }
                if (RetornoHtml.Length == 0) {
                    throw new Exception("Não foi possível recuperar um retorno da Secretaria da Fazenda. Verifique e tente novamente.");
                }
            }*/
        }
    
        #region WebRequestExtensions
        public static class WebRequestExtensions
        {
            public static WebResponse BetterEndGetResponse(this WebRequest request, IAsyncResult asyncResult)
            {
                try{
                    return request.EndGetResponse(asyncResult);
                }
                catch (WebException wex){
                    if (wex.Response != null){
                        return wex.Response;
                    }
                    throw;
                }
            }
    
            public static WebResponse BetterGetResponse(this WebRequest request)
            {
                try{
                    return request.GetResponse();
                }
                catch (WebException wex){
                    if (wex.Response != null){
                        return wex.Response;
                    }
                    throw;
                }
            }
        }
        #endregion
    
    }

    A Chamada dela eu faço desta forma

            #region BOTAO CONSULTA DE DADOS
            private void button2_Click(object sender, EventArgs e){
                Cursor cursor;
                cursor = this.Cursor;           
    
                try{
                    this.Cursor = Cursors.WaitCursor;
                    ConsultaCnpj.Consulta(edCNPJ.Text, edCAPTCHA.Text);                
                }
                catch (Exception ex){
                    MessageBox.Show(ex.Message);
                }
                if (ConsultaCnpj.ErroDetectado != null){
                    MessageBox.Show(ConsultaCnpj.ErroDetectado);
                } else {
                    try{
                        memoEdit2.Text = ConsultaCnpj.RetornoEmHtml();
                    }
                    catch (Exception ex){
                        MessageBox.Show(ex.Message);
                    }
                }
                this.Cursor = cursor;
            }
            #endregion
    
            #region BOTAO RECUPERA IMAGEM
            private void button1_Click(object sender, EventArgs e){
                edCAPTCHA.Text = "";
                Cursor cursor;
                cursor = this.Cursor;           
                this.Cursor = Cursors.WaitCursor;
                Bitmap bit = ConsultaCnpj.RecuperaCaptcha();
                if (bit != null)
                    pictureBox1.Image = bit;            
                else 
                    MessageBox.Show("Não foi possível recuperar a imagem de validação do site da Receita Federal");
                this.Cursor = cursor;
            }
            #endregion

    e com isso não tive mais problema algum com a consulta

    a solução esta na extensão da classe httpwebrequest onde agora requisita por thread



    Sunday, July 28, 2013 6:33 PM
  • Olá, eu também estou tentando implementar esta opção em meu sistema, copiei o código do Jefferson Lupinacci mas ao enviar a solicitação com o captcha, não está passando.

    Aparece a imagem, digito o captcha com o CNPJ, e o retorno é:

    Erro: <head><title>Object moved</title></head>
    <body><h1>Object Moved</h1>This object may be found <a HREF="Cnpjreva_Vstatus.asp?origem=comprovante&amp;cnpj=62225933000134">here</a>.</body>
    

    Quando eu digito o captcha errado o retorno é:

    Erro: <head><title>Object moved</title></head>
    <body><h1>Object Moved</h1>This object may be found <a HREF="Cnpjreva_Solicitacao2.asp?cnpj=62225933000134">here</a>.</body>
    

    Parece que envio o captcha, ele já está validando com outra imagem, alguém sabe o que pode estar errado?

    No código tive que mudar a seguinte linha que estava dando erro:

     var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, httpWebRequestGet.BetterEndGetResponse, this).ContinueWith(asyncResult =>

    Alterei para:

    var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, httpWebRequestGet.EndGetResponse, this).ContinueWith(asyncResult =>



    Diego Rodrigo

    Friday, August 09, 2013 12:35 PM
  • Estou tentando implementar sua classe, mas tá dando erro na linha:

    var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, httpWebRequestGet.BetterEndGetResponse, this).ContinueWith(asyncResult =>

    O que está errado ?


    Zagatti, Angelo Itápolis-SP

    Monday, August 12, 2013 5:37 PM
  • Prezados, também estou tendo problema.

    Recebo o seguinte erro:
    "The underlying connection was closed: The connection was closed unexpectedly."

    Alguém tem ideia do que pode ser?

    Thursday, September 26, 2013 10:17 PM
  • Bom dia, Jefferson!

    Copiei seu código e tentei implantar no meu módulo de cadastro de clientes que estou convertendo para c#, pois o código está em CLIPPER e não estou conseguindo, você poderia deixar email para que eu possa entrar em contato?

    Ou poderia descrever passo a passo de como fez a aplicação?

    Novato em C# e WebServices. Se tiver algum custo posso passar para meu contratante.

    Wednesday, October 30, 2013 1:03 PM
  • Por que voces nao utilizam o www.SOAWebServices.com.br ?

    Olha so o tamanho do codigo:

    Imports svcCDC 
    Public Sub ConsultaCDCPessoaJuridicaNFe() 
           ' Declara o Servico que vai ser usado 
            Dim oWebServices As New svcCDC.CDC 
            ' Declara o Objeto que contem as credenciais de Acesso 
            Dim Credenciais As New svcCDC.Credenciais 
            Dim Retorno As New svcCDC.PessoaJuridicaNFe 
            ' Preenche com sua credenciais o objeto "Credenciais" 
            Credenciais.Email = "seu e‐mail" 
            Credenciais.Senha = "sua senha" 

           Try 
               Retorno = oWebServices.PessoaJuridicaNFe(Credenciais, "Numero CNPJ") 
            Catch ex As Exception 
                ' Tratamento de Erro 
            End Try 
        End Sub


    E o tempo de resposta é abaixo de  5 segundos.



    Angelo Bestetti




    Tuesday, December 17, 2013 9:10 PM
  • Alguém conseguiu resolver o erro dessa Linha:

    var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, httpWebRequestGet.BetterEndGetResponse, this).ContinueWith(asyncResult =>

    Eu estou tendo esse problema e não acho o porque.

    Vs2010 - Framework 4.0


    Marcio Valerio

    Monday, December 30, 2013 12:10 PM
  • Amigo eu modifiquei e deixei dessa forma...

    var task = Task.Factory.FromAsync<WebResponse>(httpWebRequestGet.BeginGetResponse, (Func<IAsyncResult, WebResponse>)httpWebRequestGet.BetterEndGetResponse, this).ContinueWith(asyncResult =>

    Monday, January 20, 2014 11:58 AM
  • Pessoal,

    Depois de quebrar um pouco a cabeça para entender a solução estou com algumas dúvidas ainda. Já consegui rodar e exibir as informações mas o que percebo é que, se digitar o Captcha errado ele me retorna o javascript dentro do campo memo sem ser a mensagem de erro do messagebox do captcha. Outra dúvida é que quando está tudo correto, ao pressionar pela primeira vez ele "parece" consultar e não tenho retorno nenhum no memoedit e ao pressionar novamente aí sim ele retorna o html com as informações.

    Uma dúvida final é qual a solução que vocês encontraram para separar as informações que ele retorna no html ou como fizeram para pegar somente o conteúdo que no caso necessitamos?

    Obrigado e parabéns pela divulgação desse código.

    Friday, February 07, 2014 9:49 PM
  • Pessoal,

    Depois de quebrar um pouco a cabeça para entender a solução estou com algumas dúvidas ainda. Já consegui rodar e exibir as informações mas o que percebo é que, se digitar o Captcha errado ele me retorna o javascript dentro do campo memo sem ser a mensagem de erro do messagebox do captcha. Outra dúvida é que quando está tudo correto, ao pressionar pela primeira vez ele "parece" consultar e não tenho retorno nenhum no memoedit e ao pressionar novamente aí sim ele retorna o html com as informações.

    Uma dúvida final é qual a solução que vocês encontraram para separar as informações que ele retorna no html ou como fizeram para pegar somente o conteúdo que no caso necessitamos?

    Obrigado e parabéns pela divulgação desse código.

    Pessoal,

    Uma solução que encontrei como se trata de poucos dados e a performance não é tão exigida foi essa:

    memoEdit2.Text = obj.RetornoEmHtml();
                        string dadoshtml = memoEdit2.Text;
                        foreach (Match match in Regex.Matches(dadoshtml, @"<b>(.*?)</b>"))
                        {
                            MessageBox.Show(Convert.ToString(match.Value));
                        }

    Espero que ajude quem precisar.

    Tuesday, February 11, 2014 1:04 AM
  • Boa tarde pessoal, 

    Não estou conseguindo fazer esse código funcionar e não sei o que é , eu fiz uma adaptação do código que vocês passaram aqui e estava dando erro ao compilar igualzinho ao erro do Marcio Valerio. Fiz as adaptações necessárias conforme o Ostenieverson falou e o erro foi eliminado, mas ainda não consigo ter o retorno dos dados. Eu até abri um outro post aqui com a minha classe para me ajudarem se vocês puderem dar uma olhada no meu código está nesse link o meu post: 

    http://social.msdn.microsoft.com/Forums/pt-BR/ff05c36b-74c5-4dd2-bb3d-45064c7c7e3d/pesquisa-de-dados-feita-atravs-do-cnpj-no-site-da-receita-federal?forum=vscsharppt#e933ec29-7c4a-4592-b846-e2144c662975

    Agradeço quem puder me ajudar, e se for o caso se alguém puder também me ajudar com o código que esteja funcionando eu também agradeço muito. Mas esse código que eu estou fazendo está em asp.Net C#.

    Att, Priscila Moreira


    • Edited by insight_pri Monday, February 17, 2014 6:38 PM especificar a plataforma utilizada.
    Monday, February 17, 2014 5:48 PM
  • Olá pessoal quando eu montei o script estava aprendendo c# e no meu exemplo pratico em casa fiz a separação dos dados da maneira abaixo:

    Hoje montaria com expressão regurar porem desta forma também funciona

    using System;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace LeituraWeb
    {
        public partial class Form1 : Form
        {
            ConsultaCnpjReceita ConsultaCnpj = new ConsultaCnpjReceita();
            CadastroCNPJ cad = new CadastroCNPJ();
    
            public Form1(){
                InitializeComponent();
            }
    
            #region BOTAO CONSULTA DE DADOS
            private void button2_Click(object sender, EventArgs e){
                Cursor cursor;
                cursor = this.Cursor;           
    
                try{
                    this.Cursor = Cursors.WaitCursor;
                    ConsultaCnpj.Consulta(edCNPJ.Text, edCAPTCHA.Text);                
                }
                catch (Exception ex){
                    MessageBox.Show(ex.Message);
                }
                if (ConsultaCnpj.ErroDetectado != null){
                    MessageBox.Show(ConsultaCnpj.ErroDetectado);
                } else {
                    try{
                        ConsultaCnpj.PreencheFicha(cad);
                        memoEdit2.Text = ConsultaCnpj.RetornoEmHtml();
                    }
                    catch (Exception ex){
                        MessageBox.Show(ex.Message);
                    }
                }
                this.Cursor = cursor;
            }
            #endregion
    
            #region BOTAO RECUPERA IMAGEM
            private void button1_Click(object sender, EventArgs e){
                edCAPTCHA.Text = "";
                Cursor cursor;
                cursor = this.Cursor;           
                this.Cursor = Cursors.WaitCursor;
                Bitmap bit = ConsultaCnpj.RecuperaCaptcha();
                if (bit != null)
                    pictureBox1.Image = bit;            
                else
                    MessageBox.Show("Não foi possível recuperar a imagem de validação do site da Receita Federal");
                this.Cursor = cursor;
            }
            #endregion
    
            private void button3_Click(object sender, EventArgs e)
            {
                string tmp = memoEdit2.Text.ToString();
                memoEdit1.Text += RecuperaColunaValor(tmp, Coluna.DataSituacaoCadastral);            
            }
    
            private enum Coluna {
                RazaoSocial = 0,
                NomeFantasia,
                
                AtividadeEconomicaPrimaria,
                AtividadeEconomicaSecundaria,
                
                NumeroDaInscricao,
                MatrizFilial,
                NaturezaJuridica,
    
                SituacaoCadastral,
                DataSituacaoCadastral,
                MotivoSituacaoCadastral,
    
                EnderecoLogradouro,
                EnderecoNumero,
                EnderecoComplemento,
                EnderecoCEP,
                EnderecoBairro,
                EnderecoCidade,
                EnderecoEstado
    
                
            };
    
            private String RecuperaColunaValor(String pattern, Coluna col)
            {
                String S = pattern.Replace("\n", "").Replace("\t", "").Replace("\r", "");           
                
                switch (col) {
                    case Coluna.RazaoSocial:{
                        S = StringEntreString(S, "<!-- Início Linha NOME EMPRESARIAL -->", "<!-- Fim Linha NOME EMPRESARIAL -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.NomeFantasia:{
                        S = StringEntreString(S, "<!-- Início Linha ESTABELECIMENTO -->", "<!-- Fim Linha ESTABELECIMENTO -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.NaturezaJuridica: {
                        S = StringEntreString(S, "<!-- Início Linha NATUREZA JURÍDICA -->", "<!-- Fim Linha NATUREZA JURÍDICA -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.AtividadeEconomicaPrimaria:{
                        S = StringEntreString(S, "<!-- Início Linha ATIVIDADE ECONOMICA -->", "<!-- Fim Linha ATIVIDADE ECONOMICA -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.AtividadeEconomicaSecundaria: {
                        S = StringEntreString(S, "<!-- Início Linha ATIVIDADE ECONOMICA SECUNDARIA-->", "<!-- Fim Linha ATIVIDADE ECONOMICA SECUNDARIA -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }        
                    case Coluna.NumeroDaInscricao:{
                        S = StringEntreString(S, "<!-- Início Linha NÚMERO DE INSCRIÇÃO -->", "<!-- Fim Linha NÚMERO DE INSCRIÇÃO -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");                                    
                        return S.Trim() ;
                    }
                    case Coluna.MatrizFilial: {
                        S = StringEntreString(S, "<!-- Início Linha NÚMERO DE INSCRIÇÃO -->", "<!-- Fim Linha NÚMERO DE INSCRIÇÃO -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.EnderecoLogradouro:
                        {
                        S = StringEntreString(S, "<!-- Início Linha LOGRADOURO -->", "<!-- Fim Linha LOGRADOURO -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.EnderecoNumero: {
                        S = StringEntreString(S, "<!-- Início Linha LOGRADOURO -->", "<!-- Fim Linha LOGRADOURO -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.EnderecoComplemento:{
                        S = StringEntreString(S, "<!-- Início Linha LOGRADOURO -->", "<!-- Fim Linha LOGRADOURO -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }                
                    case Coluna.EnderecoCEP: {
                        S = StringEntreString(S, "<!-- Início Linha CEP -->", "<!-- Fim Linha CEP -->");
                        S = StringEntreString(S, "<tr>", "</tr>");                    
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.EnderecoBairro:{
                        S = StringEntreString(S, "<!-- Início Linha CEP -->", "<!-- Fim Linha CEP -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.EnderecoCidade:{
                        S = StringEntreString(S, "<!-- Início Linha CEP -->", "<!-- Fim Linha CEP -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.EnderecoEstado:{
                        S = StringEntreString(S, "<!-- Início Linha CEP -->", "<!-- Fim Linha CEP -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringSaltaString(S, "</b>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.SituacaoCadastral:{
                        S = StringEntreString(S, "<!-- Início Linha SITUAÇÃO CADASTRAL -->", "<!-- Fim Linha SITUACAO CADASTRAL -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }
                    case Coluna.DataSituacaoCadastral:{
                        S = StringEntreString(S, "<!-- Início Linha SITUAÇÃO CADASTRAL -->", "<!-- Fim Linha SITUACAO CADASTRAL -->");
                        S = StringEntreString(S, "<tr>", "</tr>");
                        S = StringSaltaString(S, "</b>");
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }                             
                    case Coluna.MotivoSituacaoCadastral:{
                        S = StringEntreString(S, "<!-- Início Linha MOTIVO DE SITUAÇÃO CADASTRAL -->", "<!-- Fim Linha MOTIVO DE SITUAÇÃO CADASTRAL -->");
                        S = StringEntreString(S, "<tr>", "</tr>");                    
                        S = StringEntreString(S, "<b>", "</b>");
                        return S.Trim();
                    }                             
                        
            
    
                    default: {
                        return S; }
                }                      
            }
            
            private String StringEntreString(String Str, String StrInicio, String StrFinal) {
                int Ini;
                int Fim;
                int Diff;
                Ini = Str.IndexOf(StrInicio);
                Fim = Str.IndexOf(StrFinal);
                if (Ini > 0) Ini = Ini + StrInicio.Length;            
                if (Fim > 0) Fim = Fim + StrFinal.Length;
                Diff = ((Fim - Ini) - StrFinal.Length);
                if ((Fim > Ini) && (Diff > 0))
                    return Str.Substring(Ini, Diff);
                else
                    return "";           
            }
        
            private String StringSaltaString(String Str, String StrInicio) {
                int Ini;           
                Ini = Str.IndexOf(StrInicio);            
                if (Ini > 0){
                    Ini = Ini + StrInicio.Length;            
                    return Str.Substring(Ini);
                }else
                    return Str;           
            }
    
            public string StringPrimeiraLetraMaiuscula(String Str){
                string StrResult = "";
                if (Str.Length > 0){
                    StrResult += Str.Substring(0, 1).ToUpper();
                    StrResult += Str.Substring(1, Str.Length - 1).ToLower();
                }
                return StrResult;
            }   
        }
    }
        
    


    Friday, February 28, 2014 12:24 AM
  • Diego Verifique o ViewState sendo passado por parametro pois é nele se se encontra as informações sobre qual o captcha que esta sendo transmitido
    Friday, February 28, 2014 12:28 AM
  • Uma outra contribuição para a Comunidade que esta a utilizar o código acima

    Consultando informações diretamente dos correios utilizando o mesmo conceito de código

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    
    namespace LeituraWebCorreios
    {
    
        public enum TipoCEP
        {
            LocalidadeLogradouro = 1,
            CEPPromocional = 2, CaixaPostalComunitaria = 3,
            GrandeUsuario = 4, UnidadeOperacional = 5, Todos = 6
        }
    
        public class CEPCorreios
        {
            public String Logradouro { get; set; }
            public String Bairro { get; set; }
            public String Localidade { get; set; }
            public String UF { get; set; }
            public String CEP { get; set; }
        }
    
        public class ConsultaCorreios
        {
            private String _retornoHtml = "";
            private CookieContainer cookieContainer = new CookieContainer();
    
            #region ConsultaCEP
            public void ConsultaCEP(String Texto, TipoCEP tipo, Boolean Semelhanca)
            {
                String parametros;
                string TextoEntrada = Texto;
    
                parametros = "relaxation=&" +
                             "TipoCep=&" +
                             "semelhante=&" +
                             "cfm=1&" +
                             "Metodo=listaLogradouro&" +
                             "TipoConsulta=relaxation&" +
                             "StartRow=1&" +
                             "EndRow=100";
    
                TextoEntrada = TextoEntrada.Replace("  ", " ").Replace(" ", "+").Replace("\n", "").Replace("\r", "");
                parametros = parametros.Replace("relaxation=&", "relaxation=" + TextoEntrada + "&");
    
                switch (tipo){
                    case TipoCEP.LocalidadeLogradouro: { parametros = parametros.Replace("TipoCep=&", "TipoCep=LOG&"); break; }
                    case TipoCEP.CEPPromocional: { parametros = parametros.Replace("TipoCep=&", "TipoCep=PRO&"); break; }
                    case TipoCEP.CaixaPostalComunitaria: { parametros = parametros.Replace("TipoCep=&", "TipoCep=CPC&"); break; }
                    case TipoCEP.GrandeUsuario: { parametros = parametros.Replace("TipoCep=&", "TipoCep=GRU&"); break; }
                    case TipoCEP.UnidadeOperacional: { parametros = parametros.Replace("TipoCep=&", "TipoCep=UOP&"); break; }
                    case TipoCEP.Todos: { parametros = parametros.Replace("TipoCep=&", "TipoCep=ALL&"); break; }
                }
    
                if (Semelhanca)
                    parametros = parametros.Replace("semelhante=&", "semelhante=S&");
                else
                    parametros = parametros.Replace("semelhante=&", "semelhante=N&");
    
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.buscacep.correios.com.br/servicos/dnec/consultaEnderecoAction.do");
                httpWebRequest.CookieContainer = cookieContainer;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "POST";
                httpWebRequest.Timeout = 20000;
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.ContentLength = parametros.Length;
    
                try{
                    StreamWriter stParametros = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("ISO-8859-1"));
                    stParametros.Write(parametros);
                    stParametros.Close();
                    HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                    if (response.StatusCode == HttpStatusCode.OK){
                        StreamReader stHtml = new StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                        _retornoHtml = stHtml.ReadToEnd();
                        stHtml.Close();
                    }
                }
                catch (Exception ex){
                    _retornoHtml = ex.Message;
                }
            }
            #endregion
    
            #region Retorno em HTML
            internal String RetornoHTML(){
                return _retornoHtml;
            }
            #endregion
    
            #region Retorno em Lista de Registros
            public List<CEPCorreios> RetornoCEP(){
    
                List<CEPCorreios> list = new List<CEPCorreios>();
                int PosicaoLinha, PosicaoColuna, numeroColuna;
                String Coluna, strColunas, strLinha, Col1, Col2, Col3, Col4, Col5;
    
                String str = _retornoHtml.Replace("\n", "").Replace("\t", "").Replace("\r", "").Replace("\\", "");             
                str = StringSaltaString(str, "<!-- Fim cabecalho da tabela -->");
                str = StringEntreString(str, "<table", "</table");                        
                PosicaoLinha = 0;
                
                while (str.Contains("tr>")){
                    PosicaoLinha = str.IndexOf("/tr>") + 4;   
                    strLinha = StringEntreString(str, "<tr", "/tr>");
                    strColunas = strLinha;
                    Coluna = "";                
                    numeroColuna = 0;
                    Col1 = null; Col2 = null; Col3 = null; Col4 = null; Col5 = null;
    
                    while (strColunas.Contains("td>")){
                        PosicaoColuna = strColunas.IndexOf("/td>") + 3;
                        Coluna = StringEntreString(strColunas, "<td", "/td>");
                        while (Coluna.Contains("<td")) {
                            Coluna = Coluna.Substring(Coluna.IndexOf("<td") + 3);
                        }
                        Coluna = StringEntreString(Coluna, ">", "<");
                        Coluna = Coluna.Replace("<", "").Replace(">", "");
                        if (PosicaoColuna < strColunas.Length)
                            strColunas = strColunas.Substring(PosicaoColuna);
                        else
                            strColunas = "";                    
                        numeroColuna++;                    
                        if (numeroColuna == 1) Col1 = Coluna;
                        if (numeroColuna == 2) Col2 = Coluna;
                        if (numeroColuna == 3) Col3 = Coluna;
                        if (numeroColuna == 4) Col4 = Coluna;
                        if (numeroColuna == 5) Col5 = Coluna;
                    }
    
                    while ((Col5 == "") || (Col5 == null)){
                        Col5 = Col4; Col4 = "";
                        Col4 = Col3; Col3 = "";
                        Col3 = Col2; Col2 = "";
                        Col2 = Col1; Col1 = "";
                        if ((Col5 == "") && (Col4 == "") && (Col3 == "") && (Col2 == "") && (Col1 == ""))
                            break;
                    }
    
                    if ((Col5 != "") || (Col4 != "") || (Col3 != "") || (Col2 != "") || (Col1 != ""))
                    list.Add(new CEPCorreios { Logradouro = Col1, Bairro = Col2, Localidade = Col3, UF = Col4, CEP = Col5 });
    
                    if (PosicaoLinha < str.Length)
                        str = str.Substring(PosicaoLinha);
                    else
                        str = "";
                }
                return list;
            }
            #endregion
    
            private String StringEntreString(String Str, String StrInicio, String StrFinal)
            {
                int Ini;
                int Fim;
                int Diff;
                Ini = Str.IndexOf(StrInicio);
                Fim = Str.IndexOf(StrFinal);
                if (Ini > 0) Ini = Ini + StrInicio.Length;
                if (Fim > 0) Fim = Fim + StrFinal.Length;
                Diff = ((Fim - Ini) - StrFinal.Length);
                if ((Fim > Ini) && (Diff > 0) && (Ini > 0))
                    return Str.Substring(Ini, Diff);
                else
                    return "";
            }
    
            private String StringSaltaString(String Str, String StrInicio)
            {
                int Ini;
                Ini = Str.IndexOf(StrInicio);
                if (Ini > 0)
                {
                    Ini = Ini + StrInicio.Length;
                    return Str.Substring(Ini);
                }
                else
                    return Str;
            }
    
        }
    }
    

    Modo de utilização

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace LeituraWebCorreios
    {
        public partial class Form1 : Form
        {
            public Form1(){
                InitializeComponent();
            }
    
            private void btnConsulta_Click(object sender, EventArgs e){
                ConsultaCorreios cons = new ConsultaCorreios();
                cons.ConsultaCEP(textEdit1.Text, TipoCEP.Todos, false);            
                gridControl1.DataSource = cons.RetornoCEP();            
            }
        }
    }
    

    Friday, February 28, 2014 12:31 AM
  • É porque quando fiz o re-factory o código foi escrito em .net 4.5 / Vs2012
    Friday, February 28, 2014 12:41 AM