Skocz do zawartości


[Delphi] Łączenie ze stroną *.jsp przy pomocy Indy

delphi indy jsp http

1 odpowiedź w tym temacie

#1 AdamCziker

    Nowy na forum

  • Użytkownicy
  • 1 Postów:

Napisano śro, 17 wrz 2014 - 08:51

Witam wszystkich serdecznie :)

Tworzę program, którego zadaniem jest łączenie się ze stroną tworzoną dynamicznie (jsp) przy użyciu loginu i hasła. Co chcę osiągnąć - chcę, żeby program sprawdzał czy udało się poprawnie zalogować, a jeśli nie, to żeby zwracał komunikat "Błędny login lub hasło".

Dla normalnych stron (html) kod działa bez problemu, jednak dla stron z rozszerzeniem jsp program pokazuje, że udało się połączyć (nawet gdy dane są niepoprawne).

I tu moje pytanie - czy takie coś jest w ogóle możliwe? Korzystam ze środowiska Borland Delphi 7 Personal z doinstalowanymi komponentami Indy (wersja 10.1.5.0).

Kod źródłowy (do wglądu)

delphi
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdSSL, IdSSLOpenSSL, IdCookieManager, StrUtils;
type
  TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        Edit1: TEdit;
        Edit2: TEdit;
        Label1: TLabel;
        Button1: TButton;
        Memo1: TMemo;
        IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
        IdCookieManager1: TIdCookieManager;
        procedure Button1Click(Sender: TObject);
  private
        { Private declarations }
  public
        { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
post: TStringList;
poczatek, koniec: integer;
aStream: TMemoryStream;
HTML, authToken: string;
fLogin, fHaslo: string;
begin
IdHTTP1.HandleRedirects := True;
fLogin := Edit1.Text;
fHaslo := Edit2.Text;
HTML := IdHTTP1.Get('https://e-skok.pl/eskok/login.jsp');
poczatek := Pos('name="token" value="', HTML) +
Length('name="token" value="');
koniec := PosEx('"', HTML, poczatek);
authToken := copy(HTML, poczatek, koniec - poczatek);
post := TStringList.Create;
try
   post.Add('token=' + authToken);
   post.Add('username=' + fLogin);
   post.Add('password=' + fHaslo);
try
   IdHTTP1.Request.ContentType:= 'application/json';
   HTML:= IdHTTP1.Post('https://e-skok.pl/eskok/login.jsp', post);
   Memo1.Text:= HTML;
   Label1.Caption := 'YES';
except
        if IdHTTP1.ResponseCode = 401 then
     begin
     ShowMessage('Nieprawidłowy login lub hasło.');
     Label1.Caption := 'NO';
     end
        else
        Label1.Caption := ':)';
end;
finally
   post.Free;
end;
end;
end.


Z góry dziękuję za zainteresowanie tematem i pomoc :)

#2 olesio

    Ekspert

  • Super użytkownicy
  • 363 Postów:
  • Gadu-Gadu:478088

Napisano śro, 17 wrz 2014 - 19:32

Chłopie, ogarnij się! Po cholere piszesz ten sam wątek na 8623823384 forach?! Na 4p dostałeś już odpowiedzi. Na szybko z tego co patrzyłem pod Synapse (bo gardze Indykiem i nie używam tego pakietu od dawna ze względu na nieprzewidziane problemy) strona głowna wcale nie zwraca mi żadnego tokenu po GET w jej treści. Tak samo nie ma tego w treści strony wizytowanej pod prawdziwą przeglądarką. Najprostsza lamerska metoda przy stronach HTTPS żeby wiedzieć co na prawde słane jest POST'em, to zapis strony na dysk i podmiana adresów z HTTPS na HTTP. Ale czasem się może to nie powieść.

Zobacz na kod pod tym adresem: http://pastebin.com/n6hzSFEm (nie wklejam go tutaj, bo forumowy parser niemal zawsze rozwala formatowanie czyniąc kod słabiej czytelnym). Także tutaj trzeba ogarnąc obsługe ich captchy. W ogóle powinieneś kontaktować się z bankiem w sprawie obsługi ich strony. Na ogół banki preferują do obsługi ich stron płatne API. Takie życie. Także będzie prościej, a nie modzisz coś po omacku i smarujesz na wszelkie możliwe fora netowe. Imo nie tędy droga.