Вход на веб-сайт, как участвуют файлы cookie? - PullRequest
0 голосов
/ 04 февраля 2012

Хорошо, поэтому я пишу программу, которая должна войти на веб-сайт, хочу получить из нее некоторую информацию.

Он мой код для входа в систему:

module Webscraper = 
    open System.Net
    open HtmlAgilityPack
    open Lolcr.Model
    open System.Collections.Specialized

    let logon = fun (address:string) studentNumber password->
        let upload values =
            let wc = new WebClient()
            wc.UploadValues (address, values)
        let ToNameValueCollection nvs =
            let col = new NameValueCollection()
            for nv in nvs do
                match nv with (n, v) -> col.Add(n, v);
            col
        let fields :List<string*string> = 
            ("v_studentid",studentNumber) ::
            ("v_studentpin", password) ::
            ("b3", "Login") :: []
            let resp = fields |> ToNameValueCollection |> upload;
            resp |> Array.map char |> System.String.Concat

//and for viewing a page within the site:
    let pageAt = fun (address : string) ->
        let getWebStream = 
            let req = HttpWebRequest.Create address
            let resp = req.GetResponse()
            resp.GetResponseStream

        let doc = new HtmlDocument()
        getWebStream() |> doc.Load;
        doc.DocumentNode

Теперь, когда я вызываю вход в систему, он возвращает текст страницы входа, как если бы я не входил в систему (возможно, вход в систему сделал бы перенаправление в браузере) когда я звоню на страницу PageAt на интересующей меня странице, снова появляется страница «Пожалуйста, войдите».

Глядя на то, что происходит с Fiddler2: (где XXXX и YYYY - это номер студента и пароль соответственно):

//Via firefox    
POST https://server2.olcr.uwa.edu.au/olcrstudent/index.jsp HTTP/1.1
Host: server2.olcr.uwa.edu.au
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: https://server2.olcr.uwa.edu.au/olcrstudent/
Cookie: JSESSIONID=18F87DFEB1555A6FA644215FDAE5E506; __utma=55889711.14817822.1328281214.1328281214.1328281214.1; __utmz=55889711.1328281214.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=olcr%20uwa; __utmb=55889711.1.10.1328281214; __utmc=55889711
Content-Type: application/x-www-form-urlencoded
Content-Length: 53

v_studentid=XXXX&v_studentpin=YYYY&b3=Login


//From my program:
POST https://server2.olcr.uwa.edu.au/olcrstudent/index.jsp HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: server2.olcr.uwa.edu.au
Content-Length: 53
Expect: 100-continue
Connection: Keep-Alive

v_studentid=XXXX&v_studentpin=YYYY&b3=Login

Так что большое отличие от моего взгляда в том, что я не отправляю куки (На самом деле я не совсем уверен, что такое куки, если подумать (я посмотрю это * 1012) * (EDIT: Готово)))

Так я должен отправлять куки? Каковы механизмы для этого в .net? Должен ли я делать что-то другое, потому что это HTTPS?

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Вообще говоря, когда вы входите на веб-сайт, у вас должен быть какой-то способ отслеживания сайта при переходе от страницы к странице.

Обычно это делается с помощью файла cookie или идентификатора сеанса.в URL.

Теперь вам нужно знать разницу между двумя типами файлов cookie.

Одним из них является файл cookie сеанса, который остается в памяти на клиентском компьютере, а затем удаляется после закрытия браузера (или закрытия сеанса).Они содержат только уникальный идентификатор, который ссылается на уникальный экземпляр сеанса пользователя на сервере.Это позволяет серверу знать, кто вы, при каждом обращении к странице подпоследовательности.

Другой тип файлов cookie - это физический файл cookie, который вы специально настроили для сохранения определенных переменных в текстовом файле на клиентском компьютере.

Если вы посмотрите на свой ответ, у вас есть ссылка на идентификатор сеанса, что означает, что у вас есть файл cookie сеанса на клиентском компьютере:

Cookie: JSESSIONID=18F87DFEB1555A6FA644215FDAE5E506; __utma=55889711.14817822.1328281214.1328281214.1328281214.1; __utmz=55889711.1328281214.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=olcr%20uwa; __utmb=55889711.1.10.1328281214; __utmc=55889711 

Этот файл cookie по умолчанию создается в asp.нет, если вы когда-либо используете сеанс.

0 голосов
/ 05 февраля 2012

Да, обычно вам нужно сохранять файлы cookie для входа на сайты.CookieAwareWebclient, такой как: этот блог , делает это простым.Эквивент F # равен

type CookieAwareWebclient (cookies) = 
    inherit WebClient()
    member this.CookieContainer = cookies

    new () = new CookieAwareWebclient(new CookieContainer())

    override this.GetWebRequest (address:Uri) =
        let req = base.GetWebRequest address
        match req with 
        | :? HttpWebRequest as httpReq -> 
            httpReq.CookieContainer <- this.CookieContainer;
            upcast httpReq
        | _ -> req;

Теперь, пока вы выполняете все свои веб-запросы, хотя тот же веб-клиент (поэтому вам нужно будет сделать веб-клиент доступным по всему модулю и изменить pageAt наиспользуйте его) вы будете в порядке

...