![]() |
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:
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.
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; 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 |
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. |
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. |
AW: Login auf Homepage mit Indy
Vielen Dank Euch beiden schonmal für die Infos und Hilfe.
Zitat:
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:
Fertig ist das Prog noch nicht, da ich noch am Testen bin, welchen Weg ich gehen soll. |
AW: Login auf Homepage mit Indy
Zitat:
Das gilt eventuell auch für TWebbrowser, ich kenn diese Komponente aber nicht so gut. Warnt TWebbrowser bei Problemen mit Zertifikaten? |
AW: Login auf Homepage mit Indy
Zitat:
Ja, das es auf dem IE basiert. |
AW: Login auf Homepage mit Indy
Zitat:
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. |
AW: Login auf Homepage mit Indy
Zitat:
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. |
AW: Login auf Homepage mit Indy
Zitat:
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ß? |
AW: Login auf Homepage mit Indy
Auch wenn es stark nach Eigenwerbung klingt; schau mal in mein Tutorial:
![]() Damit bekommst du erstmal das grobe Handwerkszeug um mit der Komponente umzugehen, also aufmerksam lesen. |
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... |
AW: Login auf Homepage mit Indy
Zitat:
Im Internet Explorer kann man z.B. mit F12 die ![]() Für die Browser Firefox, Chrome und Opera gibt es ähnliche Werkzeuge ( ![]() 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. |
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:
Der ResonseCode 200 sagt ja "Die Anfrage wurde erfolgreich bearbeitet und das Ergebnis der Anfrage wird in der Antwort übertragen."
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} Nur mal zum verständniss, der Rückgabewert von "Post" sollte der Quelltext der neuen Seite sein, oder irre ich mich da? |
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/">
![]() 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:
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 |
AW: Login auf Homepage mit Indy
Zitat:
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. |
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:
Die Antwort vom Server: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
Code:
Nach dem Erfolgten LogIn mittels Browser wird diese URL angezeigt:
<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&SWEView=Show+Login+Status"> </HEAD> </HTML>
Code:
Und mein Code:
https://intra.net/start.swe?SWECmd=GotoView&SWEView=Show+Login+Status
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 |
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:
In deinem Code sind erstmal folgende Fehler:
Delphi-Quellcode:
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).
// 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'))); Wann immer du Parameter in diesem Format siehst:
Code:
Kannst du vom application/x-www-form-urlencoded ausgehen, also einfach wie GET Parameter. Multipart sieht anders aus.
SWEUserName=Name1+Name2&SWEPassword=Passwort&SWECmd=ExecuteLogin&SWENeedContext=false
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. |
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:
allerdings hatte ich auch andere Proceduren getestet, wo es richtig war (bis auf die Groß/Kleinschreibung...) |
AW: Login auf Homepage mit Indy
Zitat:
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. |
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:
Die Website verlangt "Post" und laut allen Anleitungen bzw Ergebnissen der Suche müßte ich es so machen:
<Form method="POST" action="/start.swe?" name="Form1">
Delphi-Quellcode:
Hier bekomme ich immer den Quelltext der Startseite, komme aber nicht weiter
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); Mit Get allerdings klappt das Einloggen und ich bekomme den Quelltext der nachfolgenden Seiten:
Delphi-Quellcode:
:wiejetzt:
LResponse := AIdHTTP.get('https://intra.net/start.swe?SWEUserName=Name1+name2&SWEPassword=DasPasswort&SWECmd=ExecuteLogin&SWENeedContext=false');
(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