[Delphi]Indy9 + Sessioncookie

01/31/2009 17:51 DesperadoStrike#1
Hallo zusammen,

Gleich mal vorweg meine Daten:

- Delphi 7
- Indy 9 ( aktuellste )
- idHTTP
- CookieManager

Nun zu meinem Problem:

Das ganze ist so geplant:

Mein Programm soll sich in eine Webseite die mit Session Cookies arbeitet einloggen. Die 3 dazu benötigten Eingaben ( User ; Passwort ; Captcha ) werden aus dem dafür vorgesehenen Editfenstern entnommen. Nach dem login wird der Quellcode geladen und auf ein Wort durchsucht.

Ist das besagte Wort vorhanden => Login erfolgreich
Ist das Wort nicht vorhanden => Login fehlgeschlagen.

Wenn Login erfolgreich war => Filtere den Quellcode und suche 2 relevante Werte heraus.

_______________________

Bis hierhin funktioniert alles bestens.
Allerdings soll das Programm nach erfolgreichen Login die Seite wechseln.
Ich habe testweise den Quellcode der aufzurufenden Seite auf einem sichtbaren RichEdit - Feld ausgegeben.

Leider gibt der Server trotz erfolgreichem Login immer wieder die Meldung "Sie sind nicht eingeloggt" zurück.

idHTTP und der CookieManager sind miteinander verknüpft.
allowcookies ist auf true.
handleredircts ist ebenfalls auf true.

Mein aktueller Code sieht so aus:


Code:
// Progressbar auf 0 setzen
Gauge1.Progress := 0;
// Loginseite mittels den Daten aus meinen editfenstern ansteuern
Login := IdHTTP1.Get('http://localhost/login.php?action=login&login2='+edit1.Text+'&passwort2='+edit2.text+'&grafikcode='+edit3.Text+'&Login=Login');
// Testweise eingebaut um zu schauen ob ein Cookie gesetzt wird
ShowMessage(IdCookieManager1.CookieCollection.Items[0].CookieText);
// Nach erfolgreichen Login auf die nächste Seite navigieren
Seite := IdHTTP1.Get('http://localhost/index.php');
Gauge1.Progress := Gauge1.Progress+1;
// Quellcode im Textfenster ausgeben
richedit1.Text := Seite;

Anschließend wird der im "Login" gespeicherte Datensatz ausgewertet

Kleiner ausschnitt:


Code:
// Login nach dem Wort "erfolgreich" durchsuchen
Buff:= PChar(Login);
    if SearchBuf(Buff, length(Buff), 0, 0, 'erfolgreich') <> nil then
      begin
          Label1.Font.Color := clgreen;
          Label1.Caption := 'Login erfolgreich!';
          Gauge1.Progress := Gauge1.Progress+1;
        // anschließend den Text zwischen den beiden HTML Tags auslesen
          filter1:='am  <b> ';
          filter2:='</b>.<br>';
          position1 := Length(filter1);
          position1 := Pos(filter1, login) +  Length(filter1);
            repeat
              position2 := Pos(filter2, login);
            until
              position2 >= position1;
    if position1 <> Length(filter1) then
      begin
        // Da ich 2 Werte auslese die hintereinander stehen wird 2x gefiltert.
        // Beim ersten mal Bsp: <br>21.01.09 <br><br> 12:00 Uhr</br>
        // Erst wird alles vor dem Datum und nach der Uhrzeit gefiltert
        login := copy(login,position1,position2-position1);
       // Dann wird der HTML code in der mitte zwischen den beiden Werten gefiltert
        login := StripHTML(login);
        label5.Caption := (' Dein letzter Login war am '+login);
      end;
    end
 // Taucht das gesuchte wort nicht auf =>
  else
    begin
      Label1.Font.Color := clred;
      Label1.Caption := 'Logindaten oder Captcha falsch!';
      webbrowser1.Navigate('http://localhost/code.php');
    end;
end;
die Meldung die beim Login anzeigen soll ob ein Cookie gesetzt wird gibt folgendes aus:

---------------------------
session_cookie=48675b1345871fc4aeed14776d68f6d6; domain=localhost
---------------------------

mit dem Webbrowser funktioniert es zwar, aber ich möchte es gern über die Indy Komponenten Regeln

( Ein Update auf Indy10 klappt bei mir leider nicht (wahrscheinlich bin ich einfach zu doof dafür))
02/03/2009 18:20 schlurmann#2
Ich habe keine Ahnung von Delphi und verabscheue Indy, allerdings wäre mein erster Ansatz:

Schaue einfach mal nach was gesendet und empfangen wird. Wenn dir Indy nicht die Möglichkeit gibt das gesamte Paket anzuschauen benutze einfach 'mal WPE oder einen Sniffer deiner Wahl.

Und gucke ob dein Cookie wirklich immer gesendet wird, also die Zeile

Code:
Cookie: session_....
immer im Paket enthalten ist. Und checke auch mal die Antwort.

Gibt es in Delphi nicht die Möglichkeit Winsock zu nutzen? Hinter den Kulissen ist Delphi ja auch auf die Winsock funktionen angewiesen. Vielleicht einfach mal die Funktions - Adressen besorgen und selber den POST/GET Request bauen. ;)
02/06/2009 21:30 DesperadoStrike#3
frage leider noch immer nicht gelöst