2012-11-15 62 views
6

首先,請原諒我對這個問題的天真。我是一位退休的程序員,在DOS出現之前就開始了。我不是ASP.NET的專家。我需要知道的一部分是我需要知道的。 (如果喲跟着我...)控制檯應用程序登錄到ASP.NET網站

所以我想登錄到一個網站和刮一些內容。使用記事本和fiddler2查看HTML源代碼後,我很清楚該網站是使用ASP.NET技術實現的。

我開始做了很多谷歌和閱讀一切,我可以找到關於在C#中編寫屏幕抓取工具。經過一番調查和多次嘗試,我認爲我得出的結論是,這並不容易。

問題的關鍵(正如我現在看到的那樣)是ASP爲程序員提供了很多維護狀態的方法。 Cookies,視圖狀態,會話變量,頁面變量,獲取和發佈參數等等。另外,程序員可以在服務器和客戶端腳本之間劃分工作。諸如IE或Safari,Chrome或Firefox等豐富的Web客戶端知道如何處理程序員寫的任何內容(以及ASP框架在封面下實現的內容)。

WebClient不是一個豐富的Web客戶端。它甚至不知道如何實施cookie。

所以我陷入了僵局。一種方法是嘗試對ASP應用程序期望的胖客戶端的所有功能進行逆向工程,並在類固醇類上編寫一個Web客戶端,以模仿富客戶端,以便能夠登錄。

或者我可以嘗試將IE(或其他富客戶端)嵌入到我的應用程序中,並希望公開的界面足夠豐富,以便我可以通過編程方式填寫用戶名和密碼字段並將表單發回。 (並訪問響應流,這樣我就可以解析HTML以剔除我之後的數據...)

或者我可以尋找一些第三方控件,這將比WebClient更豐富。

任何人都可以對我應該把注意力集中在哪裏有一些敏銳的見解嗎?

這是一個像項目一樣多的學習體驗。也就是說,我真的想要自動從目標網站進行登錄和信息檢索。

+0

請參閱http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class如何在WebClient中使用Cookie。 – abatishchev

+0

你在做什麼叫[網頁爬行](http://stackoverflow.com/questions/tagged/web-crawler) – abatishchev

回答

3

在這裏,我用它來登錄網站,並讓我的餅乾

string loginSite(string url, string username, string password) 
     { 
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
      string cookie = ""; 

      //this values will change depending on the website 
      string values = "vb_login_username=" + username + "&vb_login_password=" + password 
           + "&securitytoken=guest&" 
           + "cookieuser=checked&" 
           + "do=login"; 
      req.Method = "POST"; 
      req.ContentType = "application/x-www-form-urlencoded"; 
      req.ContentLength = values.Length; 
      CookieContainer a = new CookieContainer(); 
      req.CookieContainer = a; 
      System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error 
      using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) { writer.Write(values); } 
      HttpWebResponse c = (HttpWebResponse)req.GetResponse(); 
      Stream ResponseStream = c.GetResponseStream(); 
      StreamReader LeerResult = new StreamReader(ResponseStream); 
      string Source = LeerResult.ReadToEnd(); 


      foreach (Cookie cook in c.Cookies) { cookie = cookie + cook.ToString() + ";"; } 
      return cookie; 
     } 

這裏的呼叫例如一個例子功能:

string Cookie = loginSite("http://theurl.comlogin.php?s=c29cea718f052eae2c6ed105df2b7172&do=login", "user", "passwd"); 

      HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.theurl.com"); 
      //once you got the cookie you add it to the header. 

      req.Headers.Add("cookie", Cookie); 
      HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
      using (Stream respStream = response.GetResponseStream()) 
      { 
       using (StreamReader sr = new StreamReader(respStream)) 
       { 
        string s = sr.ReadToEnd(); 
        HtmlReturn = s; 
        // System.Diagnostics.Debugger.Break(); 
       } 
      } 

與Firefox,你可以使用擴展HTTP報頭就知道什麼參數正在通過郵寄設置,並且您修改了變量值:

string values = "vb_login_username=" + username + "&vb_login_password=" + password 
           + "&securitytoken=guest&" 
           + "cookieuser=checked&" 
           + "do=login"; 

To matc h在目標網站上的參數。

如果你決定住-HTTP報頭用於Firefox,當您登錄到該網站,您將得到 從報頭後的信息,這樣的事情:

GET/HTTP/1.1主機:萬維網.microsoft.com User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:15.0)Gecko/20100101 Firefox/15.0.1 Accept: text/html,application/xhtml + xml,application/xml; q = 0。9,/; q = 0.8 Accept-Language:es-es,es; q = 0.8,en-us; q = 0.5,en; q = 0.3 Accept-Encoding: gzip,deflate Connection:keep-alive Cookie: WT_FPC = id = 82.144.112.152-154450144.30258861:lv = 1351580394112:ss = 1351575867559; WT_NVR_RU = 0 = msdn:1 =:2 =; omn​​iID = 0d2276c2_bbdd_4386_a11d_f8da1dbc5489; MUID = 349E06C547426937362B02CC434269B9; MC1 = GUID = 47b2ed8aeea0de4797d3a40cf549dcbb & HASH = 8aed & LV = 201210 & V = 4 & LU = 1351608258765; A = I & I = AxUFAAAAAAALBwAAukh4HjpMmS4eKtKpWV0ljg !! & V = 4; msdn = L = zh-CN

1

我懷疑你可能會建立一個可以爲你做到這一點的Chrome擴展。

順便說一下,你不是「安全專家」嗎?

0

爲什麼不使用IE,Windows Forms中的自動化IE非常簡單,再加上你也可以輕鬆處理代理。

相關問題