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