Autor Beitrag
davide
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 09.07.09 16:17 
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:
ausblenden 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):
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.07.09 16:31 
Hallo und :welcome: !

Deine Adressen sind falsch, es wird
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 09.07.09 16:37 
Danke für die schnelle Antwort und das Willkommen :)

Ich habe es nun mit 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 (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):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := IdHTTP1.Get('http://schueler.cc');
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.07.09 17:11 
Am besten fordere explizit komprimiert als gzip an:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 09.07.09 17:18 
Hab nun folgendes alles ausprobier:
Versuch 1:
ausblenden Delphi-Quelltext
1:
IndyHttp.Request.AcceptEncoding := 'gzip, deflate';					


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


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


leider alles ohne erfolg :( Immer nur ein teil des Quelltextes wird zurückgeliefert...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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). ;-)
ausblenden Delphi-Quelltext
1:
Memo1.Text := Utf8ToAnsi(IdHTTP1.Post('http://www.schueler.cc/s,login,login.php', Params));					
davide Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)
ausblenden 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;
Einloggen, um Attachments anzusehen!
davide Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)
ausblenden 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. ;-)