Http-клиент, который может принимать cookie - PullRequest
2 голосов
/ 10 ноября 2011

Я пытаюсь получить доступ к ba.com (фактический URL: "https://www.britishairways.com/travel/loginr/public/en_us?eId=109001), выполнив POST с необходимыми параметрами, он отвечает перенаправлением 3XX, которое указывает на URL https://www.britishairways.com/cookie.html с Set-CookieЯ пытаюсь сделать GET, используя заголовок запроса Cookie с key=value;key=value ..., в этот момент он возвращает 2XX, говоря, что cookie не включен.

Для gmail.com, он напрямую возвращает 2XXответ с заголовком Set-Cookie, когда я выполняю POST с необходимыми параметрами, и объявляет, что cookie не включен.

Мои вопросы:

  1. Как правило, что такое HTTP (S) последовательности между клиентом и сервером для проверки того, что cookie включен?
  2. Моя общая цель - получить доступ к моей учетной записи через программу, войти в систему и проверить некоторую информацию о моей учетной записи. britshairways.com/gmail.com можетбыть хорошим началом. (Это похоже на симуляцию веб-браузера)

Если кто-нибудь знает примеры кодов, которые могут выполнить задачу, я бы хотел узнать. Спасибо.

Нерабочий образецНиже приведены коды с подробными параметрами для вызова britishairways.com/gmail.com

public static void PostToUrlWithCookies(string uri, NameValueCollection nvc, CookieCollection cookies, string cookieHeader = "")
{
    // this is what we are sending
    string post_data = "";
    if (nvc != null)
    {
        foreach (string key in nvc.Keys)
        {
            string formitem = string.Format("{0}={1}", key, nvc[key]);
            if (post_data == "")
            {
                post_data += formitem;
            }
            else
            {
                post_data += "&" + formitem;

            }
        }
    }
    Console.WriteLine("post_data={0}", post_data);


    // create a request
    HttpWebRequest request = (HttpWebRequest)
    WebRequest.Create(uri);

    // to accept cookies (and skip 100 response)
    //var cookies = new CookieContainer(); 
    ServicePointManager.Expect100Continue = false;

    string newCookieHeader = "";
    request.CookieContainer = new CookieContainer();
    if (cookies.Count > 0)
    {
        CookieCollection oCookies = cookies;

        for (int j = 0; j < oCookies.Count; j++)
        {
            Cookie oCookie = oCookies[j];
            Cookie oC = new Cookie();

            // Convert between the System.Net.Cookie to a System.Web.HttpCookie...
            oC.Domain = request.RequestUri.Host;
            oC.Expires = oCookie.Expires;
            oC.Name = oCookie.Name;
            oC.Path = oCookie.Path;
            oC.Secure = oCookie.Secure;
            oC.Value = oCookie.Value;

            if (newCookieHeader != "")
            {
                newCookieHeader += ";";
            }
            newCookieHeader += oC.Name + "=" + oC.Value;

            //request.CookieContainer.Add( oC );
        }

    }


    //      Console.WriteLine("request has {0} cookies inside", request.CookieContainer.Count);

    if (cookieHeader != "")
    {
        request.Headers["Cookie"] = newCookieHeader;
        Console.WriteLine("request Set-Cookie: {0}", newCookieHeader);
    }


    // add a fake cookie to request
    //Cookie aCookie = new Cookie("lastVisited", DateTime.Now.ToString());
    //aCookie.Domain = "ba.com";
    //request.CookieContainer.Add(aCookie);

    request.KeepAlive = true;
    request.ProtocolVersion = HttpVersion.Version11;
    if (cookies.Count == 0)
    {
        request.AllowAutoRedirect = false;   // ba.com testing cookies using a 3XX Redirect
        request.Method = "POST";
    }
    else
    {
        request.AllowAutoRedirect = false;
        request.Method = "GET";
    }
    //    
    // turn our request string into a byte stream
    byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

    // this is important - make sure you specify type this way
    if (request.Method == "POST")
    {
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2";
        request.ContentLength = postBytes.Length;
        Stream requestStream = request.GetRequestStream();
        //      
        //      // now send it
        if (post_data != "")
        {
            requestStream.Write(postBytes, 0, postBytes.Length);
        }
        requestStream.Close();
    }
    else
    {
        request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2";
    }

    //       
    // grab te response and print it out to the console along with the status code
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    foreach (Cookie cook in response.Cookies)
    {
        //               Console.WriteLine("Cookie:");
        //              Console.WriteLine("{0} = {1}", cook.Name, cook.Value);
        cookies.Add(cook);
    }

    cookieHeader = response.GetResponseHeader("Set-Cookie");
    Console.WriteLine("responce-> Set-Cookie: {0}", cookieHeader);


    for (int i = 0; i < response.Headers.Count; ++i)
        Console.WriteLine("\nHeader Name:{0}, Value :{1}", response.Headers.Keys[i], response.Headers[i]);


    if ((int)response.StatusCode >= 300 && (int)response.StatusCode < 400)
    {
        string cookieUrl = response.Headers["Location"];
        Console.WriteLine("about to verify cookie via url {0}", cookieUrl);




        // verify the cookie capability
        PostToUrlWithCookies(cookieUrl, null /*nvc*/, cookies, cookieHeader);
    }
    else
    {
        Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
        Console.WriteLine((int)response.StatusCode);

    }


}

вызов для ba.com (формат: uri, ключ, пары значений):

func "https://www.britishairways.com/travel/loginr/public/en_us?eId=109001","loginText", "Login+ID", "Directional_Login", "%2Ftravel%2Fechome%2Fexecclub%2Fen_us%3FmembershipNumber%3D36436959%26DM1%255FmktgCat%3DEmail%26DM1%255FMktgSubCat%3D2%26DM1%255Fcampaign%3DBBBB5YT0BPKCBBBB5YT0BQBG%26DM1%255FChksm%3D117285700%26DM1_SRC%3D%26utm_source%3DeD%26utm_medium%3DEmail%26utm_campaign%3DEmail%26utm_term%3DBBBB5YT0BQBG%26utm_content%3DBBBB5YT0BPKC", "membershipNumber", "XXXXXX", "password", "XXXXXX", "passwordtext", "XXXXXXX" 

вызовдля gmail.com

"https://accounts.google.com/ServiceLoginAuth", "continue", "http%3A%2F%2Fwww.google.com%2F", "dsh", "7157339180374789215", "hl", "en", "GALX", "f9V9sU8AY6c", "pstMsg", "1", "dnConn", "", "timeStmp", "", "secTok", "", "Email", "XXXXXXX@gmail.com", "Passwd", "XXXXXXX", "signIn", "Sign+in", "rmShown", "1"

1 Ответ

1 голос
/ 10 ноября 2011

Добавление поддержки cookie в WebRequest - это несколько строк кода.

var cookies = new CookieContainer();

// perform normal request;
var webResponse; // be sure this gets assigned

cookies.Add(webResponse.Cookies);

// create another request
var webRequest; // be sure this gets assigned

webRequest.CookiesContainer = cookies;

// perform next request. This time with cookies.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...