2012-11-15 17 views
6

Innanzitutto, scusate la mia ingenuità con questo argomento. Sono un programmatore in pensione che è iniziato prima che il DOS fosse in circolazione. Non sono un esperto di ASP.NET. Parte di ciò che devo sapere è ciò che ho bisogno di sapere. (Se mi segui ...)App Console per accedere al sito Web ASP.NET

Quindi voglio accedere a un sito Web e raschiare alcuni contenuti. Dopo aver esaminato il codice sorgente HTML con Blocco note e Fiddler2, è chiaro che il sito è implementato con tecnologie ASP.NET.

Ho iniziato facendo un sacco di google e leggendo tutto ciò che riuscivo a trovare sulla scrittura di screen scrapers in C#. Dopo alcune indagini e molti tentativi, penso di essere giunto alla conclusione che non è facile.

Il nocciolo del problema (come lo vedo ora) è che ASP fornisce molti modi per un programmatore di mantenere lo stato. Cookie, viewstate, vars di sessione, vars di pagine, get e post param, ecc. Inoltre il programmatore può dividere il lavoro tra lo scripting di server e client. Un ricco client Web come IE o Safari o Chrome o Firefox sa come gestire qualsiasi cosa il programmatore scrive (e gli strumenti del framework ASP sotto le copertine).

WebClient non è un client Web ricco. Non sa nemmeno come implementare i cookie.

Quindi sono in un vicolo cieco. Un modo per andare è provare a decodificare tutte le funzionalità del rich client che l'applicazione ASP si aspetta e scrivere un WebClient sulla classe steroidi che simula un rich client abbastanza bene da essere loggato.

Oppure potrei provare incorporare IE (o qualche altro rich client) nella mia app e sperare che l'interfaccia esposta sia abbastanza ricca da poter riempire a livello di codice un nome utente e un campo password e POST restituire il modulo. (E accedere al flusso di risposta in modo da poter analizzare l'HTML per raschiare i dati che sto dopo ...)

Oppure potrei cercare qualche controllo di terze parti che sarebbe molto più ricco di WebClient.

Qualcuno può dare qualche spunto su dove concentrare la mia attenzione?

Questa è un'esperienza di apprendimento quanto un progetto. Detto questo, desidero davvero automatizzare il login e il recupero delle informazioni dal sito di destinazione.

+0

Vedere http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class come utilizzare i cookie con WebClient. – abatishchev

+0

Quello che stai facendo si chiama [web crawling] (http://stackoverflow.com/questions/tagged/web-crawler) – abatishchev

risposta

3

Ecco una funzione di esempio che uso per accedere nel sito web e ottenere il mio biscotto

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

Ed ecco un esempio di chiamata:

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

Con Firefox è possibile utilizzare l'estensione HTTP-intestazioni di sapere quali parametri vengono impostati per posta e si modificano i valori delle variabili:

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

to matc h con parametri sul sito web di destinazione.

Se si decide di Live-HTTP-headers per Firefox, quando si accede al sito otterrete le informazioni post dal intestazioni, qualcosa di simile:

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 Accetta: 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 Connessione: keep-alive 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 = en-US

1

Sospetto che tu possa essere in grado di creare un'estensione per Chrome che potrebbe farlo per te.

A proposito, non sei un "esperto di sicurezza", vero?

0

Perché non si utilizza IE, l'automazione di IE in Windows Form è molto semplice, inoltre è possibile gestire facilmente anche il proxy.

Problemi correlati