Jak się zalogować z poziomu kodu

0

Witam. Aby zalogować się do internetu, pojawia mi sie taka stronka, gzie muszę wpisać usera i password. Pytanie: jak spreparować tekst aby przesłać odpowiedź metodą post (TIdHttp) aby się zalogować? podaję kod strony

<HTML>
<HEAD>
<TITLE>Enter Proxy XXX</TITLE>
</HEAD>
<BODY style="font-family: trebuchet ms">
<CENTER>
<table style="border: 2px solid #666666;width:600px;color: #010099">
<tr><td align=right style="padding: 4px;">
<H1>Internet access</H1></td></tr>
<tr><td style="padding: 4px;">
XXX <I>XXX</I> and <I>XXX</I>.<BR>
XXX <I>XXX</I> XXX <I>XXX</I> XXX</td></tr>
<tr><td align=center style="font-size: 12px;padding-top:6px">XXXX.</td></tr><tr><td align=center>
<P>
<FORM METHOD="POST" ACTION=https://xxx.com/?bcfru=aHR0cDovL3d3dy53c2UuY29tLnBsL3d5=>

<table bgcolor=#F1F1F1 style="border: 1px solid #666666;margin-top: 14px">
<tr><td>Userid</td><td><INPUT id="username" NAME="_USERNAME" MAXLENGTH="64" VALUE=""></td></tr>
<tr><td>Password</td><td> <INPUT TYPE=PASSWORD NAME="_PASSWORD" MAXLENGTH="64"></td></tr>
<INPUT TYPE=HIDDEN NAME="_REQUEST_ID" VALUE="">
<INPUT TYPE=HIDDEN NAME="_PRIVATE_CHALLENGE_STATE" VALUE="">
<tr><td colspan=2><INPUT TYPE=SUBMIT VALUE="Login"> <INPUT TYPE=RESET></td></tr>
</table>
</FORM>
<script>document.getElementById('username').focus();</script>
<P>
</td></tr>
</table>
</CENTER>
</BODY>
</HTML>
</quote>
0

Czy mógłby ktoś mnie naprowadzić co mam przesłać w metodzie Post()? Nie chcĘ gotowca, ale nie mam pojęcia jak spreparować stringa z haslem i loginem. Gdzie?, Jak?
Pomocy...

0

Po pierwsze zamiast Indy polecam szczerze pakiet Synapse i komponent niewizualny THttpSend. A
po drugie pobiersz sobie sniffer WireShark i zobacz w tutorialach video na YoutTube jak go używać.
Pod ów snifferem zobacz jakie dane w TCP Stream są wysyłane metodą POST i do jakiej strony, no
a później takie same dane wyślij THttpSend. Poniżej masz prosty przykład jak metodą POST loguję
się na stronę pewnego szczecińskiego klubu. Tutaj logowanie jest specyficzne - gdyż po zmianach,
najpierw trzeba odwiedzić stronę głowną, a następnie zapamiętać pobrane ciasteczka, usunąc dane
ktore zawiera już komponent, jak dokument czy nagłowki i ciasteczka. A następnie przywrócić owe
ciasteczka i zalogować się metodą POST z danymi które zawiera zmienna UrlData. Podejrzewam, że
w przypadku Twojej strony będzie to prostsze. Dzięki temu kodowi powinieneś zrozumieć ideę, bo
podając kod html strony niewiele to daje. Potrzeba najlepiej prześledzić wysyłane informacje. I do
sekcji uses dodaj moduł httpsend oczywiście. Pokombinuj, a na pewno - jeżeli strona nie używa, a
chyba nie używa JavaScriptu - powinno się Tobie udać. Powodzenia życzę, a więcej informacji jest
zawarte w dołączonych do pakietu Synapse dokumentacji oraz przykładach. A oto mój prosty kod:

const
  Base_Url = 'http://www.heyaclub.pl/';
  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;
0

olesio pytanie było o Indy czy jak ktoś zapyta jak coś naprawić w "maluchu" odpowiesz kup sobie BMW to Ci powiem? Po drugie skoro jest kod HTML formularza to widać co trzeba wysłać i nie trzeba żadnego WireShark'a zresztą jest wtyczka do FF nazywa się Live HTTP Headers i w zupełności do tego wystarcza. Z tego co widzę to SSL (adres HTTPS) więc w w IdHTTP trzeba jako IOHandler ustawić komponent TIdSSLIOHandlerSocketOpenSSL (zakładka Indy I/O Handlers) do tego w katalogu z programem muszą znajdować się biblioteki ssleay32.dll i libeay32.dll a reszta to wysłać zapytanie metodą Post co i jak dokładniej raczej znajdziesz w Google a jak nie to pytaj.

0

Dzieki kAzek. Chyba masz rację co do ustanowienia połączenia bo mi wywala "Forbiden 403", gdy probuje przesłac coś takiego:

url:= -> ten co podany w kodzie z cyferkami: https://.....=
send:= TStringList.Create;
send.Add('_USERNAME=ja&_PASSWORD=pasword'); // komponent ;
recev:= TStringList.Create;

idHTTP.Post(url, send, recev);

Poprobuje z tym SSL, a jak nie, to bede musiał dodać WebBrowsera i wyswietlic stronke logowania..
Dzieki za odpowiedzi, pozdrawiam.

0

Nie wiem jak to robisz ale powinieneś GET normalny adres strony i dopiero z kodu strony pobrać adres (ACTION z formularza) na który masz wysłać POST. Kolejną sprawą jest to że formularzua masz pola: _USERNAME i _PASSWORD i kilka innych których nawet nie próbowałeś wysłać a nie USER i PASSWORD. Gdybym wiedział jaki jest prawdziwy adres strony napisałbym więcej jak to ma wyglądać.
EDIT// widze że wyedytowałeś zapytanie ale nadal brakuje kilku pól i tak jak napisałem pewnie trzeba GET aby pobrać stronę logowania a dopiero później POST a 403 to brakuje pewnie jakiegoś ciacha (bo nie było GET) albo ustawić Referer na adres strony logowania mozliwe też zże to z powodu brakujących pól (tych których nie wysyłasz) formularza.

0

Sorry, za wczesnie kliklem "Publikujtemat", juz poprawilem.
Z reszta chodzi o ideę. Z tego co wyczailem, to adres jest stały, zmienia się tylko ta częć (xxx.com/?bcfru=aHR0cDovL3d3dy53c2UuY29tLnBsL3d5bmlraS9) po znaku zapytania - wnioskuję że jest to jakiś odnośnik, zakodowany adres czy cos strony którą chcĘ otworzoyc, po po wpisaniu danych do formularza logowania (wyswietlonego w przeglądarce) po zalogowaniu wyswietla sie stron na ktora chcialem wejśc.
Niestety, całego orginalnego HTML'a nie mogę podać.
Dzieki za chęć pomocy.

0

kAzek: może i masz rację, ale ja korzystam akurat z Opery, nie znam się na htmlu prawie wcale
dlatego zawsze wolę podejrzeć co mi WireShark pokazuje, a Synapse polecam bo jest lepsze od
Indy i jak dla mnie latwiejsze. Mam je również w miarę opanowane, ale nie zmusza do używania.

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