2012-11-15 20 views
6

Trước tiên, hãy tha thứ cho sự ngây thơ của tôi với chủ đề này. Tôi là một lập trình viên đã nghỉ hưu đã bắt đầu trước khi DOS xuất hiện. Tôi không phải là chuyên gia về ASP.NET. Một phần của những gì tôi cần biết là những gì tôi cần biết. (Nếu yo theo tôi ...)Giao diện điều khiển ứng dụng để đăng nhập vào trang web ASP.NET

Vì vậy, tôi muốn đăng nhập vào một trang web và loại bỏ một số nội dung. Sau khi xem xét nguồn HTML với notepad và fiddler2, rõ ràng với tôi rằng trang web được triển khai bằng các công nghệ ASP.NET.

Tôi bắt đầu bằng cách thực hiện rất nhiều google'ing và đọc tất cả mọi thứ tôi có thể tìm thấy về viết scrapers màn hình trong C#. Sau khi một số điều tra và nhiều nỗ lực, tôi nghĩ rằng tôi đã đi đến kết luận rằng nó không phải là dễ dàng.

Điểm mấu chốt của vấn đề (như tôi thấy bây giờ) là ASP cung cấp nhiều cách để một lập trình viên duy trì trạng thái. Cookie, viewstate, session vars, page vars, get và post params, vv Cộng với lập trình viên có thể chia công việc giữa máy chủ và kịch bản máy khách. Một máy khách web phong phú như IE hoặc Safari hoặc Chrome hoặc Firefox biết cách xử lý bất cứ điều gì mà lập trình viên viết (và khung công tác ASP thực hiện dưới trang bìa).

WebClient không phải là ứng dụng web phong phú. Nó thậm chí không biết làm thế nào để thực hiện các tập tin cookie.

Vì vậy, tôi đang gặp khó khăn. Một cách để đi là cố gắng đảo ngược kỹ sư tất cả các tính năng của ứng dụng khách phong phú mà ứng dụng ASP đang mong đợi và viết một WebClient trên lớp steroid bắt chước một khách hàng phong phú cũng đủ để đăng nhập.

Hoặc tôi có thể thử nhúng IE (hoặc một số ứng dụng khách phong phú khác) vào ứng dụng của tôi và hy vọng giao diện tiếp xúc đủ phong phú để tôi có thể điền vào một trường tên người dùng và mật khẩu theo lập trình và POST lại biểu mẫu. (Và truy cập luồng phản hồi để tôi có thể phân tích cú pháp HTML để xóa dữ liệu mà tôi đang theo dõi ...)

Hoặc tôi có thể tìm kiếm một số quyền kiểm soát của bên thứ ba sẽ giàu hơn rất nhiều so với WebClient.

Có ai có thể làm sáng tỏ một số hiểu biết sâu sắc về nơi tôi nên tập trung sự chú ý của mình không?

Đây là trải nghiệm học tập như một dự án. Điều đó nói rằng, tôi thực sự muốn tự động đăng nhập và truy xuất thông tin từ trang đích.

+0

Xem http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class cách sử dụng cookie với WebClient. – abatishchev

+0

Những gì bạn đang làm được gọi là [thu thập dữ liệu web] (http://stackoverflow.com/questions/tagged/web-crawler) – abatishchev

Trả lời

3

Dưới đây là một chức năng ví dụ tôi sử dụng để đăng nhập vào trang web và nhận được cookie của tôi

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

Và đây là một ví dụ gọi:

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

Với Firefox, bạn có thể sử dụng phần mở rộng HTTP Headers biết thông số nào được đặt theo bài đăng và bạn sửa đổi các giá trị biến:

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

Để matc h với thông số trên trang web đích.

Nếu bạn quyết định Sống-HTTP Headers cho firefox, khi bạn đăng nhập vào trang web của bạn sẽ nhận được thông tin bài từ tiêu đề, một cái gì đó như thế:

GET/HTTP/1.1 Host: www .microsoft.com Tác nhân người dùng: Mozilla/5.0 (Windows NT 6.1; rv: 15.0) Gecko/20100101 Firefox/15.0.1 Chấp nhận: văn bản/html, ứng dụng/xhtml + xml, ứng dụng/xml; q = 0.9, /; q = 0,8 Chấp nhận-Ngôn ngữ: es-es, es; q = 0,8, vi-ta; q = 0,5, vi; q = 0,3 Chấp nhận mã hóa: gzip, giảm phát Kết nối: giữ nguyên Cookie: WT_FPC = id = 82.144.112.152-154450144.30258861: lv = 1351580394112: ss = 1351575867559; WT_NVR_RU = 0 = msdn: 1 =: 2 =; omniID = 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 = vi-US

1

Tôi nghi ngờ bạn có thể xây dựng tiện ích mở rộng của Chrome có thể thực hiện việc này cho bạn.

Nhân tiện, bạn không phải là "chuyên gia bảo mật" phải không?

0

Tại sao bạn không sử dụng IE, Tự động hóa IE trong Windows Forms rất đơn giản, cộng với bạn cũng có thể dễ dàng xử lý proxy.