Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Login mit TWebBrowser (https://www.delphipraxis.net/38172-login-mit-twebbrowser.html)

Smarty 15. Jan 2005 18:41


Login mit TWebBrowser
 
Hallo
Habe mir ein kleines Programm geschrieben um mich auf einer Seite automatisch einloggen und Aktionen durchführen zu können. Hier mal der Code:
Code:
rocedure TForm1.Button1Click(Sender: TObject);    
begin    
timer1.enabled:=false;    
timer2.enabled:=false;    
timer3.enabled:=true;    
end;    

procedure TForm1.Timer3Timer(Sender: TObject);    
begin    
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/');    
WebBrowser1.SetFocus;    
timer1.enabled:=true;    
timer3.enabled:=false;    
end;    

procedure TForm1.Timer1Timer(Sender: TObject);    
begin    
WebBrowser1.OleObject.document.forms.item(1).elements.item('password').value:='meinPW';    
WebBrowser1.OleObject.document.forms.item(1).elements.item('name').value:='meinName';    
WebBrowser1.OleObject.document.forms.item(1).submit;    
timer2.enabled:=true;    
timer1.enabled:=false;    

end;    

procedure TForm1.Timer2Timer(Sender: TObject);    
begin    
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/start.php');    
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/do1.php');    
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/outlog');    
timer3.enabled:=true;    
timer2.enabled:=false;    
end;
Das Ganze funktioniert soweit einigermaßen. Allerdings machen mir 2 Stellen Probleme:
Code:
WebBrowser1.OleObject.document.forms.item(1).elements.item('password').value:='meinPW';    
WebBrowser1.OleObject.document.forms.item(1).elements.item('name').value:='meinName';
Das ist die erste. Egal welche Reiehenfolge, bei diesen Zeilen gibt es eine EAccessViolation beim Versuch aus der Adresse 000000... zu lesen.

Code:
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/do1.php');
Die beiden Links um diesen Teil werden ausgeführt, dieser jedoch nicht, obwohl er korrekt ist. Woran kann das liegen?

toms 15. Jan 2005 18:54

Re: Login mit TWebBrowser
 
Hi,

Probiere das ganze mal ohne Timer zu machen!
Ist sauberer Programmierstil und weniger fehleranfällig.

chkdsk 15. Jan 2005 18:59

Re: Login mit TWebBrowser
 
Wozu der ganze Mist?

Ich weiß nicht, ob der TWebBrowser das modifizieren des HTTP-Headers unterstützt (weil ich ihn nicht benutze), aber zum einloggen muss einfach nur "Benutzername:Passwort" (ohne Anführungszeichen) mit Base64 encodiert werden, und im entsprechenden Teil des Headers mitgeschickt werden. Einfach mal einen Sniffer benutzen, und anschauen, wie das genau funktioniert!

Dann kannst du dir den ganzen Scheiss sparen!

Smarty 15. Jan 2005 19:13

Re: Login mit TWebBrowser
 
Zitat:

Zitat von chkdsk
Wozu der ganze Mist?

Erläutere mir bitte genauer was störend ist.

Zitat:

Zitat von chkdsk
Ich weiß nicht, ob der TWebBrowser das modifizieren des HTTP-Headers unterstützt (weil ich ihn nicht benutze),

Geht mir genauso, bis vor 3 Tagen wusste ich nicht mal, dass es ihn gibt. Desweitern habe ich keine Ahnung was du mit
Zitat:

das modifizieren des HTTP-Headers
meinst. Ich habe nunmal nur das einigermaßen sicher drauf was ich in der Schule lernte, sprich kaum etwas das über den Schwierigkeitsgrad eines Taschenrechners geht.

Zitat:

Zitat von chkdsk
aber zum einloggen muss einfach nur "Benutzername:Passwort" (ohne Anführungszeichen) mit Base64 encodiert werden, und im entsprechenden Teil des Headers mitgeschickt werden. Einfach mal einen Sniffer benutzen, und anschauen, wie das genau funktioniert!
Dann kannst du dir den ganzen Scheiss sparen!

Und das ist wieder die Stelle an der ich keine Ahnung habe was du mir damit sagen willst. Sorry.

Zitat:

Zitat von toms
Probiere das ganze mal ohne Timer zu machen!

Wie kann ich das machen? Ich benutze die Timer, damit ich die genaue Uhrzeit für die einzelnen Aktionen einstellen kann. Womit geht das sonst noch?

toms 15. Jan 2005 19:19

Re: Login mit TWebBrowser
 
Noch eine Frage:

Warum führst du 3 Mal hintereinander Navigate aus?
Zitat:

WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/start.php');
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/do1.php');
WebBrowser1.Navigate('http://www.die_Seite.de/nochein_Eintrag/outlog');
Der Webbrowser wartet nicht, bis ein Navigate Vorgang beendet ist sondern geht
führt alle 3 Navigates direkt nacheinander aus, ohne dass alle Seiten
vollständig geladen werden.

Smarty 15. Jan 2005 19:21

Re: Login mit TWebBrowser
 
Hmm, wie kann ich das Ganze denn ansonsten im WebBrowser hintereinander laden? Ich kenne nur diese Möglichkeit zum anwählen von Links.

Meflin 15. Jan 2005 19:23

Re: Login mit TWebBrowser
 
Zitat:

Zitat von Smarty
Hmm, wie kann ich das Ganze denn ansonsten im WebBrowser hintereinander laden? Ich kenne nur diese Möglichkeit zum anwählen von Links.

am besten ohne twebbrowser ;)
am besten wäre es ein eigenes php interface für deine anwendung zu schreiben, dass die gewünschten operationen auf dem server ausführt... das kannst du dann mit der idHTTP Komponente von den Indys ansteuern!

toms 15. Jan 2005 19:24

Re: Login mit TWebBrowser
 
Zitat:

Zitat von chkdsk
Einfach mal einen Sniffer benutzen, und anschauen, wie das genau funktioniert!

Wo gibt's so ein Sniffer?

Smarty 15. Jan 2005 19:25

Re: Login mit TWebBrowser
 
Zitat:

Zitat von Meflin
am besten wäre es ein eigenes php interface für deine anwendung zu schreiben, dass die gewünschten operationen auf dem server ausführt...

Dafür müsste ich wohl PHP können, was leider nicht der Fall ist.

Zitat:

Zitat von Meflin
das kannst du dann mit der idHTTP Komponente von den Indys ansteuern!

Danke, aber was meinst du mit dem eben Gesagten? Ich habe absolut keine Ahnung was das bedeutet.

chkdsk 15. Jan 2005 23:15

Re: Login mit TWebBrowser
 
Pass auf:


Wenn dein TShitBrowser eine Anfrage erstellt, dann beinhaltet die entweder GET oder POST, den Pfad, die HTTP-Version, etc.
Da fügst du einfach folgendes als einzelne Zeile ein:

"Authorization: Basic MxIxOxkxOxMxbxJxbxBxZxIxMx=="

(Wobei "MxIxOxkxOxMxbxJxbxBxZxIxMx==" der Verschlüsselte String "Username:Passwort" ist.)


Bisschen Eigeninitiave, wie du z.B. mit Delphi einen String Base64-verschlüsselst herauszufinden, kann auch nicht schaden. ---> GOOGLE <---

Die oben genannte Möglichkeit funktioniert bei jedem HTTP-Clienten, also auch, falls du mal nen Download-Manager oder so schreiben willst!
Es ist die sauberste (und vor allem die wirklich einzig richtige) Methode.


Als Sniffer kann ich CommView von TamoSoft empfehlen.

Smarty 16. Jan 2005 11:30

Re: Login mit TWebBrowser
 
Danke, wenn ich morgen Zeit finden sollte werde ich das mal probieren.

chkdsk 17. Jan 2005 16:30

Re: Login mit TWebBrowser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab ein kleines Tool angehängt, dass aus Benutzername und Passwort den Authorization-String für HTTP-Header generiert.

Für die eigene Anwendung sicher leicht selbst zu implementieren (daher kein Source Code), aber für den, der einfach nur mal ein bisschen "forschen" will, oder das Ding bei der Entwicklung braucht, sicher ganz nützlich.

Stefan Hueg 17. Jan 2005 16:50

Re: Login mit TWebBrowser
 
Quark er braucht diese Base64 Scheisse doch gar nicht. Habe die letzten Tage selbst viel mit dem Steuerelement gearbeitet und es kan alles, was man braucht.

@Smarty: Wenn du uns sagen könntest, um welche Seite es sich handelt, dann kann ich dir evtl. weiterhelfen. Habe selbst mit Logins gearbeitet, und zwar sogar mit welchen, die SSL-verschlüsselt waren ;)

Stefan Hueg 17. Jan 2005 16:52

Re: Login mit TWebBrowser
 
Zitat:

Zitat von chkdsk
wAls Sniffer kann ich CommView von TamoSoft empfehlen.

Un was, wenn die Login-Seite SSL-verschlüsselt is, hm?

chkdsk 17. Jan 2005 19:49

Re: Login mit TWebBrowser
 
Zitat:

Zitat von Stefan Hueg
Zitat:

Zitat von chkdsk
wAls Sniffer kann ich CommView von TamoSoft empfehlen.

Un was, wenn die Login-Seite SSL-verschlüsselt is, hm?


Das ändert prinzipiell ja nichts daran, dass der gleiche Header verwendet wird. Wenn du das abhorchen willst, würde ich eine kleine Server-Anwendung schreiben, die alle Anfragen SSL-verschlüsselt an den echten Server weiterleitet.
Funktioniert eigentlich ganz gut, du musst halt nur die Serveradresse, die irgendwo im Programm steht ändern, und eventuelle Schutzmaßnahmen, die das verhindern sollen, aushebeln.


Zitat:

Quark er braucht diese Base64 Scheisse doch gar nicht. Habe die letzten Tage selbst viel mit dem Steuerelement gearbeitet und es kan alles, was man braucht.
Das ist die typische Hausfrauen-Lösung. Dass dein tolles Steuerelement Benutzername und Passwort auch mit Base64 verschlüsselt und überträgt, ist dir anscheinend egal. Du willst auch nie irgendwas selber schreiben, oder mal auf etwas anderes, als dieses Steuerelement setzen, auch wenn es möglicherweise eine deiner tollen Anforderungen erfüllt.

Für alle anderen, die verstehen wollen, WAS sie da gerade machen, un die selber die Header erzeugen oder SSL-Layer implementieren wollen ist das Tool. Wenn's dich stört, lad's halt nicht runter!

Stefan Hueg 17. Jan 2005 22:05

Re: Login mit TWebBrowser
 
Hier dieser Sample-Code tut genau das was du willst:

Delphi-Quellcode:
function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := False;
  //no form on document
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
  begin
    Exit;
  end;
  //count forms on document
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      try
        //when the fieldname is found, try to fill out
        if FormItem.Item(j).Name = FieldName then
        begin
          FormItem.Item(j).Value := Value;
          Result := True;
        end;
      except
        Exit;
      end;
    end;
  end;
end;

procedure TForm1.Navi2Page(URL : String);
  begin
    Webbi1.Navigate(URL);
    Wait;
  end;

procedure TForm1.Wait;
begin
  while Webbi1.ReadyState <> READYSTATE_COMPLETE do
  begin
    Application.ProcessMessages;
    Sleep(0);
  end;
  while Webbi1.Busy = True do
  begin
    Application.ProcessMessages;
    Sleep(0);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Geht auf die Website
  Navi2Page('http://deine_url.de');
  //Gibt die Benutzerinfos in die Felder ein
  FillForm(Webbi1, 'Name', Edit1.Text);
  FillForm(Webbi1, 'PW', Edit2.Text);
  //Schickt das ganze an den Server
  Webbi1.OleObject.Document.forms.item(0).submit;
end;
Wobei Webbi1 das Webbrowser-Steuerelement ist. Musst halt nur bei Navi2Page() die URL eintragen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz