Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Login auf Homepage mit Indy (https://www.delphipraxis.net/173185-login-auf-homepage-mit-indy.html)

Metschu 11. Feb 2013 16:16

Login auf Homepage mit Indy
 
Hallo zusammen!

Ich möchte mich auf eine Homepage mit der Indy Komponente Einloggen.
Zuerst hatte ich immer die Fehlermeldungen, da dies eine "https" Seite ist. Nach einigen Stunden der Suche hier im Forum hab ich nun eine Anleitung für die SSL-Verschlüsselung gefunden. Das ganze läuft mit folgendem Code fehlerfrei durch:

Delphi-Quellcode:
procedure TMainForm.MainLogInClick(Sender: TObject);
var
  sList: TStrings;

begin
  sList:=TStringList.Create;

  try
    sList.Add('BenutzerName='+LogInName);
    sList.Add('Passwort='+Passwort);
    Memo1.Lines.Add(IDHTTP.Post(Startseite,slist,));
  finally
    sList.Free;
  end;
end;
Im Memo1 zeigt er mir dann den Quelltext der Login Seite an. Wenn ich das richtig verstanden habe, müßte dann doch der Quelltext der Folgeseite ("Herzlich Willkommen, sie sind eingeloggt als...") angezeigt werden.

Wenn kein oder ein Falscher Benutzername / Passwort eingegeben wurde, erscheint eine Fehlermeldung auf der Webseite und dann logischerweise auch im Quelltext (habs getestet und einen Quelltext mit Fehlermeldung)

Im Memo1 ist aber der Originale Quelltext, ohne Fehlermeldung.

Hat jemand ne Idee?

Danke schonmal.
Gruß

Torsten

sx2008 11. Feb 2013 17:19

AW: Login auf Homepage mit Indy
 
Du solltest prüfen, ob die Webseite JavaScript verwendet.
Falls ja, dann könnte es mit Indy etwas schwierig werden.
Ausserdem könnte es sein, dass die Webseite ein (oder mehrere) Cookie(s) setzt.
Sollte das Cookie beim POST nicht mitgesendet werden dann ist wahrscheinlich dass der Login fehlschlägt.

mjustin 11. Feb 2013 17:27

AW: Login auf Homepage mit Indy
 
Bei POST sendet der Server anschliessend nicht selten ein Redirect, also eine Weiterleitung auf eine andere URL.
Indy folgt diesem Redirect standardmässig nicht. Mit IdHttp1.Followredirect := True kann man das ändern.

Metschu 11. Feb 2013 18:35

AW: Login auf Homepage mit Indy
 
Vielen Dank Euch beiden schonmal für die Infos und Hilfe.
Zitat:

Zitat von sx2008 (Beitrag 1202932)
Du solltest prüfen, ob die Webseite JavaScript verwendet.

Die Seite verwendet JavaScript. Wenn ich das Deaktiviere, dann wird die Seite schon nicht mehr angezeigt.
Funktionierend hatte ich das schon mit dem TWebbrowser hinbekommen. Da das ganze im Hintergrund laufen soll, die "Optik" der Seite nicht nötig ist und Indy schneller sein sollte, wollte ich das über diese Möglichkeite ausprobieren.
Zitat:

Zitat von sx2008 (Beitrag 1202932)
Falls ja, dann könnte es mit Indy etwas schwierig werden.

Die Frage ist, wie schwierig ist schwierig. Lohnt sich der Aufwand, um von Webbrowser auf Indy umzusteigen?
Fertig ist das Prog noch nicht, da ich noch am Testen bin, welchen Weg ich gehen soll.

mjustin 12. Feb 2013 12:28

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von Metschu (Beitrag 1202949)
Die Frage ist, wie schwierig ist schwierig. Lohnt sich der Aufwand, um von Webbrowser auf Indy umzusteigen?

Bei SSL mit Indy entsteht leicht ein Sicherheitsproblem: wie muss Indy konfiguriert werden, damit es nicht beliebige Serverzertifikate akzeptiert? Da der Benutzer nicht sehen kann, was im Hintergrund geschieht, kann er auch keine Browserwarnungen über abgelaufende oder unbekannte Zertifikate sehen, oder sich selber über die Zertifikatseigenschaften informieren (die zum Beispiel über Klick auf das Schlossymbol erreichbar sind).

Das gilt eventuell auch für TWebbrowser, ich kenn diese Komponente aber nicht so gut. Warnt TWebbrowser bei Problemen mit Zertifikaten?

daywalker9 12. Feb 2013 15:14

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von mjustin (Beitrag 1203080)
Das gilt eventuell auch für TWebbrowser, ich kenn diese Komponente aber nicht so gut. Warnt TWebbrowser bei Problemen mit Zertifikaten?


Ja, das es auf dem IE basiert.

Metschu 12. Feb 2013 18:52

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von daywalker9 (Beitrag 1203119)
Zitat:

Zitat von mjustin (Beitrag 1203080)
Das gilt eventuell auch für TWebbrowser, ich kenn diese Komponente aber nicht so gut. Warnt TWebbrowser bei Problemen mit Zertifikaten?


Ja, das es auf dem IE basiert.

Also meine Erfahrung sieht so aus:

Wenn ich die HP mit dem IE aufrufe, dann bekomme ich die Meldung "Es ist ein Problem mit dem Sicherheitszertifikat aufgetreten". Wenn ich diese Seite über den TWebBrowser aufrufe, dann kommt die Meldung nicht.

geskill 14. Feb 2013 19:52

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von Metschu (Beitrag 1202949)
Die Frage ist, wie schwierig ist schwierig. Lohnt sich der Aufwand, um von Webbrowser auf Indy umzusteigen?

Also ich käme nie auf die Idee mit der TWebbrowser Komponente zu arbeiten ;)

Es kommt jetzt darauf an wie viel du an HTTP Internetkommunikation erledigen möchtest/musst. Wenn es nur der Login plus 2-3 Unterseiten sind, kannst du das ziemlich rasch in Indy umschreiben (ich bräuchte dafür vllt 2 Stunden, für jemanden der noch nie mit der Indy Komponente gearbeitet hat, kann das aber schnell ausarten +/- 1 Woche).

Wenn es deutlich mehr ist empfehle ich dir eine abstrakte Schnittstelle zu kreieren, die du dann wahlweise mit Indy, ICS etc. füttern kannst.

Metschu 14. Feb 2013 20:59

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von geskill (Beitrag 1203605)
Es kommt jetzt darauf an wie viel du an HTTP Internetkommunikation erledigen möchtest/musst. Wenn es nur der Login plus 2-3 Unterseiten sind, kannst du das ziemlich rasch in Indy umschreiben

Genau so sieht es eigentlich aus:
  • LogIn auf der Seite
  • Quelltext auf ein bestimmte Wortkette hin durchsuchen
  • Entsprechend der Uhrzeit und dem Ergebniss der Suche eine neue Seite aufrufen (Button drücken)
  • Abmelden

Mit dem tWebBrowser funktioniert das schon, allerdings soll das ganze im Hintergrund laufen (im TNA minimiert) und dann klappt das Quelltextauslesen wieder nicht :(
Außerdem, für was nen WebBrowser, den man nicht sieht und nur Speicher frist ;)

Hast Du nen Tip, wo man sich mal einlesen kann um die Indy-Komponente anzupassen bzw was man da anpassen muß?

geskill 14. Feb 2013 21:41

AW: Login auf Homepage mit Indy
 
Auch wenn es stark nach Eigenwerbung klingt; schau mal in mein Tutorial: http://www.delphipraxis.net/160152-i...protokoll.html

Damit bekommst du erstmal das grobe Handwerkszeug um mit der Komponente umzugehen, also aufmerksam lesen.

Metschu 16. Feb 2013 12:44

AW: Login auf Homepage mit Indy
 
Danke für den Link, den hatte ich auch schon gefunden und das war auch sehr nützlich.
Nur scheitere ich jetzt ja daran, das die Seite Javascript verwendet...

sx2008 16. Feb 2013 13:14

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von Metschu (Beitrag 1203825)
Nur scheitere ich jetzt ja daran, das die Seite Javascript verwendet...

Dann kommst du mit der Analyse des HTML-Datenverkehrs weiter.
Im Internet Explorer kann man z.B. mit F12 die Developer Tools öffnen und auf der Seite "Netzwerk" die Aufzeichnung starten.
Für die Browser Firefox, Chrome und Opera gibt es ähnliche Werkzeuge (Firebug).

Wenn du dann manuell einen Login durchführst siehst du alle Anfragen und Antworten des Browsers mit allen Headern, Cookies, usw. (Doppelklick auf die Zeile)
Achte gezielt auf einen POST; diesen müsstest du mit Indy nachprogrammieren.

Metschu 17. Feb 2013 13:09

AW: Login auf Homepage mit Indy
 
Das mir F12 hatte ich im IE schon vorher ausprobiert. , mit wenig Ergebnis.
Nachdem ich nun FireFox mit FireBug installiert habe, sieht das ganze mit ein paar mehr Informationen viel besser aus - Danke für den Tip :)

Nur leider klappts immernoch nicht :(

Geskill hatte dazu ja schon ein nützliches Tutorial geschrieben und auch einige Beiträge in anderen Themen geschrieben.
Hier mal mein Code-Ausschnitt mit den Ergebnissen:
Delphi-Quellcode:
 memo1.Lines.Add(idHTTP.Post(Startseite,sList)); {<-Ergebniss ist der Quelltext der Loginseite - Ohne Fehlermeldung von wegen Passwort oder user falsch}
 memo1.Lines.Add('Location: '+idhttp.Response.Location);{<- Leer}
 memo1.Lines.Add('Text: '+idhttp.ResponseText);{<- HTTP/1.1 200 OK}
 memo1.Lines.Add('Code: '+IntToStr(idhttp.ResponseCode));{<-200}
Der ResonseCode 200 sagt ja "Die Anfrage wurde erfolgreich bearbeitet und das Ergebnis der Anfrage wird in der Antwort übertragen."
Nur mal zum verständniss, der Rückgabewert von "Post" sollte der Quelltext der neuen Seite sein, oder irre ich mich da?

geskill 17. Feb 2013 15:05

AW: Login auf Homepage mit Indy
 
Ist in dem empfangenen Quellcode vielleicht folgendes:
Code:
<meta http-equiv="refresh" content="5; URL=http://de.selfhtml.org/">
http://de.selfhtml.org/html/kopfdaten/meta.htm

Dies ist eine veraltete Möglichkeit den Benutzer umzuleiten. Es gibt aber auch noch andere Möglichkeiten.

Ich glaube, nachdem der Login erfolgreich war, bekommst du einen Cookie gesetzt und musst nur noch die gewünschte Webseite aufrufen die du brauchst. Also nach dem jetzigen POST/Request bist du eingeloggt und kannst mit der HTTP Instanz weiterarbeiten.

Zitat:

Zitat von Metschu (Beitrag 1203959)
Nur mal zum verständniss, der Rückgabewert von "Post" sollte der Quelltext der neuen Seite sein, oder irre ich mich da?

Es gibt dutzende Möglichkeiten wie man das macht - dem Webentwickler stehen da in der Vielfalt der Methoden keine Grenzen ;) Es ist vielleicht etwas schade, dass es da keinen Standard für ein Login gibt, aber so wird es nie langweilig :D


PS: Also solltest du wirklich noch nicht eingeloggt sein, dann wäre es am einfachsten, du postest hier mal das Protokoll von einem komplettem Login mit einem Browser. Sonst raten wir hier nur herum XD

Metschu 18. Feb 2013 21:19

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von geskill (Beitrag 1203983)
Ist in dem empfangenen Quellcode vielleicht folgendes:
Code:
<meta http-equiv="refresh" content="5; URL=http://de.selfhtml.org/">
http://de.selfhtml.org/html/kopfdaten/meta.htm

Der Quelltext, den mit Post empfange entspricht 1:1 dem von der Login Seite, also wo ich Username und Passwort eingeben muß, von daher gehe ich aus, das der Login nicht geklappt hat.

Wenn ich mit FireBug das ganze aufzeichne, bekomme ich den o.g. Quelltext als Antwort auf Post.
Arbeite ich dann mit der URL weiter, die die nach Refresh steht, bekomme ich wieder den Quelltext der Startseite :(

Den Quelltext von der HP, sowie die Post und Antwort von FireBug stell ich morgen mal ein.

Metschu 19. Feb 2013 20:29

AW: Login auf Homepage mit Indy
 
So, hier jetzt der Quelltext (Auszug):
Code:
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=yes,initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">
<meta http-equiv="cache-control" content="no-cache">
<meta name="description" content="">
<title>Main LogIn</title>
<link rel="stylesheet" href="files/Dyn.css">
</head>
<body class="fitMldoc">
<div class="fitMlbody">
<div class="content">
<div class="c_box_mb">
<table class="b_top" cellpadding="0" cellspacing="0">
<tr>
<td class="tab_a_3">Main Login</td><td class="tab_ia_3"><a class="link02" href="start.swe?SWECmd=Logoff">Logoff</a></td>
</tr>
</table>
<Form method="POST" action="/start.swe?" name="Form1">
<table>
<tr>
<td class="pad_t w150X">Benutzername</td><td><input type="text" Name="SWEUserName" class="w130X"></td>
</tr>
<tr>
<td class="pad_t max200X">Passwort:</td><td><input type="Password" Name="SWEPassword" class="w130X"></td>
</tr>
<tr>
<td colspan="2">
<br>
<input Type="hidden" Name="SWECmd" Value="ExecuteLogin"><input Type="hidden" Name="SWENeedContext" Value="false">
<div class="bg_teaser_first" onclick="document.Form1.submit();" onmousedown="this.className='bg_teaser_first_md';" onmouseup="this.className='bg_teaser_first';" onmouseover="this.className='bg_teaser_first_md';" onmouseout="this.className='bg_teaser_first';">
<table class="c_in" cellpadding="0" cellspacing="0">
<tr>
<td class="w100XC"><img src="files/password2.gif" alt="" class="s_img40"></td><td>Anmelden</td><td class="c_rightcell_4"><img src="files/pfeil-vor.gif" alt="" width="4px" height="8px"></td>
... {ab hier nur noch Tabelle}

Hier die Post-Daten von FireBug:
Code:

SWECmd   ExecuteLogin
SWENeedContext   false
SWEPassword   Passwort {hier natürlich die richtigen Daten}
SWEUserName   Name1 Name2 {Namen mit Leerzeichen}

SWEUserName=Name1+Name2&SWEPassword=Passwort&SWECmd=ExecuteLogin&SWENeedContext=false
Die Antwort vom Server:
Code:
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META http-equiv="cache-control" content="no-cache">
<META http-equiv="REFRESH" content="0;URL=start.swe?SWECmd=GotoView&amp;SWEView=Show+Login+Status">
</HEAD>
</HTML>
Nach dem Erfolgten LogIn mittels Browser wird diese URL angezeigt:
Code:
 https://intra.net/start.swe?SWECmd=GotoView&SWEView=Show+Login+Status
Und mein Code:

Delphi-Quellcode:
procedure TMainForm.Button2Click(Sender: TObject);
VAR IdHTTP:TIdHTTP; Params:TIdMultiPartFormDataStream;
    IdSSLIOHandlerSocketOpenSSL:TIdSSLIOHandlerSocketOpenSSL;
    IdCookieManager:TIdCookieManager; GetList:TStringList;

BEGIN
  IdHTTP := TIdHTTP.Create(NIL);
  GetList := TStringList.Create;
  IdCookieManager := TIdCookieManager.Create(NIL);
  IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(NIL);
  Params := TIdMultiPartFormDataStream.Create;
  TRY
    IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv3;
    IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
    IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
    IdHTTP.CookieManager := IdCookieManager;
    IdHTTP.AllowCookies := TRUE;

    Params.AddFormField('SWEUserName', String(UTF8Encode(LoginName)));
    Params.AddFormField('SWEpassword', String(UTF8Encode(Passwort)));
    Params.AddFormField('SWECmd', String(UTF8Encode('ExecuteLogin')));
    Params.AddFormField('SWEpassword', String(UTF8Encode('false')));

    GetList.Text := IdHTTP.Post(Startseite,params); {-> Startseite = https://intra.net/start.swe?}

    memo1.Lines.AddStrings(getlist); {-> Gleicher Quelltext wie Startseite vor einloggen}

  FINALLY
    FreeAndNil(Params);
    IdSSLIOHandlerSocketOpenSSL.Free;
    IdCookieManager.Free;
    GetList.Free;
    IdHTTP.Free;
  END;
END

geskill 19. Feb 2013 22:01

AW: Login auf Homepage mit Indy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,
also die Webseite ist ja auch mehr so zusammengefummelt :D
Zitat:

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=yes,initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">

In deinem Code sind erstmal folgende Fehler:
Delphi-Quellcode:
// Es heißt "SWEPassword"
     Params.AddFormField('SWEpassword', String(UTF8Encode(Passwort)));

// UTF8Encode übernimmt Indy für dich! siehe mein Code (durch Angabe des Charsets)
     Params.AddFormField('SWECmd', String(UTF8Encode('ExecuteLogin')));

// Du meinst hier wohl "SWENeedContext"
     Params.AddFormField('SWEpassword', String(UTF8Encode('false')));
Okay, was du nicht wissen kannst es gibt mehrere Möglichkeiten Parameter zu übermitteln. Eine ist mit dem multipart, eine andere ist über ein TStringList (application/x-www-form-urlencoded).
Wann immer du Parameter in diesem Format siehst:
Code:
SWEUserName=Name1+Name2&SWEPassword=Passwort&SWECmd=ExecuteLogin&SWENeedContext=false
Kannst du vom application/x-www-form-urlencoded ausgehen, also einfach wie GET Parameter. Multipart sieht anders aus.

Ich habe beide Parametermöglichkeiten mit LoginA und LoginB im Code als Beispiel.

Ich habe etwas Struktur in den Code gebracht, das ist sicherlich noch weiter verbesserungswürdig, aber will dir ja nicht zuviel Arbeit wegnehmen.

Metschu 20. Feb 2013 17:09

AW: Login auf Homepage mit Indy
 
Nabends!

Danke schonmal für die Hilfe. Nur leider klappt das auch nicht.
Weder LoginA, noch LoginB führen zum Erfolg, immer das gleiche Ergebniss beim Quelltext.

Auch wenn man die Anmeldedaten absichtlich Falsch eingibt, ändert sich am Quelltext nichts.
Wenn ich das über den IE versuche, wird dann auf der Homepage angezeigt, das der Login Fehlerhaft war.

Die auszuführende Procedure als Result von der Funktion hab ich auch mal angepasst ;)

Zitat:

Zitat von geskill (Beitrag 1204395)
In deinem Code sind erstmal folgende Fehler:
Delphi-Quellcode:
// Es heißt "SWEPassword"
     Params.AddFormField('SWEpassword', String(UTF8Encode(Passwort)));

Ich dachte Groß-/Kleinschreibung wäre da egal...


Zitat:

Zitat von geskill (Beitrag 1204395)
In deinem Code sind erstmal folgende Fehler:
Delphi-Quellcode:
//  Du meinst hier wohl "SWENeedContext"
     Params.AddFormField('SWEpassword', String(UTF8Encode('false')));

Ups, Fehler beim Copy...
allerdings hatte ich auch andere Proceduren getestet, wo es richtig war (bis auf die Groß/Kleinschreibung...)

geskill 20. Feb 2013 23:12

AW: Login auf Homepage mit Indy
 
Zitat:

Zitat von Metschu (Beitrag 1204502)
Danke schonmal für die Hilfe. Nur leider klappt das auch nicht.
Weder LoginA, noch LoginB führen zum Erfolg, immer das gleiche Ergebniss beim Quelltext.

Dann kommt der POST-Request nicht richtig an. Tippe mal das es mit dem SSL Probleme gibt.

Gibt folgende Möglichkeiten (bei beiden kann ich dir leider nicht weiterhelfen):

a. Du probierst mir der Indy SSL Komponente bisschen rumzuspielen ggf. spezielles Zertifikat einjagen damit das klappt.

b. Ihr behebt das SSL Problem serverseitig. Wenn schon jeder normale Webbrowser dort versagt.

Das die TWebbrowser Komponente in Zukunft funktioniert ist ja keineswegs garantiert. Es hängt ja alles davon ab, auf welchem Klienten das Programm ausgeführt wird. Ich kann mir vorstellen, dass der IE / das OS nicht das Neuste ist.

Metschu 21. Feb 2013 21:07

AW: Login auf Homepage mit Indy
 
Ein seltenes Ereigniss ist aufgetreten:

Es klappt und ich weiß nicht warum... :gruebel:

Vielleicht kann mir einer mal aufklären:

Webseitenquelltext:
Code:
<Form method="POST" action="/start.swe?" name="Form1">
Die Website verlangt "Post" und laut allen Anleitungen bzw Ergebnissen der Suche müßte ich es so machen:
Delphi-Quellcode:
with LParamsList do
 begin
  Add('SWEUserName=' + ALoginName);
  Add('SWEPassword=' + ALoginPassword);
  Add('SWECmd=ExecuteLogin');
  Add('SWENeedContext=false');
 end;

 LResponse := AIdHTTP.post('https://intra.net/start.swe?', LParamsList, LEnc);
Hier bekomme ich immer den Quelltext der Startseite, komme aber nicht weiter

Mit Get allerdings klappt das Einloggen und ich bekomme den Quelltext der nachfolgenden Seiten:
Delphi-Quellcode:
LResponse := AIdHTTP.get('https://intra.net/start.swe?SWEUserName=Name1+name2&SWEPassword=DasPasswort&SWECmd=ExecuteLogin&SWENeedContext=false');
:wiejetzt:

(Eigentlich sollten die "Get" und "Post" in den Quelltexten auch rot markiert werden, aber anscheinend kann man im Code keine Farben einstellen)


Auf jeden fall schonmal danke an alle für die bisherigen Unterstützung! :dp:

Gruß

Torsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.

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