Вхождение в сайт, который использует аутентификацию Live.com

Я пытался автоматизировать журнал в к веб-сайту, который я часто посещаю, www.bungie.net. Сайт связан с Microsoft, и Xbox Live, и как таковой делает использование Windows Live ID API, когда люди входят в систему своего сайта.

Я относительно плохо знаком с созданием веб-пауков/роботов, и я волнуюсь, что неправильно понимаю некоторые наиболее фундаментальные понятия. Я моделировал логины других сайтов, таких как Facebook и Gmail, но live.com дал мне, только беспокоятся.

Так или иначе я использовал Wireshark и дополнительные Данные Трамбовки Firefox, чтобы попытаться выяснить то, что я должен отправить, и какие cookie я должен включать со своими запросами. Насколько я знаю, что это шаги, нужно следовать для входа этого сайта.

1. Посещение 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. Recieve cookie MSPRequ и MSPOK.

3. Отправьте значения из идентификатора формы "PPSX", значения из идентификатора формы "PPFT", Ваше имя пользователя, Ваш пароль все к изменяющемуся URL, подобному: https://login.live.com/ppsecure/post.srf? wa=wsignin1.0&rpsnv=11&ct = (существует несколько чисел, которые изменяются в конце того URL),

4. Live.com возвращает пользователя страница с более скрытыми формами для регистрации. Клиент затем отправляет значения от формы "СКОРО", значение от формы "ANONExp" и значения от формы "t" к URL: http://www.bung ie.net/Default.aspx?wa=wsignin1.0

5. После регистрации тех данных пользователь возвращается множество cookie, самым важным из которых является "BNGAuth", который является журналом в cookie для сайта.

То, где я испытываю затруднения, находится на пятом шаге, но это neccesarily не означает, что я сделал все другие шаги правильно. Я отправляю данные из "СКОРО", "ANONExp" и "t", но вместо того, чтобы быть возвращенным cookie BNGAuth, я возвращаюсь cookie под названием "RSPMaybe" и перенаправляюсь к домашней странице.

Когда я рассматриваю журнал Wireshark, я заметил что-то, что немедленно выделилось мне как отличающееся между журналом, когда я вошел в систему с Firefox и когда моя программа работала. Это могло быть только, я буду включать изображение здесь, чтобы Вы рассмотрели. Я возвращаюсь пакет HTTP из сайта, прежде чем я отправлю данные на четвертом шаге. Я не уверен, как это происходит, но это должен быть побочный эффект от чего-то, что я делаю неправильно на шагах 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();
        }
    }
}
12
задан Ian Gregory 6 March 2015 в 09:35
поделиться

3 ответа

Я не уверен, работаете ли вы еще над этим или нет, но на сайте разработки Windows Live есть много информации, которая поможет в использовании API Live ID. Я не особо разбирался в этом, но на их странице Приступая к работе есть масса информации плюс ссылка для загрузки примеров приложений с подробным описанием того, как использовать службу на различных языках (включая C #).

Вы можете скачать образец приложения оттуда.

То, что вы пытаетесь сделать, звучит довольно интересно, настолько, что мне даже самому хочется поиграть с этим!

1
ответ дан 3 December 2019 в 00:36
поделиться

Измените время и посмотрите, получите ли вы те же результаты.

0
ответ дан 3 December 2019 в 00:36
поделиться

Гораздо проще просто использовать фреймворк для автоматизации пользовательского интерфейса, такой как WatiN, чем использовать httpwebrequest, если только это не нарушит ваши требования. С WatiN вы думаете о том, что отображается на UI, а не о том, что находится в HTML.

-2
ответ дан 3 December 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: