Zalogowanie do html auth i pobranie pliku

0

Witam, potrzebuję w delphi napisać program:
Mam
edit1. Login
maskedit. hasło
Na tych danych loguję się powiedzmy na stronie
www.xxx.xx/members(poprzez html auth)
I następnie pobieram plik pobranie pliku wiem jak najlepiej SynHttp.

0

Skoro piszesz o SynHttp to rozumiem, że masz na myśli pakiet Synapse i komponent THttpSend.
Jeżeli tak, to musisz wcześniej wysłać dane metodą POST do serwera, zaś później nie czyszczać
ciasteczek pobrać żądany plik. Jak pod tym pakietem wysyłać dane POSTem lub pobierac GETem
do znudzenia pisałem już na tym forum, także poszukaj moich wcześniejszych wypocin. A jeżeli
masz wątpliwości co masz wysłać POSTem, pobierz program WireShark. Pod nim przeanalizujesz
zawartośc pakietów wysyłanych przy logowaniu przez prawdziwą przeglądarkę internetową. I jak
używać owego program - dowiesz się między innymi z tutoriali video zamieszonych na YouTube.

0

Mógł byś pokazać te tematy niezbyt mogę je znaleŹć? a jest jakaś prostsza metoda?

0

Ech leniwce nieszukające, wiem że wyszukiwarka na forum jest taka sobie, ale od czego masz google? Przenalizuj
sobie ten poniższy kod, loguje się on na strone pewnego szczecińskiego klubu z którego później metodą Http GET
pobieram sobie galerie. A nie rozumiem skąd takie pytanie czy da się prościej. Przecież to jest raczej najprostsza
metoda jaką da się użyć. O ile strona nie wymaga JavaScriptu do operacji, a chce się udawać "przeglądrkę" www.

//...
uses
  httpsend;
//...

const
  Base_Url = 'http://www.heyaclub.pl/';
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.63';

//...

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.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    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;
0

@olesio

wiem że wyszukiwarka na forum jest taka sobie

Taka sobie? To jest tragedia. No, ale to też ma swój plus: może zaczną szukać więcej w google.

0

No właśnie szkoda że znikneła możliwość szukania po autorze i innych przydatnych rzeczach, a przynajmniej ja tego
już nie widzę w nowej wersji. Poza tym przycisk "Oznacz wszystkie posty jako przeczytane" by się przydał. ale o tym
nie tylko ja pisałem na subforum od Coyote - jednak jak widać nasze sugestie tworzący Coyote chyba zignorowali ;/

0

ale to jest! - na górze po prawej masz ilość tematów - najedź nad to myszką

1

Faktycznie Misiekd, dzięki. Jednak może źle patrzę, ale nie widzę w wyszukiwarce żadnych zaawansowanych ustawień jak szukanie po autorze itp.

0

Aktualnie mam takie coś:

var
  Form1: TForm1;
    FPage1 : string;
  SynHttp1 : THttpSend;
  Stringlist : Tstringlist;

  const
    Base_Url = 'http://www.xxx.pl/members/index.php';
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.63';


implementation

uses Unit2;


{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
const
Location_Prefix = 'Location:' + #32;
autoryzacja = 'xxxxxxxxxxxxxxxxxxxxxxxx';
var
  FPage : string;
  auth : THttpSend;
  download : THttpSend;
  SynHttp : THttpSend;
  OldCookie, UrlData, pass, user, Url, Str, DirectLink : string;
begin
  pass := Edit1.Text;
  user := MaskEdit1.Text;
  OldCookie := '';
  SynHttp := THttpSend.Create;
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    URLData := 'username=' + user + '&password=' + pass + '&action=OK';
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));

  download := THttpSend.Create;
  download.UserAgent := Opera_UserAgent;
  download.HTTPMethod('GET', 'http://xxx.pl/members/auth.txt');
  SetLength(FPage, SynHttp.Document.Size);
  download.Document.Read(Pointer(FPage)^, Length(FPage));
  download.Free;
  if Fpage = autoryzacja then begin
  Edit1.Text:='Auth Ok!';
  end;

Lecz program sie kompiluje a po kliknięciu btn1 nic sie nie dzieje

0

Ty nie myślisz co robisz, nie wiem o jaką stronę konkretnie chodzi dlatego tylko spojrzałem pobieżne.
I widzę takie błędy. Po co używasz różnych obiektów do pobierania i autoryzacji, użyj jeden, bo skąd
inny obiekt ma mieć odpowiednie ciasteczka jak ich nie przekazałeś. A poza tym widzę, że zapisujesz
w zmiennej URLData dane, ale ich nie wysyłasz POStem tylko od razu pobierasz jakąś stronę. Widzę,
że na ślepo przeklepałeś ode mnie kod, który podałem jako przykład do działania zupełnie innej www.
Musisz myśleć co robisz, jak nie ogarniasz, to zacznij od czytania kursów i podstaw oraz tworzenia w
miarę prostych aplikacji, jak używanie Synapse Ciebie przerasta. Czytaj dokumentację od Synapse i
sprawdź pod WireSharkiem co faktycznie POSTuje przeglądarka przy logowaniu i popraw to - o czym
pisałem wcześniej. A i skoro nie pokazuje się Tobie 'Auth Ok!' to znaczy, że zmienna FPage, zawiera
co innego niż przewidziałeś. Zapisz sobie do pliku to co pobiera kod lub pokaż w MessageBoxie to już
będziesz wiedział co jest w niej zawarte. Poza tym jak strona może zawierać prawidłowe dane, jakie
mają być po autoryzacji, jak Ty tylko pobierasz stronę. Rzadko zdarza się, aby logowanie do strony
odbywało się przez same pobranie, wcześniej trzeba cokolwiek wysłać metodą POST. A w ogóle nie
masz pojęcia co robisz, ale w tym nie pomogę, bo ile można odwalać coś za ludzi, a tymbardziej że
pomimo otrzymanego kodu z sugestiami i banalnymi podstawami, Ty go bezmyślnie przerabiasz ;/

0

A jak pobrać plik dll i zapisać go do pamięci a następnie z pamięci użyć?

0

Zapisujesz przy użyciu na przykład Synapse do TMemoryStream, a następnie wczytujesz używając modułu dllloader,
który wrzuciłem pod adres: http://www.mediafire.com/file/65y9x36pt8vhuvo/dlltools.rar (i ten link nie wygaśnie).

0

ok, co do użycia dllki to użyję LoadLibraryA, a jak wygląda logowanie z pobieraniem na INDY?

0

Dobra zrobię to na synapse ale jest pewien problem ja potrzebuję zalogować się do PHP AUTH
a nie na takie zwykłe logowanie jak do tego klubu.
A ten kod na php auth nie działa.

0

Z Indy to może ktoś inny Tobie pomoże, bo ja mam opanowane raczej Synapse, Indy używam rzadziej. a
co do logowania, nie wiem co to jest to php auth, ale jeżeli strona jest faktycznie w czystym php i nie ma
w niej wstawek JavaScriptowych, które są potrzebne do zalogowania - to pod Indy czy Synapse myślę, że
nie powinno być problemów z zalogowaniem. Trzeba tylko POSTem wysłać prawdiwłoe dane. A i na stronę
tego klubu też po zmianach musiałem zmienić kod, bo pobieranie galerii nie było takie łatwe jak się Tobie
wydaje, ale pomógł tutaj WireShark zalecany przez autora Synapse. Jak chcesz wiedzieć jak loguje się do
strony prawdziwa przeglądarka www to skorzystaj właśnie z WireSharka - tutoriale video aą na YouTube.

0

Http Auth to jest Okno które wyskakuje na stronie, takie np. jak chcemy zalogować się do routera

<?php $valid_passwords = array ("zzzzz" => zzzzz", "zzzzz" =>"zzzzz"); $valid_users = array_keys($valid_passwords); $user = $_SERVER['PHP_AUTH_USER']; $pass = $_SERVER['PHP_AUTH_PW']; $validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]); if (!$validated) { header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); die ("Not authorized"); } echo "

Welcome $user.

"; echo "

Congratulation, you are into the system.

"; ?>
0
var
  Form1: TForm1;
    FPage1 : string;
    haxloaded : string;
  SynHttp1 : THttpSend;
  Stringlist : Tstringlist;
  pass : string;
  user : string;
  MsgStr: String;
  auth: string;
  MemoryStream: TMemoryStream;


  const
  NewLine = #13#10;
    Base_Url = 'http://www.xxx.pl/members/';
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.63';


implementation

uses Unit2;


{$R *.dfm}

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.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HeyaPostToMemoryStream('www.xxx.pl/members/auth.txt', Edit1.Text, MaskEdit1.Text, MemoryStream);
  memo1.Lines.LoadFromStream(MemoryStream);
 // if auth = 'authkode' then begin
 // haxloaded := '1';
  end;

I dlaczego jak klikam Button1 to po ok 1-2sek program sie crashuje ?!

0

bo probujesz zaladowac do memo cos co chyba nie istnieje.
masz mienna globalna o tej samej nazwie co parametr w tej funkcji.
w funkcji dzialas na parametrze (ktory jest const!) a do memo ladujesz globalna.

0

No to w takim razie jak załadować MemoryStream? do memo1 z funkcji.

0

Siedzę już nad tym od rana i nadal nie działa , próbowałem wieloma sposobami,
Potrzebuję
by skrypt wszedł na www.xxx.pl/members/index.php
Zalogował się na HTTP AUTH
[img]http://obrazki.elektroda.net/33_1294416391.jpg[/img]
A następnie to co wyświetli skrypt php (czyli całą tekstową zawartość strony zapisał do zmiennej string) dalej już sobie poardzę.

0

Ja się upieram tak jak Ty robisz po swojemu, to ja Tobie radzę po swojemu. Przeanalizuj pod WireSharkiem w jaki sposób
na stronę loguje się przeglądarka www. Co do wczytania tekstu z MemoryStreama do Memo - to jest przecież metoda dla
Lines o nazwie LoadFromStream. A jak chcesz podstawić do zmiennej typu string to co jest w streamie, to zrobisz to tak,
jak poniżej pokazałem. SynHttp to wiadomo THttpSend a FPage to string. Tylko oczywiście znak o kodzie #0, jeżeli taki
będzie w Document przerwie tekst. Widzę, że tajemnicę robisz do jakiej strony się chcesz zalogować, założ tutaj konto,
to będziesz mógł napisać mi na prywatną wiadomość z jaką stroną konkretnie się tak męczysz. A być może faktycznie z
użyciem Indy czy Synapse nie da się na nią zalogować, ale takie wątpliowści rozwiała by Tobie analiza pod WireShark.

//...
  SetLength(FPage, SynHttp.Document.Size);
  SynHttp.Document.Read(PChar(FPage)^, SynHttp.Document.Size);
//...
0

Przy rejestracji okazało się za mam już konto,
Strone podałem na private,
Problem w tym że tekst jest z przerwami a ma być zapisany cały, lecz ten program co podałeś nadal powoduje u mnie crash programu, nawet jak nie zapisuje do memo,(zapis memo to tylko dla testu co zwróci w delphi)
A co do WireSharka cos nieudolnie to robię i nic z tego nie rozumiem.

0

Odpowiedź z linkiem do przykładowego kodu wysłalem Tobie na prywatną wiadomośc. Po prostu tak pisałeś, że ciągle
z tą stroną miałeś problemy, a tutaj chodzi o najprostsze logowanie. Pod WireSharkiem przecież widać, że dane są, z
przeglądarki - tylko pobierane GET'em. Natomiast jakbyś pogooglował to byś wiedzial, że hasło w nagłowkach jest po
prostu kodowane algorytmem base64, do czego również Synapse posiada funkcje w module synacode. Wcześniej kod
jaki Tobie posłalem sprawdzalem na IP mojego rutera DLin, który w Memo zwrocił prawidlowy kod html, tylko, że dla
dalszego prawdilowego działania mój ruter wymaga aby przeglądarka obslugiwała javascript, a nie wiem - jak będzie
ze stroną na którą chcesz wejść. Jak sobie nie radzisz z takimi banałami jak obsluga Synapse przy dostępnej do niej
bogatej dokumentacji oraz przykładach, a także przejrzystemu podgłądowi pod WireSharkiem to powinieneś darować
sobie programowanie albo nauczyć się podstaw. Ogładałeś w ogóle te tutoriale na YouTube? Bo jak taka lama jak ja,
wie jak użyć tego programu po ich obejrzeniu, to każdy da radę. Niepotrzebnie namieszałeś mi z tym auth cośtam,
bo ja nie mogłem zaskoczyć o jaką stronę chodzi. Napisał byś, że to zwykły auth jak z plikami .htacess, to od razu
bym zajarzył. Swoją drogą to niby jakaś wylęgarnia "haxorów" pewnie ta strona jak taka tajna, bo pewnie przez te
słowo cracking rozumiecie złych hackerów, a nie łamanie oprogramowania, ale "zły haxor" taki jak ja, któremu się
uda jakiś prosty CDCheck w niespakowanym pliku obejść to prosty snifer umie obslużyć - Ty też raczej powinieneś.

0

W sniffowanie nigdy się nie bawiłem ale reverse engineering owszem =) ( nie w celu crackowania aplikacji)
lecz rozgryzania gier, dllki piszę w c++ a system logowania postanowiłem zrobić w delphi + php czyli dwa jezyki które ledwo umiem.

0

Spoko, już Tobie odpowiedziałem. Widać jednak, ze logowanie do każdej strony może być inne i to co testowałem na ruterze, nie zdalo egzaminu akurat
na tej stronie. Tak jak napisałem w wiadomości prywatnej - jeżeli miałbym dane do przykładowego konta, to od razu mógłbym, jak należy przetestować.
I całą pracę ułatwil mi właśnie WireShark. Polecam go używać, bo ułatwia sprawdzanie oraz pisanie aplikacji korzystających z wielu protokołow sieciowych.

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