2012-11-07 168 views
2

要進入頁面,我需要密碼。我有密碼,我可以進入該頁面。如何下載HTTPS網頁的內容?

DownloadString(URL)函數正在下載LOG-IN頁面的內容,而不是我想要的實際頁面。爲什麼?

using (var client = new WebClient()) 
      { 
       var credentials = new NetworkCredential { UserName = "username", Password = "password" }; 
       client.Credentials = credentials; 

       string pageContents = client.DownloadString(url); 

       if (pageContents.Contains("cheetah")) 
       { 
        MessageBox.Show("yes!"); 
       } 
       else 
       { 
        MessageBox.Show("No"); 
       } 
      } 

以上是獲取登錄頁面的內容,而不是我真正想要的頁面。我如何通過這個?

+2

如果它指引您登錄頁面,那麼這意味着該網站正在使用基於表單/ cookie的身份驗證。您正在發送HTTP基本身份驗證憑據,這是不同的,不會起作用... – McGarnagle

+0

我必須如何才能使其工作?你可以給我一個關於如何使用cookies的例子嗎? –

+1

我想你可以嘗試一個黑客,你做了一個HTTP Post請求,模仿登錄表單正在做什麼(假設他們不使用Capcha?)。然後你必須得到你回來的cookie,並將其添加到第二個請求。我不確定這種方法是否可行。 – McGarnagle

回答

3

當一個沒有認證的客戶端(WebClient.DownloadString)是要求的頁面,它通常會被重定向到登錄形式在那裏他們可以進行身份​​驗證。一旦證書通過並確認,客戶通常會被帶回到他們最初請求的頁面。

要獲得通過這一點,你需要模擬驗證,通常涉及通過用戶名和密碼,接受Cookie,並使用進一步請求的cookie。在非常基礎的層面,這應該說明的方法:

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

namespace HttpsRequest 
{ 
    public static class Program 
    { 
     public static void Main(string[] args) 
     { 
      var cookieContainer = new CookieContainer(); 
      var loginRequest = WebRequest.CreateHttp("https://your.url.net/login"); 
      loginRequest.CookieContainer = cookieContainer; 
      var response = loginRequest.Post("Login=foo&Password=bar"); 
      Debug.Assert(response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.NoContent); 

      var homeRequest = WebRequest.CreateHttp("https://your.url.net/home"); 
      homeRequest.CookieContainer = cookieContainer; 
      Debug.Assert(response.StatusCode == HttpStatusCode.OK); 
      homeRequest.GetResponse().Body(); 
     } 

     internal static HttpWebResponse Post(this HttpWebRequest request, string data) 
     { 
      try 
      { 
       request.Method = "POST"; 
       request.ContentType = "application/x-www-form-urlencoded"; 
       var encoding = new ASCIIEncoding(); 
       var dataAsBytes = encoding.GetBytes(data); 
       request.ContentLength = dataAsBytes.Length; 
       var stream = request.GetRequestStream(); 
       stream.Write(dataAsBytes, 0, dataAsBytes.Length); 
       stream.Close(); 
       return (HttpWebResponse)request.GetResponse(); 
      } 
      catch (WebException we) 
      { 
       return (HttpWebResponse)we.Response; 
      } 
     } 

     internal static string Body(this WebResponse response) 
     { 
      var stream = response.GetResponseStream(); 
      using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8"))) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
    } 
} 

要使其工作,你可能想使用招,螢火,或類似看看發送到從瀏覽器的網站的實際要求工具,然後嘗試儘可能多地模擬。例如,該網站可能需要額外或不同的帖子字段,HTTP標頭或具有無效的SSL證書。