Witaj Gościu ( Zaloguj | Rejestruj )

 
Reply to this topicStart new topic
[Delphi] Synapse - pobieranie przez GET będąc zalogowanym po POST
olesio
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
Go to the top of the page
 
+Quote Post
olesio
post ś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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: piątek, 10 wrzesień 2010 - 22:25