2012-11-15 13 views
6

Bitte entschuldigen Sie meine Naivität mit diesem Thema. Ich bin ein pensionierter Programmierer, der vor DOS gestartet wurde. Ich bin kein Experte für ASP.NET. Ein Teil dessen, was ich wissen muss, ist, was ich wissen muss. (Wenn Sie mir folgen ...)Konsolen-App zur Anmeldung bei der ASP.NET-Website

Also ich möchte auf einer Website einloggen und einige Inhalte scrape. Nach dem Betrachten der HTML-Quelle mit Notepad und fiddler2 ist es für mich klar, dass die Site mit ASP.NET-Technologien implementiert ist.

Ich begann mit viel google'ing und las alles, was ich über das Schreiben von scraper in C# finden konnte. Nach einigen Nachforschungen und vielen Versuchen bin ich zu dem Schluss gekommen, dass es nicht einfach ist.

Der Kern des Problems (wie ich es jetzt sehe) ist, dass ASP viele Möglichkeiten für einen Programmierer bietet, den Zustand zu erhalten. Cookies, Viewstate, Session-Vars, Seiten-Vars, Get-und Post-Params usw. Außerdem kann der Programmierer die Arbeit zwischen Server- und Client-Scripting aufteilen. Ein reicher Web-Client wie IE oder Safari oder Chrome oder Firefox weiß, wie er mit dem, was der Programmierer schreibt, umgehen kann (und das ASP-Framework implementiert unter dem Deckblatt).

WebClient ist kein Rich Web Client. Es weiß nicht einmal, wie man Cookies implementiert.

Also bin ich in einer Sackgasse. Ein Weg zu gehen ist zu versuchen, alle Funktionen des Rich-Client, die ASP-Anwendung erwartet Reverse Engineering und schreiben einen WebClient auf Steroiden Klasse, die einen reichen Client gut genug nachahmt, um eingeloggt zu sein.

Oder ich könnte versuchen Einbetten von IE (oder einem anderen Rich Client) in meine App und hoffen, dass die exponierte Schnittstelle reich genug ist, dass ich ein Feld für Benutzername und Passwort programmgesteuert ausfüllen und das Formular zurücksenden kann. (Und Zugriff auf den Antwort-Stream, damit ich den HTML-Code analysieren kann, um die Daten herauszuschneiden ...)

Oder ich könnte nach einem Drittanbieter-Steuerelement suchen, das viel reicher wäre, dass WebClient.

Kann mir jemand einen guten Einblick geben, wo ich meine Aufmerksamkeit konzentrieren sollte?

Dies ist ebenso eine Lernerfahrung wie ein Projekt. Das heißt, ich möchte den Login und den Abruf von Informationen von der Zielseite aus wirklich automatisieren.

+0

Siehe http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class, wie Cookies mit WebClient verwendet werden können. – abatishchev

+0

Was Sie tun, heißt [web crawling] (http://stackoverflow.com/questions/tagged/web-crawler) – abatishchev

Antwort

3

Hier ist ein Beispiel Funktion, die ich in der Website einloggen, und meine Cookie

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

Und hier ein Anruf Beispiel:

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

Mit Firefox können Sie die Erweiterung verwenden HTTP-Header zu wissen Welche Parameter werden per Post festgelegt und Sie ändern die Variablenwerte:

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

Zu matc h mit Parametern auf der Zielwebsite.

Wenn Sie sich entscheiden Live-HTTP-Headern für firefox, wenn Sie in die Website einzuloggen werden Sie die Post Informationen aus Kopf-, so etwas zu bekommen:

GET/HTTP/1.1 Host: www .microsoft.com User-Agent: Mozilla/5.0 (Windows NT 6.1; rv: 15.0) Gecko/20100101 Firefox/15.0.1 Akzeptieren: text/html, applikation/xhtml + xml, application/xml; q = 0.9, /; q = 0,8 Accept-Sprache: es-es, es; q = 0.8, de-us; q = 0.5, de; q = 0.3 Accept-Encoding: gzip, deflate Verbindung: keep-alive Plätzchen: WT_FPC = Identifikation = 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 = AxUFAAAAAAAALBwAAukh4HjpMmS4eKtKpWV0ljg !! & V = 4; msdn = L = de-DE

1

Ich vermute, dass Sie möglicherweise eine Chrome-Erweiterung erstellen können, die dies für Sie tun könnte.

Übrigens bist du kein "Sicherheitsexperte", oder?

0

Warum verwenden Sie nicht IE, IE in Windows Forms zu automatisieren ist sehr einfach, und Sie können einfach Proxy auch handhaben.

Verwandte Themen