Witam, chciałbym zalogować się do serwisu allegro.pl (ale nie przez to API od allegro). Wysyłam odpowiedni request, ale nie działa on do końca sprawnie, tzn po wysłaniu danych POST nie dostaję ciastek, a korzystając z wtyczki IEWatch widzę, że przeglądarka ciastka dostaje. Poza tym dostaje też w odpowiedzi nagłówek "Location" którego ja znowu nie mam.
sposób działania jest taki:
- otwieram stronę i pobieram ciastka: https://ssl.allegro.pl/enter_login.php?request_server=allegro.pl
- wysyłam post_data na adres: https://ssl.allegro.pl/login.php?request_server=allegro.pl
w postaci "user_login=uzytkownik&user_password=haslo" - dostaje request
Podany niżej kod testowałem do logowania się na forach i działa.
Oto kod:
void PrepareCookies(HttpWebRequest webRequest, ref CookieCollection myCookies)
{
CookieCollection cc = new CookieCollection();
foreach (Cookie cook in myCookies)
{
if (cook.Expires.CompareTo(DateTime.Now) < 0) cc.Add(cook);
else { cook.Expires.AddHours(4); cc.Add(cook); } //robie tak, zeby wyslalo przestarzale cookies, bo dostaje opoznione o godzine, a w iewatchu widze, ze je tez odsyla
}
myCookies = cc;
webRequest.CookieContainer = new CookieContainer();
if (myCookies != null &&
myCookies.Count > 0)
webRequest.CookieContainer.Add(myCookies);
}
void UpdateCookies(CookieCollection source, CookieCollection dest)
{
if (source.Count > 0)
if (dest == null)
{
dest = source;
}
else
{
// If we already have cookies update list
foreach (Cookie oRespCookie in
source)
{
bool bMatch = false;
foreach(Cookie oReqCookie in
dest) {
if (oReqCookie.Name ==
oRespCookie.Name)
{
oReqCookie.Value =
oRespCookie.Value;
bMatch = true;
break;
}
}
if (!bMatch)
dest.Add(oRespCookie);
}
}
}
string HttpCommunication(string uri, string parameters) //uri-wiadomo, parameters to: user_login=log&user_password=haslo
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ContentType = "application/x-www-form-urlencoded";
if (parameters.Length <= 0) webRequest.Method = "GET";
else webRequest.Method = "POST";
webRequest.ProtocolVersion = HttpVersion.Version10;
webRequest.UserAgent = uagentParam2;
webRequest.KeepAlive = true;
webRequest.Accept = acceptHeader;
PrepareCookies(webRequest, ref Cookies);
StreamReader reader = new StreamReader(webRequest.GetRequestStream(), Encoding.UTF8);
string result = reader.ReadToEnd();
MessageBox.Show(result);
return "bla";
if (parameters.Length > 0)
{
byte[] bytes = Encoding.ASCII.GetBytes(parameters);
webRequest.ContentLength = bytes.Length;
Stream requestStream = webRequest.GetRequestStream();
try
{
requestStream.Write(bytes, 0, bytes.Length);
}
catch (WebException ex)
{
MessageBox.Show(ex.Message, "HttpPost: Request error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (requestStream != null)
requestStream.Close();
}
}
try
{ // get the response
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
if (webResponse == null)
{ return null; }
UpdateCookies(webResponse.Cookies, this.Cookies);
StreamReader sr = new StreamReader(webResponse.GetResponseStream());
return sr.ReadToEnd();
}
catch (WebException ex)
{
MessageBox.Show(ex.Message, "HttpPost: Response error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return null;
} // end HttpPost
private string uagentParam2 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
schemat dzialania :
HttpCommunication("https://ssl.allegro.pl/enter_login.php?request_server=allegro.pl", "");
HttpCommunication("https://ssl.allegro.pl/login.php?request_server=allegro.pl", "user_login=login&user_password=password");
Bardzo przepraszam, że to takie pokręcone, ale ciekawi mnie rozwiązanie tego problemu.