[Delphi] Synapse - pobieranie przez GET będąc zalogowanym po POST |
![]() ![]() |
[Delphi] Synapse - pobieranie przez GET będąc zalogowanym po POST |
śro, 10 mar 2010 - 03:19
Post
#1
|
|
|
Pomocna dłoń Grupa: Super użytkownicy Postów: 261 Dołączył: sob, 22 wrz 07 Skąd: Szczecin Nr użytkownika: 899 Gadu-Gadu: 478088 |
Chciałem sobie napisać program pobierający zdjęcia ze strony pewnego szczecińskiego klubu. W sumie
to byłem tam ostatni raz pare lat temu jak zwał się Lokomotywa, ale do rzeczy. Poniższe kody prezentują to co wyśledziłem przy pomocy WireSharka i co potrzebne jest do logowania. W czym problem. O ile kod z użyciem komponentu Indy działa poprawnie i pobiera do pliku test_ (stronę po zalogowaniu) oraz stronę galeri zdjęć (galeria_), to kod z użyciem Synapse pobiera ok tylko stronę po zalogowaniu, a dla galerii zwraca mi plik z informacją o błednym zapytaniu (kod 400). Strona nie przekierowuje na inny adres, bo sprawdzałem w nagłówkach, a poza tym IdHttp1 ma domyślnie zostawione HandleRedirects na False. Co robię nie tak? Jak zrobić żeby pod Synapse też działało, bo szczerze pisząc wolał bym w programie użyć raczej komponentu Synapse. Z dokumentacji wyczytałem że KeepAlive jest i tak domyślnie na True, ale nie wiem czy to ma tutaj jakiekolwiek znaczenie. Przy pobieraniu metodą GET sprawdziłem cookies i są nadal takie same jak przy POST. Na samym końcu wklejam wygląd pliku galeria_ oraz naglowki. Z góry dziękuję za wszelką pomoc. Bo póki nie okiełznam Synapse, w tej kwestji, to nie rusze dalej z kodem. INDY: Delphi var Input, Output : TStringStream; begin Input := TStringStream.Create(''); Output := TStringStream.Create(''); IdHttp1.Request.UserAgent := 'User-Agent: Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10'; IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded'; IdHttp1.Port := 80; IdHttp1.Host := '78.46.103.181'; Input.WriteString('login=' + UserEdit.Text + '&pass=' + PassEdit.Text + '&action=zaloguj'); IdHttp1.Connect; IdHttp1.Post('http://www.heyaclub.pl/index.php?go=profile', Input, Output); Memo1.Text := Output.DataString; Memo1.Lines.SaveToFile('D:\test_indy.html'); Memo1.Text := IdHttp1.Get('http://www.heyaclub.pl/index.php?go=galeria'); Memo1.Lines.SaveToFile('D:\galeria_indy.html'); IdHttp1.Disconnect; end; Synapse: Delphi var UrlData : string; SynHttp : THttpSend; begin SynHttp := THttpSend.Create; UrlData := 'login=' + UserEdit.Text + '&pass=' + PassEdit.Text + '&action=zaloguj'; SynHttp.TargetPort := '80'; SynHttp.TargetHost := '78.46.103.181'; SynHttp.UserAgent := 'User-Agent: Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10'; SynHttp.MimeType := 'application/x-www-form-urlencoded'; SynHttp.Document.Write(Pointer(URLData)^, Length(URLData)); SynHttp.HTTPMethod('POST', 'http://www.heyaclub.pl/index.php?go=profile'); Memo1.Lines.LoadFromStream(SynHttp.Document); Memo1.Lines.SaveToFile('D:\test_synapse.html'); SynHttp.HTTPMethod('GET', 'http://www.heyaclub.pl/index.php?go=galeria'); SynHttp.Headers.SaveToFile('D:\naglowki_synapse.txt'); Memo1.Lines.LoadFromStream(SynHttp.Document); Memo1.Lines.SaveToFile('D:\galeria_synapse.html'); SynHttp.Free; end; Wygląd pliku galeria_synapse.html: KOD <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> Request header field is missing ':' separator.<br /> <pre> HTTP/1.1 200 OK</pre> </p> <hr> <address>Apache/2 Server at localhost Port 80</address> </body></html> Wygląd pliku naglowki_synapse.txt: KOD HTTP/1.1 400 Bad Request
Date: Wed, 10 Mar 2010 01:46:48 GMT Server: Apache/2 Content-Length: 368 Connection: close Content-Type: text/html; charset=iso-8859-1 -------------------- Pozdrawiam: olesio
|
|
|
|
śro, 10 mar 2010 - 04:10
Post
#2
|
|
|
Pomocna dłoń Grupa: Super użytkownicy Postów: 261 Dołączył: sob, 22 wrz 07 Skąd: Szczecin Nr użytkownika: 899 Gadu-Gadu: 478088 |
Piszę nowy post bo przy edycji do poprzedniego tekstu dostają się "krzaki". Poradziłem sobie tak:
Delphi //... SynHttp.Clear; SynHttp.HTTPMethod('POST', 'http://www.heyaclub.pl/index.php?go=galeria'); /... Ale czy to jedyne rozwiązanie? I czy robiąc od nowa POST, bo wiem z dokumentacji że procedura Clear czyści nagłowki, document oraz MimeType. Jednak jakieś dane chyba zostają, skoro już do dokumentu nie muszę przekazywać hasła oraz nazwy użytkownika. To chyba dlatego że Ciastka przechowują odpowiednią wartość. Czy przez serwer www, będzie to odebrane jako wchodzenie na kolejną podstronę czy jakoś inaczej jako logowanie się tam na nowo? Bo nie mam pewności. -------------------- Pozdrawiam: olesio
|
|
|
|
![]() ![]() |
|
Wersja Lo-Fi | Aktualny czas: piątek, 10 wrzesień 2010 - 22:25 |