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



    • Edited by Jefferson Lupinacci Sunday, July 28, 2013 6:44 PM comentario no fonte
    • Marked as answer by Giovani Cr Friday, September 27, 2013 1:03 PM
    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



    • Edited by Jefferson Lupinacci Sunday, July 28, 2013 6:44 PM comentario no fonte
    • Marked as answer by Giovani Cr Friday, September 27, 2013 1:03 PM
    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
  • Olá, boa tarde.

    Por favor, consegue me ajuda, peguei a sua classe e transformei para VB.net, mas está apresentando um problema, qdo eu consulto para aparecer os dados tenho que pressionar o botão de consulta 2 vezes.

    Por favor, consegue me ajuda.

    grd abs

    Segue abaixo a classe em VB.net

    Imports System.Collections.Generic
    Imports System.Drawing
    Imports System.IO
    Imports System.Linq
    Imports System.Net
    Imports System.Text
    Imports System.Threading
    Imports System.Threading.Tasks
    
    Namespace LeituraWeb
        Public Class ConsultaCnpjReceita
            Private _erro As String
            Private cookieContainer As New CookieContainer()
            Private UrlDominio As String =  "http://www.receita.fazenda.gov.br"
            Private UrlBase As String = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/"
            Private UrlGet As String = "cnpjreva_solicitacao2.asp"
            Private UrlPost As String = "Valida.asp"
            Private viewState As String
            Private RetornoHtml As String = String.Empty
            Private pTask As Task
    
            Public ReadOnly Property ErroDetectado() As String
                Get
                    Return _erro
                End Get
            End Property
    
    #Region "Recupera a Imagem do Captcha"
    
            Public Function RecuperaCaptcha() As Bitmap
                _erro = Nothing
    
                Dim HtmlResponse As String
                Dim PosString As Integer
                Dim StrViewState As String = "<input type=hidden id=viewstate name=viewstate value='"
                Dim StrImagemCaptcha As String = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti rob"
                Dim UrlImagemCaptcha As String = String.Empty
                Dim httpWebRequest As HttpWebRequest = DirectCast(WebRequest.Create(UrlBase & UrlGet), HttpWebRequest)
    
                httpWebRequest.CookieContainer = cookieContainer
                httpWebRequest.ContentType = "application/x-www-form-urlencoded"
                httpWebRequest.Method = "GET"
                httpWebRequest.AllowAutoRedirect = False
                httpWebRequest.Timeout = 20000
    
                Try
                    Dim stHtml As New StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"))
                    HtmlResponse = stHtml.ReadToEnd()
                    stHtml.Close()
                    viewState = HtmlResponse
                    PosString = viewState.IndexOf(StrViewState)
    
                    If PosString >= 0 Then
                        viewState = viewState.Substring(PosString + StrViewState.Length)
                    End If
    
                    PosString = viewState.IndexOf("'>")
                    If PosString >= 0 Then
                        viewState = viewState.Substring(0, PosString)
                    End If
    
                    UrlImagemCaptcha = HtmlResponse
                    PosString = UrlImagemCaptcha.IndexOf(StrImagemCaptcha)
                    If PosString >= 0 Then
                        UrlImagemCaptcha = UrlImagemCaptcha.Substring(PosString + 8 + StrImagemCaptcha.Length)
                    End If
    
                    PosString = UrlImagemCaptcha.IndexOf("'>")
                    If PosString >= 0 Then
                        UrlImagemCaptcha = UrlImagemCaptcha.Substring(0, PosString)
                    End If
    
                    UrlImagemCaptcha = UrlImagemCaptcha.Replace("amp;", "")
                Catch ex As Exception
                    _erro = ex.Message
                End Try
    
                Try
                    If UrlImagemCaptcha.Length > 0 Then
                        Return New System.Drawing.Bitmap(New System.IO.MemoryStream(New System.Net.WebClient().DownloadData(UrlDominio & UrlImagemCaptcha)))
                    Else
                        Return Nothing
                    End If
                Catch ex As Exception
                    _erro = ex.Message
                    Return Nothing
                End Try
            End Function
    #End Region
    
    #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 Sub Consulta(cnpj As String, captcha As String)
                _erro = Nothing
    
                If cnpj.Length = 0 Then
                    _erro = "CNPJ não informado"
                ElseIf captcha.Length = 0 Then
                    _erro = "Imagem de Validação não informado"
                End If
    
                If _erro Is Nothing Then
                    Dim 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 ex As Exception
                        _erro = "Ocorreu uma excessão ao consultar o site da Receita Federal" & vbLf & vbLf & ex.Message
                    End Try
                End If
            End Sub
    #End Region
    
    #Region "Retorno em Formato Html"
            Public Function RetornoEmHtml() As String
                Return RetornoHtml
            End Function
    #End Region
    
    #Region "Execução do Post com os parametros preenchidos"
    
            Private Sub MyHttpPost(parametros As String)
                Dim httpWebRequest As HttpWebRequest = DirectCast(WebRequest.Create(UrlBase & UrlPost), HttpWebRequest)
                httpWebRequest.CookieContainer = cookieContainer
                httpWebRequest.ContentType = "application/x-www-form-urlencoded"
                httpWebRequest.Method = WebRequestMethods.Http.Post
                httpWebRequest.Timeout = 20000
                httpWebRequest.AllowAutoRedirect = False
                httpWebRequest.ContentLength = parametros.Length
    
                Try
                    Dim stParametros As New StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("ISO-8859-1"))
                    stParametros.Write(parametros)
                    stParametros.Close()
    
                    Dim response As HttpWebResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
    
                    ' Encaminha para o autoredirecionamento
                    If response.StatusCode = HttpStatusCode.Found Then
                        Dim redirUrl As String = response.Headers("Location")
                        MyHttpGet(redirUrl)
                    End If
    
                    If response.StatusCode = HttpStatusCode.OK Then
                        Dim stHtml As New StreamReader(httpWebRequest.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"))
                        MontaRetorno(stHtml.ReadToEnd())
                        stHtml.Close()
                    End If
    
                    response.Close()
                Catch ex As Exception
                    _erro = ex.Message
                End Try
            End Sub
    #End Region
    
    #Region "AutoRedirecionamento planejado"
    
            Private Sub MyHttpGet(url As String)
    
                If Not url.Contains("http") Then
                    url = UrlBase & url
                End If
    
                Try
                    Dim httpWebRequestGet As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
                    httpWebRequestGet.CookieContainer = cookieContainer
                    httpWebRequestGet.ContentType = "application/x-www-form-urlencoded"
                    httpWebRequestGet.Method = WebRequestMethods.Http.Get
                    httpWebRequestGet.AllowAutoRedirect = False
    
                    pTask = task.Factory.FromAsync(Of WebResponse)(AddressOf httpWebRequestGet.BeginGetResponse, AddressOf httpWebRequestGet.GetResponse, Me).ContinueWith(
                        Function(asyncResult)
    
                            Dim response As HttpWebResponse = TryCast(asyncResult.Result, HttpWebResponse)
                            Dim redirUrl As String = response.Headers("Location")
    
                            If response.StatusCode = HttpStatusCode.Found Then
                                MyHttpGet(redirUrl)
                            Else
                                If response.StatusCode = HttpStatusCode.OK Then
                                    Dim stHtml As New StreamReader(httpWebRequestGet.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"))
                                    MontaRetorno(stHtml.ReadToEnd)
                                    stHtml.Close()
                                End If
                            End If
    
                            response.Close()
                            Return response
                        End Function)
    
                Catch ex As Exception
                    _erro = ex.Message
                End Try
            End Sub
    
            Private Sub MyHttpGet1(url As String)
                If Not url.Contains("http") Then
                    url = UrlBase & url
                End If
    
                Try
                    Dim httpWebRequestGet As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
                    httpWebRequestGet.CookieContainer = cookieContainer
                    httpWebRequestGet.ContentType = "application/x-www-form-urlencoded"
                    httpWebRequestGet.Method = WebRequestMethods.Http.Get
                    httpWebRequestGet.AllowAutoRedirect = False
    
                    pTask = task.Factory.FromAsync(Of WebResponse)(AddressOf httpWebRequestGet.BeginGetResponse, AddressOf httpWebRequestGet.GetResponse, Me).ContinueWith(
                        Function(asyncResult)
    
                            Dim response As HttpWebResponse = TryCast(asyncResult.Result, HttpWebResponse)
                            Dim redirUrl As String = response.Headers("Location")
    
                            If response.StatusCode = HttpStatusCode.Found Then
                                MyHttpGet(redirUrl)
                            Else
                                If response.StatusCode = HttpStatusCode.OK Then
                                    Dim stHtml As New StreamReader(httpWebRequestGet.GetResponse().GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"))
                                    MontaRetorno(stHtml.ReadToEnd)
                                    stHtml.Close()
                                End If
                            End If
    
                            response.Close()
                            Return response
                        End Function)
    
                Catch ex As Exception
                    _erro = ex.Message
                End Try
            End Sub
    #End Region
    
            Private Sub MontaRetorno(response As String)
                If response.Contains("Erro na Consulta") Then
                    _erro = "A imagem de validação se encontra incorreta. Verifique e tente novamente."
                Else
                    RetornoHtml = response
                End If
            End Sub
        End Class
    
    #Region "WebRequestExtensions"
    
        Public NotInheritable Class WebRequestExtensions
            Private Sub New()
            End Sub
    
            Public Shared Function GetResponse(request As WebRequest) As WebResponse
                Dim autoResetEvent As New AutoResetEvent(False)
                Dim asyncResult As IAsyncResult = request.BeginGetResponse(Function(r) autoResetEvent.[Set](), Nothing)
    
                autoResetEvent.WaitOne()
                Return request.EndGetResponse(asyncResult)
            End Function
    
            Public Shared Function GetRequestStream(request As WebRequest) As Stream
                Dim autoResetEvent As New AutoResetEvent(False)
                Dim asyncResult As IAsyncResult = request.BeginGetRequestStream(Function(r) autoResetEvent.[Set](), Nothing)
    
                autoResetEvent.WaitOne()
                Return request.EndGetRequestStream(asyncResult)
            End Function
        End Class
    #End Region
    
    End Namespace
    

    Friday, July 18, 2014 7:48 PM
  • Usa um Task.WaitAll(pTask) para resolver esse problema.

    Att, Paulo Rocha MCP | MCDST | MCSA Server 2012

    Saturday, July 19, 2014 12:35 PM
  • Jefferson, 

    no form tenho um txtRazaoSocial.text, como faço para que esse textbox receba o valor da razão social?

    tentei usar como mostra mas não estou conseguindo, sou novo em C#, vendo seu código notei que eu não tenho a classe na qual tu faz referencia a "CadastroCNPJ" pode me enviar?

    meu e-mail é: projetech.eng@gmail.com

    um grande abraço.

    Alessandro


    Tuesday, August 26, 2014 6:05 PM
  • Alessandro,

    Compartilhei um link com exemplo em C# 2010, Desktop.

    - Falta resolver apenas a necessidade de clicar 2 vezes para exibir o resultado.

    Abraço.

    Marcio Santos

    Wednesday, September 17, 2014 7:37 PM
  • Marcio bom dia!

    Muito obrigado, vou fazer os testes.

    No que eu puder ajudar conte comigo.

    abraços e mais uma vez muito obrigado.

    Alessandro

    Saturday, September 20, 2014 10:53 AM
  • Marcio, boa tarde!

    Deu certo, muito obrigado pela ajuda.

    Estou tentando mexer para mostrar os dados com apenas um click, caso consiga posto a solução aqui.

    abraços a todos.

    Alessandro Ferraz

    Sunday, September 28, 2014 4:33 PM
  • Senhores... Amigos....

    Um desespero danado e não consegui testar e nem saber por onde começar....

    muitos códigos muitas versões, preciso ajuda em saber qual código está ok, funcional e como utiliza-lo, sou iniciante em C#...

    agradeço,

    caso tenham uma solução para Windows Forms mais prática e facil de usar e de entender meu email: valdir@iesi.inf.br

    abraços...

    Monday, October 13, 2014 9:44 PM
  • Valdir, por n vezes respondi seu e-mail e retornou com erro.

    Alessandro.

    Saturday, October 25, 2014 6:42 PM
  • Amigo Alessandro.

    Estou com problemas no meu provedor, Central Server.....

    Solicito a gentileza de enviar neste outro email: suporte.vlr@gmail.com

    agradeço seu empenho.

    grato, Valdir

    Sunday, October 26, 2014 10:40 PM
  • O meu aqui funciona sem problemas, qual o erro que aparece para você?
    Monday, October 27, 2014 1:40 PM
  • Amigo Alessandro.

    Como eu comentei anteriormente, não tenho muita experiência com o C# e VS2010... Mas estou conseguindo resolver muita coisa, mas quando se fala de WebService e ou algo que saia do comum, ai fico perdido...

    Neste caso via a rotina e não entendi qual código está certo e como utilizar o mesmo....

    esta seria minha dificuldade.

    Qual código devo baixar para meu projeto e como utilizar esta classe, tenho pronto uma chamada que pesquisei na Web para trazer o CEP funciona perfeitamente, mas não entendi como usar a classe que processa os dados vindos da Receita Federal.

    Preciso saber qual código está sem erros e como utilizar o mesmo, pode ser dado como exemplo um projeto vazio.

    Aguardo e agradeço..

    Thursday, October 30, 2014 10:54 PM
  • A resposta que esta marcada é o código funcional é só testar
    Friday, October 31, 2014 11:22 AM
  • Olá, não consegui fazer o código funcionar, retorna sempre :

    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>

    Alguém tem o código funcionando para me enviar por favor?

    Thursday, December 04, 2014 9:17 PM
  • Boa tarde Jefferson.

    Estou aprendendo C#. Me foi solicitado fazer um programa para consultar Dados do Cnpj do Cliente, no site da Receita. Eu encontrei a sua rotina e resolvi baixar, porém, está dando alguns erros. Espero que você possa me dar algumas dicas. Por Exemplo:

     ConsultaCnpj.Consulta(edCNPJ.Text, edCAPTCHA.Text); Nessa linha não está reconhecendo Consulta. 

     (ConsultaCnpj.ErroDetectado != null) Nessa linha não está reconhecendo ErroDesctado().

    ConsultaCnpj.PreencheFicha(cad); Nessa linha não está reconhecendo PreencheFicha().

     memoEdit2.Text = ConsultaCnpj.RetornoEmHtml(); Nessa Linha não está reconhecendo RetornoEmHtml().

     Bitmap bit = ConsultaCnpj.RecuperaCaptcha(); Nessa Linha não está reconhecendo RecuperaCaptcha().

     ConsultaCnpjReceita ConsultaCnpj = new ConsultaCnpjReceita(); Nessa linha ConsultaCnpjReceira é uma Tabela onde será gravado as informações?

    Desculpe a minha falta de conhecimento, mas é que eu estou precisando finalizar esse programa e tenho puco tempo.

    Obrigado.

    Sunday, January 25, 2015 5:03 PM
  • Alessandro,

    não consegui entender os exemplos e chegar a saber qual dos códigos acima que esta ok.. tendo em vista um deles faltam duas classes... ConsultaCnpjReceita() e CadastroCNPJ();

    na verdade gostaria de ter um exemplo já definido e testado, facilitaria muito o meu entendimento e assim estaria utilizando em minha aplicação... não consegui rodar pois faltam classes...

    fico no aguardo meus emails: valdir@iesi.inf.br e/ou suporte.vlr@gmail.com... se assim ainda não der certo, meu face é: valdirlealrocha

    grato e no aguardo..... ficarei agradecido.

    Thursday, February 12, 2015 12:10 PM
  • Valdir, 

    Nessa thread (https://social.msdn.microsoft.com/Forums/pt-BR/0bfad39e-b5ab-4889-a2e8-dfcc1a369e38/resolvido-consulta-cnpj-na-receita-federal-em-c?forum=vscsharppt&prof=required) tem um exemplo pra download que estava funcionando perfeitamente até o dia 11/02. Mas acho que a receita alterou alguma coisa e não está carregando o captcha. Estou estudando e qualquer coisa te aviso.

    Friday, February 13, 2015 1:47 PM
  • Se alguem tiver algum avanço na solução por favor compartilhem.....estou tentando encontrar como eles estão usando a sessão, pois me parece que mudaram até a pagina valida.asp...pois são outros parâmetros...

    Use ".NET"...Não é mais necessário reinventar a roda!!

    Friday, February 13, 2015 6:29 PM
  • Na verdade só mudou o nome de algumas tags, irei fazer a correção e depois posto, tenho outros programas que pegam esse mesmo captcha sem problemas até hoje, mais o problema não é pegar o captcha e sim manter o state para validação
    Friday, February 13, 2015 7:21 PM
  • Então mas pelo teste rapido que fiz não existe mas o hidden com o codigo da sessão, e nem existe a tag viewstate para enviar para a valida.asp.....bom estou no aguardo, também estou tentando achar uma solução...

    Use ".NET"...Não é mais necessário reinventar a roda!!

    Friday, February 13, 2015 7:50 PM
  • Obrigado
    Monday, February 16, 2015 11:28 AM

  • Antes da mudanca era possivel chamar a http://www.receita.fazenda.gov.br/scripts/captcha/Telerik.Web.UI.WebResource.axd?type=rca&guid=5086e3fc-ac04-4555-aa4e-5fead17f986b e o captcha sempre era o mesmo, porem com a mudanca agora imagem é gerada em http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp.

    Entao, quando voce chama a http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp, é necessario salvar a imagem gerada pela .../gerarCaptcha.asp com os dados obtidos, vc nao pode chamar a /gerarCaptcha.asp em separado, senao a imagem muda.

    Vou tentar desta maneira, lendo a Cnpjreva_Solicitacao2.asp e salvando a imagem gerada pela gerarCaptcha.asp, se alguem quiser ajudar, informe aqui o resultado ou me escreva (vassoleri@gmail.com)

    Vamos em frente...


    Tuesday, February 17, 2015 3:28 PM
  • Boa noite Pessoal,

    Estava tendo o mesmo problema que vocês e resolvi dar uma verificada.

    As modificações que realizei solucionaram o problema.

    Segue o esquema:

    1º Criar uma classe chamada CookieAwareWebClient

    using System;
    using System.Net;
    
    namespace ConsultaCNPJ
    {
        public class CookieAwareWebClient : WebClient
        {
            private CookieContainer _mContainer;
    
            public void SetCookieContainer(CookieContainer container)
            {
                _mContainer = container;
            }
    
            protected override WebRequest GetWebRequest(Uri address)
            {
                WebRequest request = base.GetWebRequest(address);
                var webRequest = request as HttpWebRequest;
                if (webRequest != null)
                {
                    webRequest.CookieContainer = _mContainer;
                    webRequest.KeepAlive = true;
                    webRequest.ProtocolVersion = HttpVersion.Version10;
                }
                return request;
            }
        }
    }

    2º Criar a classe ConsultaCNPJReceita, ela tem como base o fonte deste forum, porém realizei as modificações para suporte as atualizações das tags do site da Receita.

    using System;
    using System.Drawing;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace ConsultaCNPJ
    {
        public class ConsultaCNPJReceita
        {
            private readonly CookieContainer _cookies = new CookieContainer();
            private String urlBaseReceitaFederal = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/";
            private String paginaValidacao = "valida.asp";
            private String paginaPrincipal = "cnpjreva_solicitacao2.asp";
            private String paginaCaptcha = "captcha/gerarCaptcha.asp";
            
            public Bitmap GetCaptcha()
            {
                String htmlResult;
                using (var wc = new CookieAwareWebClient())
                {
                    wc.SetCookieContainer(_cookies);
                    wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/4.0 (compatible; Synapse)";
                    wc.Headers[HttpRequestHeader.KeepAlive] = "300";
                    htmlResult = wc.DownloadString(urlBaseReceitaFederal + paginaPrincipal);
                }
                if (htmlResult.Length > 0)
                {
                        var wc2 = new CookieAwareWebClient();
                        wc2.SetCookieContainer(_cookies);
                        wc2.Headers[HttpRequestHeader.UserAgent] = "Mozilla/4.0 (compatible; Synapse)";
                        wc2.Headers[HttpRequestHeader.KeepAlive] = "300";
                        byte[] data = wc2.DownloadData(urlBaseReceitaFederal + paginaCaptcha);
                        return new Bitmap(new MemoryStream(data));
                }
                return null;
            }
    
            public String Consulta(string aCNPJ, string aCaptcha)
            {
                var request = (HttpWebRequest)WebRequest.Create(urlBaseReceitaFederal + paginaValidacao);
                request.ProtocolVersion = HttpVersion.Version10;
                request.CookieContainer = _cookies;
                request.Method = "POST";
    
                string postData = "";
                postData = postData + "origem=comprovante&";
                postData = postData + "cnpj=" + new Regex(@"[^\d]").Replace(aCNPJ, string.Empty) + "&";
                postData = postData + "txtTexto_captcha_serpro_gov_br=" + aCaptcha + "&";
                postData = postData + "submit1=Consultar&";
                postData = postData + "search_type=cnpj";
    
                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();
                StreamReader stHtml = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));
                String retorno = stHtml.ReadToEnd();
    
                if (retorno.Contains("Verifique se o mesmo foi digitado corretamente"))
                    throw new System.InvalidOperationException("O número do CNPJ não foi digitado corretamente");
                if (retorno.Contains("Erro na Consulta"))
                    throw new System.InvalidOperationException("Os caracteres digitados não correspondem com a imagem");
                return retorno;
            }
        }
    }
    

    3ª Pra facilitar, segue o exemplo de como utilizo essas classes para realizar uma consulta:

    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 ConsultaCNPJ
    {
        public partial class frmConCNPJ : Form
        {
            public clsEmpresa empresa;
            private ConsultaCNPJReceita consulta;
    
            public frmConCNPJ()
            {
                InitializeComponent();
            }
    
            private void frmConCNPJ_Load(object sender, EventArgs e)
            {
                carregarCaptcha();
            }
    
            private void btnCancelar_Click(object sender, EventArgs e)
            {
                Close();
            }
    
            private void btnTrocarImagem_Click(object sender, EventArgs e)
            {
                carregarCaptcha();
            }
    
            public void carregarCaptcha()
            {
                consulta = new ConsultaCNPJReceita();
                ttbLetras.Text = "";
                ttbLetras.Focus();
                Cursor cursor;
                cursor = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
                Bitmap bit = consulta.GetCaptcha();
                if (bit != null)
                    picLetras.Image = bit;
                else
                    MessageBox.Show("Não foi possível recuperar a imagem de validação do site da Receita Federal");
                this.Cursor = cursor;
            }
    
            private void btnConsultar_Click(object sender, EventArgs e)
            {
                Cursor cursor;
                cursor = this.Cursor;
                try
                {
                    this.Cursor = Cursors.WaitCursor;
                    string tmp = consulta.Consulta(ttbCNPJ.Text, ttbLetras.Text);
    
                    if (tmp.Length > 0)
                    {
                        empresa = new clsEmpresa();
                        empresa.Cnpj = ttbCNPJ.Text;
                        empresa.Razaosocial = RecuperaColunaValor(tmp, Coluna.RazaoSocial);
                        empresa.Nomefantasia = RecuperaColunaValor(tmp, Coluna.NomeFantasia);
                        empresa.Endereco = RecuperaColunaValor(tmp, Coluna.EnderecoLogradouro);
                        empresa.Endereco += ", " + RecuperaColunaValor(tmp, Coluna.EnderecoNumero);
                        empresa.Bairro = RecuperaColunaValor(tmp, Coluna.EnderecoBairro);
                        empresa.Cep = RecuperaColunaValor(tmp, Coluna.EnderecoCEP);
                        empresa.Cnae = RecuperaColunaValor(tmp, Coluna.AtividadeEconomicaPrimaria);
                        //empresa.Cidade = RecuperaColunaValor(tmp, Coluna.EnderecoCidade);
                        //empresa.Estado = RecuperaColunaValor(tmp, Coluna.EnderecoEstado);
                        //Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    carregarCaptcha();
                }
    
                this.Cursor = cursor;
            }
    
    
    
            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;
            }
    
    
        }
    }

    Qualquer dúvida me coloca a disposição.

    joaopaulosl@hotmail.com

    • Proposed as answer by Diogenes Nonato Wednesday, February 18, 2015 5:46 PM
    Wednesday, February 18, 2015 2:56 AM
  • Rapaz, muito obrigado joão Paulo!!!

    Deu certinho!!! parabéns!!!


    Use ".NET"...Não é mais necessário reinventar a roda!!

    Wednesday, February 18, 2015 5:35 PM
  • Estou disponibilizando um projeto completo Windows Forms com o código do colega joaopaulosl   aqui
    Thursday, February 19, 2015 12:48 PM
  • Cara sou iniciante em ASP.NET

    Poderia me dar umas dicas de como uso ele com um webform,

    Até então a pouca experiência que tenho é em VB e esse e em C#.

    Estou me atrapalhando um monte para substituir o recurso do bitmap

    Thursday, February 19, 2015 2:05 PM
  • Veja a postagem do Diogenes Nonato nessa Thread ele fez usando ASP.net, para converter codigo C# para VB.net e vice-versa tem esse link aqui
    • Proposed as answer by Diogenes Nonato Thursday, February 19, 2015 4:24 PM
    Thursday, February 19, 2015 2:13 PM
  • Fala Thiago!

    Como assim substituir o recurso bitmap? em web form eu utilizo a tag asp:Image.

    Exemplo aspx:

    <asp:Image id="imgCaptcha" runat="server" /> 

    Code:

    byte[] data = wc2.DownloadData(urlBaseReceitaFederal + paginaCaptcha);

    imgCaptcha.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(data, 0, data.Length);

    Se precisar de mais detalhes me avisa.

    Abs.

    • Proposed as answer by Diogenes Nonato Thursday, February 19, 2015 4:17 PM
    Thursday, February 19, 2015 4:16 PM
  • Show de bola pessoal

    Salvaram minha vida. :-)

    Disponibilizei o projeto na minha necessidade com a ajuda de vocês neste link:

    Especificações deste recurso para este projeto:

    • Desenvolvido em ASP.NET para WebForm com C#;
    • Recebe o CNPJ através do método GET ex: ( localhost:55676/frmConCNPJ.aspx?cnpj=00000000000191);
    • Retorna valores no formato JSON;
    • O método de obtenção do CAPTCHA está atualizado conforme a atualização no site da receita em Janeiro de 2015. (100% Funcional)

    http://tdaweb.com.br/base-de-conhecimento/missao-consulta-cnpj-site-da-receita-em-asp-net-para-webform-e-c/

    Agradeço de coração 

    Valeu Abraço

    Monday, March 23, 2015 2:26 PM
  • Parabéns aos colegas que disponbilizaram o código, testei e funcionou perfeitamente, ainda com o intuito de ajudar, fiz o seguinte para facilitar vb.net :

    Private oConsulta As ConsultaCNPJReceita = Nothing

    Dim strConsulta = oConsulta.Consulta("cnpjprocurado", txtCaptcha.Text)
    If Not strConsulta.Trim.Equals("") Then WebBrowser1.DocumentText = strConsulta

    e depois na hora de ler:

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            If WebBrowser1.StatusText.Equals("Concluído") Then
                For Each elemento In WebBrowser1.Document.GetElementsByTagName("font")
                    Select Case elemento.innerText
                        Case "NOME EMPRESARIAL "
                            txtRazaoSocial.Text = elemento.NextSibling.NextSibling.innerText
                        Case "TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA) "
                            txtNomeFantasia.Text = elemento.NextSibling.NextSibling.innerText
                        Case "DATA DE ABERTURA "
                            txtDtAbertura.Text = elemento.NextSibling.NextSibling.innerText
                        Case "LOGRADOURO "
                            txtEndereco.Text = elemento.NextSibling.NextSibling.innerText
                        Case "NÚMERO "
                            txtEndereco.Text = txtEndereco.Text & " " & elemento.NextSibling.NextSibling.innerText
                        Case "COMPLEMENTO "
                            txtComplemento.Text = elemento.NextSibling.NextSibling.innerText
                        Case "BAIRRO/DISTRITO "
                            txtBairro.Text = elemento.NextSibling.NextSibling.innerText
                        Case "MUNICÍPIO "
                            txtCidade.Text = elemento.NextSibling.NextSibling.innerText
                        Case "UF "
                            txtUF.Text = elemento.NextSibling.NextSibling.innerText
                        Case "CEP "
                            txtCep.Text = elemento.NextSibling.NextSibling.innerText
                        'Case "CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL "

                        Case "SITUAÇÃO CADASTRAL "
                            txtSituacao.Text = elemento.NextSibling.NextSibling.innerText
                        Case "DATA DA SITUAÇÃO CADASTRAL "
                            txtDtSituacao.Text = elemento.NextSibling.NextSibling.innerText
                        Case "MOTIVO DE SITUAÇÃO CADASTRAL "
                            txtMotivoSituacao.Text = elemento.NextSibling.NextSibling.innerText

                            'Case "ENTE FEDERATIVO RESPONSÁVEL (EFR) "
                            'Case "CÓDIGO E DESCRIÇÃO DA NATUREZA JURÍDICA "
                            'Case "NÚMERO DE INSCRIÇÃO "
                            'Case "CÓDIGO E DESCRIÇÃO DAS ATIVIDADES ECONÔMICAS SECUNDÁRIAS "
                            'Case "ENDEREÇO ELETRÔNICO "
                            'Case "TELEFONE "
                            'Case "SITUAÇÃO ESPECIAL "
                            'Case "DATA DA SITUAÇÃO ESPECIAL"
                    End Select
                Next
            End If
        End Sub


    • Edited by Mago01 Wednesday, March 25, 2015 6:28 PM alterar
    Wednesday, March 25, 2015 6:26 PM