Napisałem program, który loguje mi się na różne witryny,
po czym automatycznie pobiera mi z tych witryn pliki cennika.
Problem w tym, że na jedną z witryn nie mogę się zalogować.
Program jest trochę rozbudowany, więc napiszę skrótowo
czego użyłem:
IdHTTP.CookieManager := IdCookie;
// IdHTTP.IOHandler := IdSSL;
IdHTTP.HandleRedirects := True;
IdHTTP.AllowCookies := True;
IdHTTP.ReadTimeout := 5000;
IdHTTP.Request.UserAgent := 'Mozilla/5.0 (X11; U; Linux i686; pl-PL;
rv:1.9.2.16) Gecko/20110322 Fedora/3.6.16-1.fc14 Firefox/3.6.16';
//pobranie strony logowania
adres := 'http://nowe.yamo.pl/'
IdHTTP.Request.Host := adres;
UstawCookies();
strona := IdHTTP.Get(adres);
OdbierzCookies();
frData := TIdMultiPartFormDataStream.Create;
try
frData.AddFormField('l_login', moj_login);
frData.AddFormField('l_pass', moje_haslo);
frData.AddFormField('sf', 'l_login');
UstawCookies();
strona := IdHTTP.Post(adres, frData); //WYSYŁANIE FORMULARZA
OdbierzCookies();
finally
FreeAndNil(frData);
end;
Efekt jest taki, że Post zamiera na ok. półtorej minuty,
po czym zwraca pusty ciąg. Gdy zaś HandleRedirects
ustawię na false, to zwraca mi błąd 301. Tyle, że w
IdHTTP.Response.Location pojawia się wówczas ten sam adres,
który użyłem do wysłania formularza(!) - jakiś bezsens.
Przeglądarka (Firefox) po wyłączeniu javascript loguje się
bez problemów, a więc javascript nie ma tu nic do rzeczy.
Obsługa cookies raczej działa dobrze, bo na innych
witrynach nie mam takich problemów, ale jak trzeba to
podam co jest w UstawCookies i OdbierzCookies.
Może ktoś doradzi, co jest nie tak z tym kodem?
Gdzie szukać przyczyny problemu?
Jakaś wskazówka? Bo ja już nie mam pomysłu.
Pozdrawiam,
Sławek
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
>
> czego użyłem:
>
>
> IdHTTP.CookieManager := IdCookie;
> // IdHTTP.IOHandler := IdSSL;
> IdHTTP.HandleRedirects := True;
> IdHTTP.AllowCookies := True;
> IdHTTP.ReadTimeout := 5000;
>
> //pobranie strony logowania
> adres := 'http://nowe.yamo.pl/'
> IdHTTP.Request.Host := adres;
> UstawCookies();
> strona := IdHTTP.Get(adres);
> OdbierzCookies();
>
> frData := TIdMultiPartFormDataStream.Create;
> try
> frData.AddFormField('l_login', moj_login);
> frData.AddFormField('l_pass', moje_haslo);
> UstawCookies();
> OdbierzCookies();
> finally
> FreeAndNil(frData);
> end;
>
> Przeglądarka (Firefox) po wyłączeniu javascript loguje się
> bez problemów, a więc javascript nie ma tu nic do rzeczy.
> Obsługa cookies raczej działa dobrze, bo na innych
> witrynach nie mam takich problemów, ale jak trzeba to
> podam co jest w UstawCookies i OdbierzCookies.
>
> Może ktoś doradzi, co jest nie tak z tym kodem?
> Gdzie szukać przyczyny problemu?
> Jakaś wskazówka? Bo ja już nie mam pomysłu.
>
> Pozdrawiam,
> Sławek
zbadałem strone -- bez javyscript na 100 % nie ma szans zeby się zalogowac (
przynajmniej z poiomu przeglądarki ) bo całość logowania jest w javiescript (
ajax ) .
logi
OnBeforeNavigate2
Url=http://nowe.yamo.pl/
PostData=
onDowloadComplete
Cookies=__utma=82732809.531009810.1302092788.1302095687.1302096492.4;
__utmb=82732809.1.10.1302096492;
__utmz=82732809.1302092788.1.1.utmcsr=google|utmccn=(organic)
|utmcmd=organic|utmctr=http%3A%2F%2Fnowe.yamo.pl%2F; mgz=M1; yamo-
front=f6b296da4f3b9f18d70a38cae1a1b7d6
onDowloadComplete
Cookies=__utma=82732809.531009810.1302092788.1302096492.1302096774.5;
__utmb=82732809.1.10.1302096774;
__utmz=82732809.1302092788.1.1.utmcsr=google|utmccn=(organic)
|utmcmd=organic|utmctr=http%3A%2F%2Fnowe.yamo.pl%2F; mgz=M1; yamo-
front=f6b296da4f3b9f18d70a38cae1a1b7d6; __utmc=82732809
klik na zaoguj sie
onDowloadComplete
Cookies=__utma=82732809.531009810.1302092788.1302096492.1302096774.5;
__utmb=82732809.1.10.1302096774;
__utmz=82732809.1302092788.1.1.utmcsr=google|utmccn=(organic)
|utmcmd=organic|utmctr=http%3A%2F%2Fnowe.yamo.pl%2F; mgz=M1; yamo-
front=f6b296da4f3b9f18d70a38cae1a1b7d6; __utmc=82732809
OnBeforeNavigate2
Url=http://nowe.yamo.pl/
PostData=l_login=kkkkkkkkkkkkkkkkkkkkkkkkkkkk&l_pass=kkkkkkkkkkkkkkkkkkkkkkkkkkk
k&sf=l_login&x=62&y=23
onDowloadComplete
Cookies=__utma=82732809.531009810.1302092788.1302096492.1302096774.5;
__utmb=82732809.2.10.1302096774;
__utmz=82732809.1302092788.1.1.utmcsr=google|utmccn=(organic)
|utmcmd=organic|utmctr=http%3A%2F%2Fnowe.yamo.pl%2F; mgz=M1; yamo-
front=f6b296da4f3b9f18d70a38cae1a1b7d6; __utmc=82732809
onDowloadComplete
Cookies=__utma=82732809.531009810.1302092788.1302096492.1302096774.5;
__utmb=82732809.2.10.1302096774;
__utmz=82732809.1302092788.1.1.utmcsr=google|utmccn=(organic)
|utmcmd=organic|utmctr=http%3A%2F%2Fnowe.yamo.pl%2F; mgz=M1; yamo-
front=f6b296da4f3b9f18d70a38cae1a1b7d6; __utmc=82732809
onDowloadComplete
Cookies=__utma=82732809.531009810.1302092788.1302096492.1302096774.5;
__utmb=82732809.2.10.1302096774;
__utmz=82732809.1302092788.1.1.utmcsr=google|utmccn=(organic)
|utmcmd=organic|utmctr=http%3A%2F%2Fnowe.yamo.pl%2F; mgz=M1; yamo-
front=f6b296da4f3b9f18d70a38cae1a1b7d6; __utmc=82732809
-----------
w logach przy logowaniu widać ze są jeszcze dwa parametry x i y ( wsólrzedne
gdzie kliknąłeś na obrazku zaloguj się ) spróbuj je dodać przy próbie
Zakładająć że w ukrytych fragmentach nie ma żadnych robaczków,
to całość wygląda sprawnie.
1. Jaki jest Request.ContentType?
2. Debug log z Indy będzie wielce pomocny + porównanie z
outputem Fiddler'a, jeżeli Kolega nie zna narzędzia,
to radzę się zapoznać. Wklej Debug Log'a w miare
możliwosći, zanonimizuj dane logowania.
P.S. Trudno sprawdzać takie coś bez danych logowania,
a jestem leniwy na tyle, że się rejestrował nie będę ;-).
--
Pozdrawiam,
Łukasz 'Maly' Ostrowski. http://l3v.eu/
[ciach]
> -----------
> w logach przy logowaniu widać ze są jeszcze dwa parametry x i y ( wsólrzedne
> gdzie kliknąłeś na obrazku zaloguj się ) spróbuj je dodać przy próbie
> logowania .
>
Dodawałem x i y, ale nic to nie daje. Gdy się wyłączy obrazki
w przeglądarce, to można się zalogować, a wtedy x i y nie są
wysyłane - sprawdziłem.
Jutro do tego znów usiądę, dzisiaj miałem dość ciężki dzień.
Sławek
>
> 1. Jaki jest Request.ContentType?
> 2. Debug log z Indy będzie wielce pomocny + porównanie z
> outputem Fiddler'a, jeżeli Kolega nie zna narzędzia,
> to radzę się zapoznać. Wklej Debug Log'a w miare
> możliwosći, zanonimizuj dane logowania.
Jutro postaram się dać na to odpowiedź, narzędzia faktycznie
nie znam, ale jak trzeba to się zapoznam.
Jak uzyskać debug loga z Indy też jeszcze nie wiem, dotąd
nie potrzebowałem.
Dzięki za wskazówki.
>
> P.S. Trudno sprawdzać takie coś bez danych logowania,
> a jestem leniwy na tyle, że się rejestrował nie będę ;-).
>
Nie zarejestrują cię, chyba że masz firmę informatyczną
i podpiszesz z nimi umowę.
Sławek
> 1. Jaki jest Request.ContentType?
Request.ContentType ustawiałem na:
'' (pusty)
'text/xml'
'text/html; charset=utf-8'
'application/x-www-form-urlencoded'
i za każdym razem efekt jest ten sam.
Jednak chyba nie w tym jest problem.
Użyłem Wiresharka i zauważyłem, że Indy przy
IdHTTP.HandleRedirects := true;
próbuje w kółko wysyłać na serwer dane logowania:
Robi POST, dostaje błąd 301, więc ponownie
robi POST na adres z Response.Location, znów
dostaje błąd 301 i tak w kółko.
Tymczasem przeglądarka gdy po POST dostanie
błąd 301, to po prostu pobiera potem stronę
z Response.Location za pomocą GET.
Z tego wniosek, że muszę użyć
IdHTTP.HandleRedirects := false;
i sam obsłużyć sytuację po błędzie 301.
Wstępne próby dają już obiecujące rezultaty,
ale jest tam jeszcze jakiś haczyk, bo dostaję
po GET zakodowane dane i kolejny błąd.
Content-encoded entity body (gzip): 9243 bytes [Error: Decompression failed]
Co ciekawe po zalogowaniu Firefoksem jest ten sam błąd,
a mimo to Firefox coś tam jeszcze robi i wyświetla potem
stronę poprawnie. Muszę to dokładniej przeanalizować.
Sławek
Problem rozwiązany!
Wystarczyło podpiąć jeszcze TIdCompressorZLib
pod mój IdHTTP i ... śmiga!
Dzięki i pozdrawiam,
Sławek
Fiddler wygodniejszy do debugowania ruchu http.
> <snip>
> Z tego wniosek, że muszę użyć
>
> IdHTTP.HandleRedirects := false;
>
> i sam obsłużyć sytuację po błędzie 301.
Nie powinno być konieczne, cookiesy autoryzacyjne
dostaniesz w tym samym response w którym dostajesz
301, na 99.9%, a później możesz już sobie z nimi
przenawigować do sekcji "zabezpieczonej".
> Wstępne próby dają już obiecujące rezultaty,
> ale jest tam jeszcze jakiś haczyk, bo dostaję
> po GET zakodowane dane i kolejny błąd.
>
> Content-encoded entity body (gzip): 9243 bytes [Error: Decompression failed]
Accept-Encoding plainowy może, jeżeli gzip jest problematyczny?
Może, ale jeszcze go nie używałem.
A w ogóle to Fiddler jest pod Linuxa?
Jakoś nie widzę go w repozytorium Fedory.
>
>> <snip>
>> Z tego wniosek, że muszę użyć
>>
>> IdHTTP.HandleRedirects := false;
>>
>> i sam obsłużyć sytuację po błędzie 301.
>
> Nie powinno być konieczne, cookiesy autoryzacyjne
> dostaniesz w tym samym response w którym dostajesz
> 301, na 99.9%, a później możesz już sobie z nimi
> przenawigować do sekcji "zabezpieczonej".
No tak tylko, że jak dam true, to błąd 301
dostaję dopiero po 1,5 minucie od wywołania Post,
a w tym czasie Indy wysyła chyba kilkadziesiąt razy
Posta w kółko. Więc nie bardzo widzę jak to ominąć.
Przy HandleRedirects := false Post się nie zapętla.
Jakoś to "dziwnie" jest tu zrobione, bo nie bardzo
rozumiem, po co przekierowywać na ten sam adres,
czy serwer nie mógłby po prostu odesłać to co ma do
odesłania? No ale tak tu jest i już.
Wydaje mi się, że to może być błąd w samym indy.
Widać nikt tu nie pomyślał, że przekierować można na
ten sam adres.
Sławek