2010-03-24 10 views
12

Próbowałem zautomatyzować logowanie do witryny, którą często odwiedzam, www.bungie.net. Witryna jest powiązana z Microsoft i Xbox Live i jako taka wykorzystuje interfejsy API Windows Live ID, gdy użytkownicy logują się do swojej witryny.Logowanie do witryny korzystającej z uwierzytelniania Live.com

Jestem stosunkowo nowy w tworzeniu pająków internetowych/robotów i martwię się, że nie rozumiem niektórych z najbardziej podstawowych pojęć. Symulowałem logowanie do innych stron, takich jak Facebook i Gmail, ale witryna live.com dała mi tylko kłopoty.

W każdym razie korzystam z Wiresharka i dodatku do Firefoksa Tamper Data, aby spróbować dowiedzieć się, co muszę opublikować i jakie pliki cookie muszę dołączyć do moich żądań. O ile wiem, są to kroki, które należy wykonać, aby zalogować się na tej stronie.

1. stronę https: //login.live.com/login.srf?wa=wsignin1.0 & rpsnv = 11 & ct = 1268167141 & RVER = 5.5.4177.0 & wp = LBI & wreply = http :% 2F% 2Fwww.bungie.net% 2FDefault.aspx & id = 42917

2. otrzymywać ciasteczka MSPRequ i MSPOK.

3. zaksięgować wartości z ID postaci „ppsx”, wartościami z ID postaci „PPFT”, swojej nazwy użytkownika, hasła wszystkich do zmieniającej się zawartości podobnej do: https: //login.live. com/ppsecure/post.srf? wa = wsignin1.0 & rpsnv = 11 & ct = (istnieje kilka numerów, które zmieniają się na końcu tego adresu URL)

4. Live.com zwraca użytkownikowi strona z bardziej ukrytymi formularzami do opublikowania. Następnie klient wysyła wartości z formularza "ANON", wartość z formularza "ANONExp" i wartości z formularza "t" na adres URL: http: //www.bung ie.net/Default.aspx?wa = wsignin1.0

Po zaksięgowaniu tych danych, użytkownikowi zwracane są różne pliki cookie, z których najważniejszym jest "BNGAuth", czyli plik cookie dla witryny.

Miejsce, w którym mam problemy, jest na piątym etapie, ale nie oznacza to, że poprawnie wykonałem wszystkie pozostałe czynności. Publikuję dane z "ANON", "ANONExp" i "t", ale zamiast zwracania pliku cookie BNGAuth, otrzymuję plik cookie o nazwie "RSPMaybe" i przekierowuję na stronę główną.

Kiedy przeglądam dziennik Wireshark, zauważyłem coś, co od razu odróżniało mnie od logowania po zalogowaniu do Firefoksa i po uruchomieniu programu. To może być nic. , ale dołączę tutaj zdjęcie, aby przejrzeć. Przed wysłaniem danych w czwartym kroku zwracam pakiet HTTP z witryny. Nie jestem pewien, jak to się dzieje, ale musi to być efekt uboczny czegoś, co robię źle w krokach HTTPS.

using System; 
using System.Collections.Generic; 
using System.Collections.Specialized; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.IO.Compression; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 
using System.Web; 

namespace SpiderFromScratch 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      CookieContainer cookies = new CookieContainer(); 
      Uri url = new Uri("https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1268167141&rver=5.5.4177.0&wp=LBI&wreply=http:%2F%2Fwww.bungie.net%2FDefault.aspx&id=42917"); 
      HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create(url); 

      http.Timeout = 30000; 
      http.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)"; 
      http.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      http.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
      http.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
      http.Headers.Add("Keep-Alive", "300"); 
      http.Referer = "http://www.bungie.net/"; 
      http.ContentType = "application/x-www-form-urlencoded"; 
      http.CookieContainer = new CookieContainer(); 
      http.Method = WebRequestMethods.Http.Get; 

      HttpWebResponse response = (HttpWebResponse)http.GetResponse(); 
      StreamReader readStream = new StreamReader(response.GetResponseStream()); 
      string HTML = readStream.ReadToEnd(); 
      readStream.Close(); 

      //gets the cookies (they are set in the eighth header) 
      string[] strCookies = response.Headers.GetValues(8); 
      response.Close(); 

      string name, value; 
      Cookie manualCookie; 
      for (int i = 0; i < strCookies.Length; i++) 
      { 
       name = strCookies[i].Substring(0, strCookies[i].IndexOf("=")); 
       value = strCookies[i].Substring(strCookies[i].IndexOf("=") + 1, strCookies[i].IndexOf(";") - strCookies[i].IndexOf("=") - 1); 
       manualCookie = new Cookie(name, "\"" + value + "\""); 

       Uri manualURL = new Uri("http://login.live.com"); 
       http.CookieContainer.Add(manualURL, manualCookie); 
      } 


      //stores the cookies to be used later 
      cookies = http.CookieContainer; 

      //Get the PPSX value 
      string PPSX = HTML.Remove(0, HTML.IndexOf("PPSX")); 
      PPSX = PPSX.Remove(0, PPSX.IndexOf("value") + 7); 
      PPSX = PPSX.Substring(0, PPSX.IndexOf("\"")); 

      //Get this random PPFT value 
      string PPFT = HTML.Remove(0, HTML.IndexOf("PPFT")); 
      PPFT = PPFT.Remove(0, PPFT.IndexOf("value") + 7); 
      PPFT = PPFT.Substring(0, PPFT.IndexOf("\"")); 

      //Get the random URL you POST to 
      string POSTURL = HTML.Remove(0, HTML.IndexOf("https://login.live.com/ppsecure/post.srf?wa=wsignin1.0&rpsnv=11&ct=")); 
      POSTURL = POSTURL.Substring(0, POSTURL.IndexOf("\"")); 


      //POST with cookies 
      http = (HttpWebRequest)HttpWebRequest.Create(POSTURL); 

      http.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)"; 
      http.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      http.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
      http.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
      http.Headers.Add("Keep-Alive", "300"); 
      http.CookieContainer = cookies; 
      http.Referer = "https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1268158321&rver=5.5.4177.0&wp=LBI&wreply=http:%2F%2Fwww.bungie.net%2FDefault.aspx&id=42917"; 
      http.ContentType = "application/x-www-form-urlencoded"; 
      http.Method = WebRequestMethods.Http.Post; 

      Stream ostream = http.GetRequestStream(); 

      //used to convert strings into bytes 
      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 

      //Post information 
      byte[] buffer = encoding.GetBytes("PPSX=" + PPSX +"&PwdPad=IfYouAreReadingThisYouHaveTooMuc&login=YOUREMAILGOESHERE&passwd=YOURWORDGOESHERE" + 
      "&LoginOptions=2&PPFT=" + PPFT); 
      ostream.Write(buffer, 0, buffer.Length); 
      ostream.Close(); 

      HttpWebResponse response2 = (HttpWebResponse)http.GetResponse(); 
      readStream = new StreamReader(response2.GetResponseStream()); 
      HTML = readStream.ReadToEnd(); 

      response2.Close(); 
      ostream.Dispose(); 
      foreach (Cookie cookie in response2.Cookies) 
      { 
       Console.WriteLine(cookie.Name + ": "); 
       Console.WriteLine(cookie.Value); 
       Console.WriteLine(cookie.Expires); 
       Console.WriteLine(); 
      } 

      //SET POSTURL value 
      string POSTANON = "http://www.bungie.net/Default.aspx?wa=wsignin1.0"; 

      //Get the ANON value 
      string ANON = HTML.Remove(0, HTML.IndexOf("ANON")); 
      ANON = ANON.Remove(0, ANON.IndexOf("value") + 7); 
      ANON = ANON.Substring(0, ANON.IndexOf("\"")); 
      ANON = HttpUtility.UrlEncode(ANON); 

      //Get the ANONExp value 
      string ANONExp = HTML.Remove(0, HTML.IndexOf("ANONExp")); 
      ANONExp = ANONExp.Remove(0, ANONExp.IndexOf("value") + 7); 
      ANONExp = ANONExp.Substring(0, ANONExp.IndexOf("\"")); 
      ANONExp = HttpUtility.UrlEncode(ANONExp); 

      //Get the t value 
      string t = HTML.Remove(0, HTML.IndexOf("id=\"t\"")); 
      t = t.Remove(0, t.IndexOf("value") + 7); 
      t = t.Substring(0, t.IndexOf("\"")); 
      t = HttpUtility.UrlEncode(t); 

      //POST the Info and Accept the Bungie Cookies 
      http = (HttpWebRequest)HttpWebRequest.Create(POSTANON); 

      http.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)"; 
      http.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      http.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
      http.Headers.Add("Accept-Encoding", "gzip,deflate"); 
      http.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
      http.Headers.Add("Keep-Alive", "115"); 
      http.CookieContainer = new CookieContainer(); 
      http.ContentType = "application/x-www-form-urlencoded"; 
      http.Method = WebRequestMethods.Http.Post; 

      http.Expect = null; 

      ostream = http.GetRequestStream(); 
      int test = ANON.Length; 
      int test1 = ANONExp.Length; 
      int test2 = t.Length; 
      buffer = encoding.GetBytes("ANON=" + ANON +"&ANONExp=" + ANONExp + "&t=" + t); 
      ostream.Write(buffer, 0, buffer.Length); 
      ostream.Close(); 

      //Here lies the problem, I am not returned the correct cookies. 
      HttpWebResponse response3 = (HttpWebResponse)http.GetResponse(); 
      GZipStream gzip = new GZipStream(response3.GetResponseStream(), CompressionMode.Decompress); 
      readStream = new StreamReader(gzip); 
      HTML = readStream.ReadToEnd(); 

      //gets both cookies 
      string[] strCookies2 = response3.Headers.GetValues(11); 

      response3.Close(); 
     } 
    } 
} 
+2

Tak na marginesie ... kolejnym doskonałym narzędziem do oglądania drut jest Skrzypek. Nie wiesz, jak dobrze się do tego stosuje, ale coś może złapać (https?), A drugie nie. – Will

+0

Muszę to sprawdzić, ja odfiltrowane ruchu SSL w tym jeden po prostu do zilustrowania perculiarity zauważyłem. Sposób w jaki C# obsługuje SSL jest zdecydowanie inny niż sposób, w jaki to robi Firefox, i to może być również źródłem moich problemów. Wydaje się, że za każdym razem robię żądanie nowej strony przy użyciu protokołu SSL i C#, to musi ponownie uwierzytelnić. Nie mam wystarczającego doświadczenia w tej dziedzinie, aby wiedzieć, czy to byłby problem, czy nie. – JoshVarty

+0

mogę polecić również używać Firefoxa o nazwie Firebug, a następnie użyć jej kartę konsoli z opcją „Utrzymują się” na. Możesz zobaczyć szczegółowe prośby i odpowiedzi dotyczące procesu uwierzytelniania Live.com. – ReinierDG

Odpowiedz

1

Nie jestem pewien, jeśli nadal pracuje nad tym, czy nie, ale witryna Windows Live Development ma wiele informacji na jej temat, aby pomóc w użyciu API Live ID. Nie miałem wiele do zaoferowania, ale ich strona Getting Started zawiera mnóstwo informacji oraz link do pobrania przykładowych aplikacji opisujących sposób korzystania z usługi w różnych językach (w tym w języku C#).

Możesz pobrać przykładową aplikację z tego miejsca.

Brzmi to dość ciekawe, co starasz się zrobić, tak bardzo, że zupełnie fantazyjne posiadające luz z tym sam!

0

Zmień swój czas i sprawdzić, czy można uzyskać takie same wyniki.

-2

Jest więc dużo łatwiej jest po prostu użyć ramy automatyzacji UI jak Watin niż używać HttpWebRequest, chyba że złamie swoje wymagania. W WatiN myślisz o tym, co widać w interfejsie, a nie o tym, co jest w HTML.

+1

-1: jeśli przeczytasz dokładnie ten kod, zobaczysz, że w rzeczywistości nie przetwarza on wcale HTML. –

Powiązane problemy