[delphi] wysyłanie cookisów na strone (najlpeiej rzezidhttp)

0

Witam.

Jak mogę otworzyć stronę z wysłaniem cookisów?
Chodzi mi najprosciej jak się, po prostu chce aby program otwierał strone http://mojastrona.pl wraz z wysłaniem ciastek o naziwe nazwa1=wartosc1 itd.
Dobrze by też było znać źródło strony po wysłaniu ciastek.

0

Rozumiem że sam chcesz ustalić zawartość ciasteczek - i na przykład - zalogować się do strony poprzez POST?
Jeżeli tak to proponuje akorzystać z komponentów Synapse. Dodajesz httpsend do sekcji uses i robisz np. tak:

var
  SynHttp : THttpSend;
begin
  SynHttp := THttpSend.Create;
  SynHttp.Cookies.Add('jakie ciastko chcesz tworzysz bo ta zmianna to StringList');
  SynHttp.HTTPMethod('POST', 'http://adres-strony.net/costam', );
  Memo1.Lines.LoadFromStream(SynHttp.Document);
  SynHttp.Free;
end;

Poniżej inny przykłąd kodu. Po prostu programem - snifferem Wireshark ustaliłem logując się przeglądarką, a
konkretnie Operą, co jest przekazywane POST'em do strony i napisałem sobie procedurę, która loguje się na
stronie http://www.heyaclub.pl w celu pobierania stamtąd galerii zdjęć, bo łatwiej się przegląda mi je poprzez
AcdSee niż zmniejszone pod przeglądarką klikając na jakieś nawigacyjne przyciski. Wcześniej założyłęm tam do
przeglądania zdjęć wymagane konto. Procedurę wywołuje - jak poniiżej. Odpowiedź mam w MemoryStreamie.

  HeyaPostToMemoryStream(Base_Url + Profile_Page, AUser, APass, MS);

Cały kod. Ta procedura akurat pobiera do MemoryStreama, ale jest też zapisywanie do plików tego Streama:

//...
const
  Base_Url = 'http://www.heyaclub.pl/';
  Profile_Page = 'index.php?go=profile';
  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.2.15 Version/10.10';
//...
function HeyaPostToMemoryStream(const URL : string;
  HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  UrlData, Str, DirectLink : string;
begin
  UrlData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
  SynHttp := THttpSend.Create;
  try
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    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;

Ważny w tym przypadku jest MimeType, ale to co on zawiera możesz podejrzeć Wireshark'iem. Bo jak chcesz
jedynie mieć odpowiednie ciasteczka to spreparujesz je tak jak podałem na począrku. Poza metodą POST, ta
funkcja HttpMethod może jeszcze pobrać nagłowki poprzez parametr 'HEAD' lub pobierać za pomocą 'GET' :)

0

A jak mam zadeklarować w Tstringlist dwa ciasteczka:

  1. nazwa: login wartość: marcin11
  2. nazwa: password wartość: 123456
0

Nie bardzo znam się na "ciasteczkach". Sprawdziłeś Wiresharkiem stronę przy logowaniu - czy są to osobne
dwa "ciasteczka"? Ja bym spróbował dodać je w osobnych liniach i wysłać. Chyba że nie działa, to nie wiem.

0

Tylko ja nie mam pojecia jak ja mam je w ogole wysłać, możesz podać przykład jak wysłać konkretne 2 ciasteczka?

0

Ech, przecieZ napisałem Tobie przykład. Ciasteczka to TStringList, jak nie wiesz jak taki obiekt działa - to sobie
w googlach poszukaj informacji albo w dokumentacji Delphi, zajrzyj też do pomocy samego Synapse. A ja nie
wiem czy takie coś zadziała. Musiał byś jakimś programem, na przykład Wireshark (filmiki - jak go używać są
na youtubie, ja z nich się nauczyłem) sprawdzić co zwraca strona jak się zalogujesz do niej przeglądarką. Jak
dalej nie wiesz co z czym to albo się nie da poprzes Delphi (w co wątpie) albo daruj sobie programowanie albo
napisanie takiego programu, bo Cie przerósł. Napisałem Tobie kod. A ten nie wiem czy zadziała, ale popróbuj:

var
  SynHttp : THttpSend;
begin
  SynHttp := THttpSend.Create;
  SynHttp.Cookies.Add('Ciasteczko numer 1');
  SynHttp.Cookies.Add('Ciasteczko numer 2');
  SynHttp.HTTPMethod('POST', 'http://adres-strony.net/costam', );
  Memo1.Lines.LoadFromStream(SynHttp.Document);
  SynHttp.Free;
end

Odpowiedź, jaką zwróci strona będziesz miał widoczną w Memo1, które musisz umieścić na swojej fromatce.

0

tak, ale w taki sposób ustawię tylko nazwy ciasteczkom, a muszę im jeszcze przypisać wartości!

0

Nie musisz na mnie krzyczeć, to ja powinienem na Ciebie krzyknąć czytaj dokumentację! Tam wyrażnie piszą:

property Cookies: TStringList read FCookies;

This is stringlist with name-value stringlist pairs. Each this pair is one cookie. After HTTP request is returned
cookies parsed to this stringlist. You can leave this cookies untouched for next HTTP request. You can also
save this stringlist for later use.

Poza tym zobacz na ten przykład. W cookiesach mam dane potrzebne do zalogowania na jednym forum, te
dane widać w Operze w poglądzie ciasteczek. Ale skopiowanie ich ich nazw oraz wartości to za dużo roboty.
Toteż odpaliłem przydane narzędzie jakim jest Wireshark. Ustawiłęm filtr na http, podłączyłem się do mojej
karty sieciowej, wszedłem na forum, zatrzymałem przechwytywanie połączeń i dałem z menu Analyze dość
przydatną opcję Follow TCP Stream. Dzieki niej miałem w formie tekstowej podane że moja przeglądarka,
przy logowaniu na stronę podała dwa ciasteczka. Jedno zakodowane dane do logowania, a drugie takie jak
widzizz w kodzie poniżej. Przełożyłem to na kod Delphi i Synapse. Pobrałem stronę do pliku test.bin, który
po podejrzeniu go zawiera słowa Wyloguj [olesio] czyli na pewno jest to strona - widoczna po zalogowaniu
na akurat to forum. Także najpierw sobie pokombinuj trochę samodzielnie, bo samodzielność to nic złego.

const
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10';

procedure DownloadToFile(const URL : string; const FileName : string);
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  Str, DirectLink : string;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.UserAgent := Opera_UserAgent;
    // najpierw pierwsze ciasteczko czyli zmienna=wartosc; zmienna2=wartosc2 i tak dalej
    SynHttp.Cookies.Add('__utma=costam; inne_zmienna=ktora_pozwala_sie_zalogowac; i_tak_dalej=jak_widac');
    SynHttp.Cookies.Add('$Version=1'); // drugie ciasteczko
    SynHttp.HTTPMethod('GET', 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;
          DownloadToFile(DirectLink, FileName);
        end;
    else
      SynHttp.Document.SaveToFile(FileName);
    end;
  finally
    SynHttp.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  Adresik = 'http://emulacja.net/forum/';
begin
  DownloadToFile(Adresik, 'test.bin');
end;
0

OK, ale rozwiazalem to troszke inaczej:

str : TStringlist;
str.Values['nazwa1']:='wartosc1'; itd.

I co najważniejsze program działa idealnie tak jak zamierzałem, WIELKIE DZIĘKI ZA POMOC! [browar]

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