synapse, jak pobrac miniature obrazka z bardzo nietypowej strony www

0

Ćwicze pobieranie różnych elementów z różnorakich stron za pomocą synapse i natrafiłem na pewien rodzaj strony z którą nie mogę sobie poradzić (chodzi o pobranie jakiejkolwiek miniatury obrazka ze strony http://www.girlsofdesire.org/celeb nie znalazłem innego przyzwoitszego przykładu tego typu stron, ale treść nie jest tutaj istotna :) chodzi o zasadę jak pobierać coś takiego - zdaje się że te miniatury w przypadku tej strony są tworzone dynamicznie na serwerze (bezppośredni link miniatury obrazka działa tylko po odwiedzeniu strony) )

var ciacho : string;
SynHttp : THttpSend;
.....
      SynHttp := THttpSend.Create();

       try

       SynHttp.KeepAlive := True;
       SynHttp.Protocol := '1.1';
       SynHttp.UserAgent := 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
       SynHttp.HTTPMethod('GET', 'http://www.girlsofdesire.org/celeb');
       ciacho := SynHttp.Cookies.text;


       SynHttp.Clear;
       SynHttp.KeepAlive := True;
       SynHttp.Protocol := '1.1';
       SynHttp.UserAgent := 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
      SynHttp.Cookies.Text := ciacho;

// tu przykładowa miniatura do pobrania ze strony http://www.girlsofdesire.org/celeb, podana na sztywno
      SynHttp.HTTPMethod('GET', 'http://www.girlsofdesire.org/media/pictures/2011-05-02-jennifer-lawrence/2_thumb.jpg');
      
SynHttp.Document.SaveToFile('C:\miniatura.jpg');
      

       finally
         SynHttp.Free;
       end;

jest to możliwe za pomocą synapse w tym konkretnym przypadku?

0

Jak jakiś mój kod sobie kopiujesz to korzystaj też z objaśnień. To nie Indyk ani święty Mikołaj, tutaj się nie zrobi "czary mary" i same przekierowanie się nie obsłuży. Kod:

uses
  httpsend;

procedure TForm1.Button1Click(Sender : TObject);
const
  Redir_C = 'Location: ';
var
  SynHttp : THttpSend;
  I, RedirPos : integer;
  ACookie, RedirUrl : string;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
    SynHttp.HTTPMethod('GET', 'http://www.girlsofdesire.org/celeb');
    ACookie := SynHttp.Cookies.text;
    SynHttp.Clear;
    SynHttp.Cookies.Text := ACookie;
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
    SynHttp.HTTPMethod('GET', 'http://www.girlsofdesire.org/media/pictures/2011-05-02-jennifer-lawrence/2_thumb.jpg');
    ShowMessage(SynHttp.Headers.Text);
    SynHttp.Document.SaveToFile('D:\miniatura.jpg');
    with SynHttp do
    begin
      while (ResultCode = 301) or (ResultCode = 302) do
      begin
        for I := 0 to Headers.Count - 1 do
        begin
          RedirPos := Pos(Redir_C, Headers[I]);
          if RedirPos > 0 then
          begin
            RedirUrl := Copy(Headers[I], RedirPos + Length(Redir_C), MaxInt);
            Headers.Clear;
            HTTPMethod('GET', RedirUrl);
            Break;
          end;
        end;
      end;
    end;
  finally
    SynHttp.Free;
  end;
end;

ShowMessage pokazuje:

---------------------------
Project1
---------------------------
HTTP/1.1 301 Moved Permanently
Location: /media/403.html
Content-Length: 0
Date: Mon, 02 May 2011 18:01:40 GMT
Server: lighttpd/1.4.22


---------------------------
OK   
---------------------------

I wszystko jasne, po nazwie dokumentu 403 można wnioskowac, że nie masz uprawnien do przejrzenia strony. To samo zresztą masz odwiedzając: http://www.girlsofdesire.org/media/pictures/2011-05-02-jennifer-lawrence/2_thumb.jpg z pod prawdziwej przeglądarki http://heyaclub.planie ciasteczek pewnie nic nie da. Jeżeli do tej strony wymagane jest logowanie. To musisz to zrobić metodą POST. Nie raz na forum pokazywałem przykłady. Debuggerem http albo snifferem WireShark (jak go używać dowiesz się z tutoriali video na YouTube) ustal sobie co jest wysyłane do strony przy logowaniu i Synapse wyślij to samo. Ewentualnie musisz odwiedzać strony w taki sposób aby dotrzeć do tej. Ale podejrzewam, że logowanie jest wymagane. I myśl logicznie. Po co zapisywać plik na dysku, przecież Document to TMemoryStream, można to od razu wczytać do TImage, o ile grafika jest w obsługiwanym formacie. A jak już masz zapis do pliku to jeżeli plik jest pusty to na 99,999% oznacza to, że następuje przekierowanie i dlatego Stream Dokument nie zawiera żadnych danych. No chyba, że w tym wielokropku był jakiś kod do logowania metodą POST to widocznie źle się logujesz. I polecam sobie ten UserAgent, a w przypadku POSTowania własnośc MimeType ('application/x-www-form-urlencoded') zadeklarowac jako stałe żeby się nie powtarzać. Co do ostatniego pytania, to tak - przy użyciu Synapse można zrobić niemal wszystko to co potrafi internetowa przeglądarka pozbawiona pluginów oraz obsługi javascriptu. A na pewno pobieranie jpegów nawet po zalogowaniu jest możliwe. Sam sobie napisałem taki program do szybkiego pobierania wybranych galerii z http://heyaclub.pl i wszystko działa, tylko czasami jak na stronie coś zmienią to również trzeba do tego dostosować kod :)

0

Dziękuje za odpowiedź :)

Patrzyłem oczywiście snifferem i nie widze tu POST`ów, a już na pewno nie potrzebne jest żadne logowanie

Wiem że wychodzi przekierowanie, a nie powinno ... powinno hipotetycznie wczytać ten obrazek gdyż symuluje zachowanie pzreglądarki (odwiedzam najpierw stronę z miniaturą, a potem miniature)

Tak przeglądraka bezpośrednio nie wyświetli tej miniatury, ale gdy przekierujesz do strony girlsofdesire i wczytasz miniature jeszcze raz to jednak ją wyświetli, stąd wnioskuje że kluczem będą ciacha.

kilka stron za pomocą synapse juz obsłużyłem i to z pozoru bardziej skomplikowanych a tu klops, i nie bardzo wiem gdzie kruczek :/

0

Aj bo tak patrzyłeś w Sniffer. Nie wiem jakiej przeglądarki używasz, ale trzeba spojrzeć było w ciastka najpierw. Pod Operą sprawdziłem i widziałem, że dla tej strony nie było w nich nic charakterystycznego. Był tylko chyba jakiś TRACKID. Ale upewniłem się WireSharkiem, wiadomo jak nie Ciastka to strony jeszcze potrafią posługiwać się nagłówkami. W tym przypadku potrzebny jest referer. Widac, że nigdy nie pobierałeś statych gier abandonware w czasach świetności serwisu Home of The Underdogs. Słynne kombinacje z refererem dla GetRighra, żeby strona miała pewnośc, że odwiedzono ją, a nie że ktoś kradnie linki. Takie zabezpieczenie jeszcze przed captchą. Taki sam myk jest na jednym serwisie ze skanami starych gazet i używa go mój downloader. Także: use the referer, Luck ;P Przykładowy kod i działa jak trzeba, bo Referer to właśnie, no taki odsyłacz, na podstawie któtego strona może identyfikowac z jakiego innego adresu na nią wchodzono. W przypadku wejścia bezpośrednio nie ma go lub nie jest tym co tutaj serwer oczekuje. Teraz mam nadzieje wszystko jest jasne :)

//...
uses
  httpsend, jpeg;
//...
var
  Jpg : TJPegImage;
  RedirUrl : string;
  SynHttp : THttpSend;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
    SynHttp.Headers.Insert(0, 'Referer: http://www.girlsofdesire.org/celeb');
    SynHttp.HTTPMethod('GET', 'http://www.girlsofdesire.org/media/pictures/2011-05-02-jennifer-lawrence/2_thumb.jpg');
    if SynHttp.ResultCode = 200 then
    begin
      Jpg := TJpegImage.Create;
      Jpg.LoadFromStream(SynHttp.Document);
      Image1.Picture.Assign(Jpg);
      Jpg.Free;
    end;
  finally
    SynHttp.Free;
  end;
end;
0

Nie wiem czy sam bym na to wpadł :), bardzo dziekuje olesio, chodziło dokładnie o ten referer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1