2013-02-22 65 views
1

所以,我特林把一個信息,一個文本框,在比較特殊的文本框,CNPJ的一個網站:自動在文本框中添加文本,當我打開一個網站

http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao.asp

但我沒有得到......所以,我曾嘗試......我試圖把CNPJ值的最後一環的,就像這樣:

http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao.asp?cnpj=00495835000160

,但沒有把價值上的文本框的網站...

我怎樣才能讓剛剛在鏈接與網站(whiout位在網站上的CNPJ值進入。 ..)

,並在C#我已經試過這樣:

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace ReceitaFederal 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       WebRequest request = WebRequest.Create("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao.asp"); 

       string strPost = "cnpj=00495835000160"; 

       request.Method = "POST"; 
       request.ContentLength = strPost.Length; 
       request.ContentType = "application/x-www-form-urlencoded"; 

       StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
       writer.Write(strPost); 

       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

       Stream dataStream = response.GetResponseStream(); 

       StreamReader reader = new StreamReader(dataStream); 

       string responseFromServer = reader.ReadToEnd(); 

       reader.Close(); 
       dataStream.Close(); 
       response.Close(); 

       Console.WriteLine(responseFromServer); 
      } 
      catch (Exception exec) 
      { 
       Console.WriteLine(exec.GetType() + "" + exec.Message); 
      } 
     } 
    } 
} 
+0

該網站擁有captcha保護,你可以做的任何事情都會解決。 – ChrisBint 2013-02-22 14:43:27

回答

2

解決!!!首先添加此cookie的容器:

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; 
     } 
    } 
} 

然後編輯你的代碼是:

using System; 
using System.Drawing; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace ConsultaCNPJ 
{ 
    public class ConsultaCNPJBroker 
    { 
     private readonly CookieContainer _cookies = new CookieContainer(); 
     public String DominioReceitaFederal = "http://www.receita.fazenda.gov.br"; 
     public String GetDataReceitaFederal = "/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp"; 
     public String PostDataReceitaFederal = "/pessoajuridica/cnpj/cnpjreva/valida.asp"; 
     private String _viewState; 

     public Bitmap GetCaptcha() 
     { 
      const string strViewState = "<input type=hidden id=viewstate name=viewstate value='"; 
      const string strImagemCaptcha = "<img border='0' id='imgcaptcha' alt='Imagem com os caracteres anti robô' src='"; 
      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(DominioReceitaFederal + GetDataReceitaFederal); 
      } 

      if (htmlResult.Length > 0) 
      { 
       _viewState = htmlResult; 

       int posString = _viewState.IndexOf(strViewState, StringComparison.Ordinal); 
       _viewState = _viewState.Substring(posString + strViewState.Length); 
       posString = _viewState.IndexOf("'>", StringComparison.Ordinal); 
       _viewState = _viewState.Substring(0, posString); 

       String urlImagemCaptcha = htmlResult; 
       posString = urlImagemCaptcha.IndexOf(strImagemCaptcha, StringComparison.Ordinal); 
       urlImagemCaptcha = urlImagemCaptcha.Substring(posString + strImagemCaptcha.Length); 
       posString = urlImagemCaptcha.IndexOf("'>", StringComparison.Ordinal); 
       urlImagemCaptcha = urlImagemCaptcha.Substring(0, posString); 
       urlImagemCaptcha = urlImagemCaptcha.Replace("amp;", ""); 

       if (urlImagemCaptcha.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(DominioReceitaFederal + urlImagemCaptcha); 

        return new Bitmap(
         new MemoryStream(data)); 
       } 
       return null; 
      } 
      _viewState = ""; 
      return null; 
     } 

     public Stream Consulta(string aCNPJ, string aCaptcha, bool removerEspacosDuplos) 
     { 
      var request = (HttpWebRequest) WebRequest.Create(DominioReceitaFederal + PostDataReceitaFederal); 
      request.ProtocolVersion = HttpVersion.Version10; 
      request.CookieContainer = _cookies; 
      request.Method = "POST"; 

      string fviewstate = _viewState; 
      fviewstate = Uri.EscapeDataString((fviewstate)); 

      string postData = ""; 
      postData = postData + "origem=comprovante&"; 
      postData = postData + "viewstate=" + fviewstate + "&"; 
      postData = postData + "cnpj=" + new Regex(@"[^\d]").Replace(aCNPJ, string.Empty) + "&"; 
      postData = postData + "captcha=" + aCaptcha + "&"; 
      postData = postData + "captchaAudio=&"; 
      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(); 
      return response.GetResponseStream();     
     } 
    } 
} 

這就是它!

特別感謝我的好朋友CunhaW!

用法:

首先創建一個圖片和一個文本框和這樣

private readonly ConsultaCNPJBroker _broker = new ConsultaCNPJBroker(); 
this.ImgCaptcha = new System.Windows.Forms.PictureBox(); 
this.TbxCaptcha = new System.Windows.Forms.TextBox(); 

的經紀人驗證碼形式然後,像2步查詢中使用,首先獲得驗證碼,然後做與驗證碼查詢

private void UpdateCaptcha() 
{ 
    ImgCaptcha.Image = _broker.GetCaptcha(); 
    TbxCaptcha.Text = string.Empty; 
} 

用戶交互這裏需要解決的驗證碼,並填寫文本框和終於

private void BtnExecute_OnClick(object sender, EventArgs e) 
{ 
     var pessoaJuridica = _broker.Consulta(TbxCNPJ.Text, TbxCaptcha.Text, true); 
     // here you can see props like pessoaJuridica.CNPJ 
} 
+0

WOW !!! 所以,但要使用該cde ??? – Alexandre 2013-07-24 16:27:45

+0

已更新,以顯示如何使用... – 2014-07-09 13:46:00

0

你必須確保目標網站支持那種要求你正在嘗試做的。

如果不是,你是運氣不好。請記住,Web應用程序的實施是決定規則的人,而不是你自己。

此外,它看起來像你試圖從巴西政府網站獲得信息。通常,這種類型的網站具有防止您試圖實現的機制,例如captchas和域驗證。

好消息是,政府網站通常也會發布有關如何訪問公共Web服務的規則和手冊。但是,您通常還需要獲得相關權限。

+0

所以,我不想把信息放在captcha上,我只是想把信息放在CNPJ – Alexandre 2013-02-22 14:52:39

+0

@Alexandre你不能。網站上的安全機制(captcha)只會允許人們與該網頁進行交互。 – ChrisBint 2013-02-22 15:10:44

1

也許這可以幫助您,它不工作尚未...但幾乎沒有...

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(); 
     } 

    } 
} 
+1

Aqui tem um exelo em delphi ... http://www.fsist.com.br/ACBrCNPJ.rar – 2013-07-23 04:22:32

0

該網頁使用了框架:

<frame name="top" scrolling="no" frameborder="0" marginheight="0" noresize="true" target="contents" src="cabecalho.htm" marginwidth="0" marginheight="0"> 
<frame frameborder="0" name="main" SRC="cnpjreva_solicitacao2.asp" scrolling="auto" noresize="false" marginheight="0" marginwidth="0"> 

主要幀包含cnpjreva_solicitacao2.asp,所以請撥打http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp?cnpj=00495835000160(請參閱pag中的 e文件名稱)將顯示主參數的內容,CNPJ填充爲主參數。

0

我說,而不是起草的結果代碼, 你可以注入JavaScript。

例如 打開你貼 http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao.asp

開放JS控制檯頁面,鍵入以下內容:

document.getElementsByName("main")[0].contentDocument.getElementsByName("cnpj")[0].value = "MyNewValue"

通知,形式是frame元素中,所以你需要獲得框架元件,然後輸入元素。

您可以通過Web瀏覽器API執行相同操作。

好運與解決CAPTCHA