Entwickler-Ecke

Internet / Netzwerk - TidHttp kein vollständiger GET & Fehler beim Login


davide - Do 09.07.09 16:17
Titel: TidHttp kein vollständiger GET & Fehler beim Login
Guten Tag Delphi-Forum User,

ich möchte mich in nächster Zeit ein bisschen mehr mit der TidHttp Komponente auseinandersetzen, da der TWebBrowser sehr langsam und sehr resourcen lastig arbeitet.
Ich hatte mit mit Hilfe des TWebBrowser ein Programm geschrieben, welches mir Neue Nachrichten, Gästebuch Einträge und Einladungen bei Schüler.cc anzeigt und ausgibt.
Dieses kalppt auch soweit, doch nun möchte ich dieses via TidHttp lösen, in der Hoffnung das dieses schneller läuft und nicht so Resourcen lastig ist.

Nun komme ich aber schon nicht beim Login weiter.
Post Daten sollten soweit vollständig sein.
Jedoch wenn ich den Post ausführe kommt nur ein teil des quellcodes wieder:
Zitat:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>
Schueler.CC | Home</title>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<META content="MSHTML 6.00.2600.0" name=GENERATOR>
<META NAME="description" CONTENT="">
<META NAME="keywords" CONTENT="">
<META NAME="page-type" CONTENT="Homepage">
<META NAME="robots" CONTENT="index,follow">

mehr gibt der einfach nicht zurück. Das selbe kommt auch wenn man einfach nur ein GET ausführt. Leider habe ich keine Ahnung, wieso dieses so ist... :(

CookieManager habe ich eingefügt. Die idHttp Komponente habe ich wie folgt angepasst:

Delphi-Quelltext
1:
2:
3:
IdHTTP1.CookieManager := IdCookieManager1;
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';


Wenn ein neues Cookie gesetzt wird, wird folgendes gemacht (ist auch nen kleiner "log" bei):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.IdCookieManager1NewCookie(ASender: TObject;
  ACookie: TIdCookieRFC2109; var VAccept: Boolean);
begin
  ACookie.Path := '/';

    Memo1.Lines.Add('New Cookie:');
  Memo1.Lines.Add('  Comment: '+ACookie.Comment);
  Memo1.Lines.Add('  Version: '+ACookie.Version);
  Memo1.Lines.Add('  CookieText: '+ACookie.CookieText);
  Memo1.Lines.Add('  ServerCookie: '+ACookie.ServerCookie);
  Memo1.Lines.Add('  ClientCookie: '+ACookie.ClientCookie);
  Memo1.Lines.Add('  Domain: '+ACookie.Domain);
  Memo1.Lines.Add('  Expires: '+ACookie.Expires);
  Memo1.Lines.Add('  CookieName: '+ACookie.CookieName);
  Memo1.Lines.Add('  Path: '+ACookie.Path);
  Memo1.Lines.Add('  Value: '+ACookie.Value);
  Memo1.Lines.Add('  DisplayName: '+ACookie.DisplayName);
  Memo1.Lines.Add('');
end;


Die Procedure fürs Login sieht nun wie folgt aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.BtLoginClick(Sender: TObject);
var
  Params: TStringList;
begin


  Params := TStringList.Create;
  try
    IdHTTP1.Get('http://www.schueler.cc/s,login,login.php');

    Params.Add('email='+EdtMail.Text);
    Params.Add('passwort='+EdtPw.Text);
    Params.Add('button_login_login=Login');

    Memo1.Lines.Add(IdHTTP1.Post('http://www.schueler.cc/s,login,login.php', Params));

  finally
    Params.Free;
  end;


end;


Würde mich sehr über ein bisschen Hilfe freuen.

Vielen Dank im voraus!

Mit freundlichen Grüßen
Davide


jaenicke - Do 09.07.09 16:31

Hallo und :welcome: !

Deine Adressen sind falsch, es wird

Quelltext
1:
http://www.schueler.cc                    
aufgerufen, woher hast du die Adressen, die du da benutzt? Die stehen weder im Quelltext der Seite noch sonst irgendwo...

// EDIT:
Um das schnell zu sehen empfehle ich HttpFox für den FF bzw. Fiddler2 für den IE.


davide - Do 09.07.09 16:37

Danke für die schnelle Antwort und das Willkommen :)

Ich habe es nun mit http://www.schueler.cc versucht, jedoch bleibt die Rückgabe von POST gleich... :(
Die Adressen habe ich so raus gefunden: Habe einfach mein PW falsch eingegeben und dann kam ich zu dieser Seite. In meinem Programm, wo ich es mit dem TWebBrowser gelöst habe, rufe ich auch die URL (http://www.schueler.cc/s,login,login.php) auf um mich einzuloggen.

Liebe Grüße

//EDIT: Ich habe nun mal nur ein GET ausgeführt um zu sehen, ob er denn dort die ganze Seite läd bzw. den Quelltext. Aber schon da scheint ein Fehler zu sein. Denn er gibt nur folgendes aus:
Zitat:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>
Schueler.CC | Dein Schüler Community-Center</title>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<META content="MSHTML 6.00.2600.0" name=GENERATOR>
<META NAME="description" CONTENT="">
<META NAME="keywords" CONTENT="">
<META NAME="page-type" CONTENT="Homepage">
<META NAME="robots" CONTENT="index,follow">


Versucht habe ich es mit folgendem Code (ganz simple halt):

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := IdHTTP1.Get('http://schueler.cc');
end;


jaenicke - Do 09.07.09 16:53

Wenn du HttpFox einfach einmal benutzt hättest, dann hättest du dort gesehen, dass der Inhalt schlicht komprimiert zurückgeliefert wird. Dementsprechend musst du einen entsprechenden Compressor benutzen, hier TIdCompressorZLib(Ex)... ;-)


davide - Do 09.07.09 16:58

Vielen Dank für deine Hilfe :)
Hatte mir das Add-On für FF runtergeladen und auch kurz reingeschaut, aber hatte nicht drauf geachtet das es komprimiert zurück geschickt wird. :-[
Ich habe den IdCompressorZLib eingefügt und mit der IdHttp Komponente verbunden, jedoch kommt nicht wirklich mehr Quelltext zurück :-[ :(


jaenicke - Do 09.07.09 17:11

Am besten fordere explizit komprimiert als gzip an:

Delphi-Quelltext
1:
IndyHttp.Request.AcceptEncoding := 'gzip, deflate';                    


Versuche einmal noch Utf8ToAnsi / Utf8Decode, vielleicht wird ja UTF-8 zurückgegeben, darauf habe ich gar nicht geachtet eben.


davide - Do 09.07.09 17:18

Hab nun folgendes alles ausprobier:
Versuch 1:

Delphi-Quelltext
1:
IndyHttp.Request.AcceptEncoding := 'gzip, deflate';                    


Versuch 2:

Delphi-Quelltext
1:
IndyHttp.Request.AcceptEncoding := 'Utf8ToAnsi';                    


Versuch 3:

Delphi-Quelltext
1:
IndyHttp.Request.AcceptEncoding := 'Utf8Decode';                    


leider alles ohne erfolg :( Immer nur ein teil des Quelltextes wird zurückgeliefert...


jaenicke - Do 09.07.09 17:20

Nein, die erste Zeile war schon richtig, aber Utf8ToAnsi und Utf8Decode sind Delphifunktionen (wobei erstere wohl nur letztere aufruft glaube ich). ;-)

Delphi-Quelltext
1:
Memo1.Text := Utf8ToAnsi(IdHTTP1.Post('http://www.schueler.cc/s,login,login.php', Params));                    


davide - Do 09.07.09 17:25

ups :-[

ok habe es nun so ausprobiert auch mal mit den unterschiedlichen Funktionen, aber leider bekomme ich immer noch nicht mehr zurück... :(

Bin dir echt dankbar für die super Hilfe :)


jaenicke - Do 09.07.09 17:46

So, ich habe es gerade einmal kurz ausprobiert...
Wenn du in Delphi einmal schaust, dann siehst du sofort im Debugger, dass da nur ein Nullzeichen im Ergebnis zurückgegeben wird an der Stelle wo nichts weiter angezeigt wird, siehe Anhang...

Das musst du nur ersetzen, dann klappt auch die Anzeige. ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  i: Integer;
  IndyResult: string;

[...]

    IndyResult := IdHTTP1.Post('http://www.schueler.cc/s,login,login.php', Params);
    for i := 1 to Length(IndyResult) do
      if IndyResult[i] = #0 then
        IndyResult[i] := ' ';
    Memo1.Text := IndyResult;


davide - Do 09.07.09 17:59

wow =) Es klappt =) Und ich werde auch eingeloggt =)
Muss ich das nun bei jeder abfrage machen? Dieses #0 ersetzen?
Aber vielen vielen Dank für die super Hilfe!
Nun kann ich endlich weitermachen.

Wie kann ich mich revanchieren ?


jaenicke - Do 09.07.09 18:28

user profile icondavide hat folgendes geschrieben Zum zitierten Posting springen:
Muss ich das nun bei jeder abfrage machen? Dieses #0 ersetzen?
Ich würde das einfach in eine Funktion auslagern und die dann aufrufen. Dann kannst du ggf. auch weitere Korrekturen vornehmen, falls das nötig werden sollte, ohne alles zu ändern. Denn dann reicht es das zentral in der überall benutzten Funktion zu ändern. ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function CleanPageSource(const AText: String): String;
begin
  Result := AText;
  for i := 1 to Length(Result) do
    if Result[i] = #0 then
      Result[i] := ' ';
end;

...

    Memo1.Text := CleanPageSource(IdHTTP1.Post('http://www.schueler.cc/s,login,login.php', Params));
Und vielleicht kannst du dir das Get vorher auch sparen, du kannst es ja einmal testweise herausnehmen. Und als Adresse sollte auch die Startseite direkt gehen statt der Loginseite (deren Adresse sich ja auch mal ändern kann ;-)).

user profile icondavide hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich mich revanchieren ?
Dafür ist das Forum ja da. ;-)