Я пытаюсь получить доступ к 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 не включен.
Мои вопросы:
- Как правило, что такое HTTP (S) последовательности между клиентом и сервером для проверки того, что cookie включен?
- Моя общая цель - получить доступ к моей учетной записи через программу, войти в систему и проверить некоторую информацию о моей учетной записи. 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"