2011-02-07 27 views
5

và trong khi tôi đã tìm thấy nhiều bài viết và thông tin khác về cách GET và POST bằng cách sử dụng HttpWebRequest và Response , Tôi thấy mình gặp khó khăn khi làm việc như tôi mong đợi họ làm việc.Làm cách nào để đăng nhập, điều hướng và trả lại dữ liệu từ trang web được bảo vệ, cho đến giờ mọi thứ tôi đang làm không hoạt động

Tôi đã chơi với một số ý tưởng mà tôi đã tìm thấy nhưng cho đến nay, không có gì đang làm việc ... Tôi sẽ gửi mã của tôi:

private void start_post() 
    { 
     string username = txtUser.Text; 
     string password = txtPassword.Text; 
     string strResponce; 
     byte[] buffer = Encoding.ASCII.GetBytes("username="+username+"&password="+password); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text); 
     WebReq.Method = "POST"; 
     //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     WebReq.Headers.Add("Translate", "F"); 
     WebReq.AllowAutoRedirect = true; 
     WebReq.CookieContainer = cookieJar; 
     WebReq.KeepAlive = true; 
     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 
     Stream PostData = WebReq.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     //txtResult.Text = WebResp.StatusCode.ToString() + WebResp.Server.ToString(); 

     Stream answer = WebResp.GetResponseStream(); 
     StreamReader _answer = new StreamReader(answer); 
     strResponce = _answer.ReadToEnd(); 
     //txtResult.Text = txtResult.Text + _answer.ReadToEnd(); 

     answer.Close(); 
     _answer.Close(); 

     foreach (Cookie cookie in WebResp.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 

     if (strResponce.Contains("Log On Successful") || strResponce.Contains("already has a webseal session")) 
     { 
      MessageBox.Show("Login success"); 
      foreach (Control cont in this.Controls) 
      { 
       cont.Visible = true; 
      } 
     } 
     else 
     { 
      MessageBox.Show("Login Failed."); 
     } 


    } 

đây trong mã, tôi có thể nhận được tất cả các cách để phía dưới, và vẫn nhận được một đăng nhập thất bại khi tôi điều hướng đến http://www.comicearth.com (trang web của riêng tôi, php và apache) Tôi tạo ra một hình thức và từ hình thức đó, tôi gõ vào mật khẩu và tên người dùng. Khi nó làm điều này, nó nói thất bại, đó là ok. Tôi cũng đang sử dụng Fidder để xem xem tất cả những gì đang xảy ra.

Vì vậy, từ điều này, tôi biết tôi đang làm điều gì sai từ mã bên dưới.

Tuy nhiên, khi tôi tìm đến một ứng dụng web, tôi nhận được lỗi sau trên dòng: "Content-Length hoặc Encoding chunked không thể được đặt cho một hoạt động mà không ghi dữ liệu"

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 

Tôi đang cố gắng để tìm thấy những gì là sai, và tất cả mọi thứ tôi đã nói rằng đó là vì một chuyển hướng 302 ...

Vì vậy, nhìn ở Fiddler tôi có thể thấy sự khác biệt rất lớn giữa khi tôi cố gắng gửi dữ liệu và khi tôi đăng nhập qua một trang web. Vì vậy, tôi biết tôi không làm đủ, nhưng tôi không biết nơi để tìm.

Mục tiêu của tôi là tạo ứng dụng có thể đăng nhập vào trang web và sau đó thông qua tùy chọn tìm kiếm của họ, rút ​​dữ liệu cần thiết mà hiện tại chúng tôi có người dùng làm theo cách thủ công, nếu tôi có thể tự động hóa một số công việc tẻ nhạt thực sự sẽ giúp mọi người. Tuy nhiên, tôi hiện đang bị kẹt khi đăng nhập, hiểu cookie, v.v. Ngoài ra, trang web sử dụng khung, tôi không biết đó có phải là vấn đề hay không, nhưng tôi đã đoán là tôi sẽ đăng thông tin đó, chỉ trong trường hợp đó là một trở ngại khác mà tôi chưa từng gặp.

Hãy cho tôi biết nếu bạn cần tôi xem thêm mã, hiện tại tôi đang sử dụng httpwebrequest và httpwebresponse và tôi đã đọc thông tin khác về ứng dụng khách web.

Tôi đã tải xuống và đã chơi xung quanh với htmlagilitypack nhưng tại thời điểm này không chắc chắn tôi là 100% tốt về cách mà tất cả các công trình là tốt.

Nếu bạn biết về bất kỳ bài viết hay nào hoặc thông tin khác đề cập đến chủ đề này sâu hơn hoặc có bất cứ điều gì mà tôi có thể thử, hãy cho tôi biết.

Cảm ơn bạn rất nhiều vì đã dành thời gian.

Cập nhật bằng mã mới, xem nhận xét của tôi bên dưới: - Ok, tôi phát hiện ra rằng do chuyển hướng tôi nhận được một thông báo lỗi: "Nội dung dài hoặc mã hóa chunked vv ..." và vì vậy tôi bật allowAutoRedirect = false và bây giờ tôi tìm thẻ "location", và chuyển hướng bản thân mình, v.v., đã loại bỏ thông báo này, tuy nhiên, tôi vẫn chưa đăng nhập vào trang web, điều này thật đáng thất vọng và tôi không thể tại sao tại thời điểm này.: S

private void start_post2() 
    { 
     string username = txtUser.Text; 
     string password = txtPassword.Text; 
     Uri link = new Uri(txtLink.Text); 
     string postArgs = string.Format(@"userId={0}&password={1}", username, password); 
     byte[] buffer = Encoding.ASCII.GetBytes(postArgs); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text); 
     WebReq.Method = "POST"; 
     //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     //WebReq.ClientCertificates.Add("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); 
     WebReq.AllowAutoRedirect = false; 
     WebReq.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
     WebReq.Accept = "*/*"; 
     //WebReq.Headers.Add(HttpRequestHeader.Cookie, cookieJar); 
     WebReq.CookieContainer = cookieJar; 
     WebReq.KeepAlive = true; 
     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 
     Stream PostData = WebReq.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     if (WebResp == null) throw new Exception("Response is null"); 

     foreach (Cookie cookie in WebResp.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 

     if (!string.IsNullOrEmpty(WebResp.Headers["Location"])) 
     { 
      string newLocation = WebResp.Headers["Location"]; 

      //Request the new location 
      WebReq = (HttpWebRequest)WebRequest.Create(newLocation); 
      WebReq.Method = "GET"; 
      WebReq.ContentType = "application/x-www-form-unlencoded"; 
      WebReq.AllowAutoRedirect = false; 
      WebReq.CookieContainer = cookieJar; 
      WebReq.CookieContainer.Add(WebResp.Cookies); 

      buffer = Encoding.ASCII.GetBytes("userId=" + username + "&password=" + password); 

      WebReq.ContentLength = buffer.Length; 
      PostData = WebReq.GetRequestStream(); 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 

      WebResp = (HttpWebResponse)WebReq.GetResponse(); 

      foreach (Cookie cookie in WebResp.Cookies) 
      { 
       cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
       //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
      } 
     } 
     else if (!string.IsNullOrEmpty(WebResp.Headers["Set-Cookie"])) 
     { 
      // thinking... 
     } 

     foreach (Cookie cookie in cookieJar.GetCookies(link)) 
     { 
      MessageBox.Show(cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString()); 
     } 

     StreamReader sr = new StreamReader(WebResp.GetResponseStream()); 
     string responseHtml = sr.ReadToEnd().Trim(); 

     SearchPatient(WebReq, username, password); 

    } 
+1

CẬP NHẬT: Ok, tôi phát hiện ra rằng do chuyển hướng tôi nhận được một thông báo lỗi: "Nội dung dài hoặc mã hóa chunked vv ..." và vì vậy tôi đã bật allowAutoRedirect = false và bây giờ tôi tìm "vị trí" và chuyển hướng bản thân mình, v.v. đã loại bỏ thông báo này, tuy nhiên, tôi vẫn chưa đăng nhập vào trang web, đó là disa ppointing và tôi không thể hiểu tại sao tại thời điểm này. : S –

Trả lời

4

Nếu nó là một ứng dụng Winform và ứng dụng chỉ là một màn hình-scraper và không phải là một ứng dụng rất lớn, U có thể sử dụng Watin để thực hiện các scrapping

đây là link cho việc bắt đầu

+0

Cảm ơn !!! Đây là những gì tôi cần. :) –

Các vấn đề liên quan