Skoro masz problemy z Indy, to ja tradycyjnie polecam pakiet Synapse oraz komponent THttpSend
wchodzący w jego skład. Jeżeli wysyłasz nim dane POSTem to jeżeli zwrócony ResultCode - będzie
wynosił 301 albo 302 - to z nagłowków (Headers - są typu TStringList tak jak Cookies) wyciągasz
Locaction, jak znowu nastąpi przekierowanie lub nie, a w nagłowkach masz nazwę pliku to także i
ją możesz łatwo pobrać. A poniżej przykładowy kod, ktory z użyciem modułu httpsend - z pakietu
Synapse loguje się na stronę pewnego szczecińskiego klubu. Program pobiera zdjęcia z galerii, co
są dostepne dopiero po zalogowaniu. Jak widzisz obsługiwane jest przekierowanie. Powinnaś imo
na podstawie tego fragmentu zrozumieć ideę. Więcej jest do znalezienia w google oraz pomocna
może się też okazać oczywiście dokumentacja pakietu. Jednak jeżeli uprzesz się przy Indy, to ja
niewiele jestem w stanie doradzić. Ja od dłuższego czasu staram się trzymać od indy z daleka ;/
//...
const
Base_Url = 'http://www.heyaclub.pl/';
Profile_Page = 'index.php?go=profil';
Gallery_Page = 'index.php?go=galeria';
Gallery_SubPage = '&page=';
ToPost_MimeType = 'application/x-www-form-urlencoded';
Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
// ...
function HeyaPostToMemoryStream(const URL : string;
HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream) : boolean;
const
Location_Prefix = 'Location:' + #32;
var
SynHttp : THttpSend;
I, Position : integer;
OldCookie, UrlData, Str, DirectLink : string;
begin
OldCookie := '';
SynHttp := THttpSend.Create;
try
SynHttp.KeepAlive := True;
SynHttp.Protocol := '1.1';
SynHttp.UserAgent := Opera_UserAgent;
SynHttp.HTTPMethod('GET', Base_Url);
OldCookie := SynHttp.Cookies.Text;
SynHttp.Clear;
SynHttp.Cookies.Text := OldCookie;
SynHttp.MimeType := ToPost_MimeType;
URLData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
Result := SynHttp.HTTPMethod('POST', Url);
case SynHttp.ResultCode of
301, 302 :
begin
for I := 0 to SynHttp.Headers.Count - 1 do
begin
Str := SynHttp.Headers[I];
Position := Pos(Location_Prefix, Str);
if Position > 0 then
begin
DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
Break;
end;
end;
HeyaPostToMemoryStream(DirectLink, HeyaUserName, HeyaPassword, MemoryStream);
end;
else
MemoryStream.Clear;
SynHttp.Document.SaveToStream(MemoryStream);
MemoryStream.Position := 0;
end;
finally
SynHttp.Free;
end;
end;