Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   HTML einer URL ohne TWebBrowser und Indys (https://www.delphipraxis.net/155973-html-einer-url-ohne-twebbrowser-und-indys.html)

Schwedenbitter 15. Nov 2010 15:34

HTML einer URL ohne TWebBrowser und Indys
 
Hallo,

ich möchte mich zunächst erklären, weil häufig der Vorwurf kommt, man würde Spam-Bots oder ähnliches programmieren, wenn man eine Frage wie ich stellt. Ich habe hier eine TK-Anlage, die im Netz erreichbar ist und eine html-Oberfläche zur Verfügung stellt. In/mit dieser werden unter anderem auch Faxe als tif-Dateien abgerufen. Für letzteres eignet sich hervorragend die Funktion TDownLoadURL().

Um aber herauszufinden, ob und wo (URL) neue Faxe da sind, muss ich den html-Code der Seite auswerten und zuvor natürlich auslesen. Im Moment mache ich das so:
Delphi-Quellcode:
Uses
  Classes, // für TStringStream
  Forms,  // für TApplication
  SHDocVw, // für TWebBrowser
  ActiveX; // für IStream und IPersistStreamInit

Function GetHTMLCode(Const URL: WideString): String;
Var
  WB   : TWebBrowser;
  sa   : IStream;
  ss   : TStringStream;
  ps   : IPersistStreamInit;
Begin
  Result:='';
  WB:=TWebBrowser.Create(nil);
  Try
    WB.Navigate(URL);
    While (WB.ReadyState < 3) Do
      Application.ProcessMessages;
    If Assigned(WB.Document) Then
    Begin
      ss:=TStringStream.Create('');
      Try
        ps:=(WB.Document As IPersistStreamInit);
        sa:=TStreamAdapter.Create(ss, soReference) As IStream;
        If Succeeded(ps.Save(sa, True)) Then
          Result:=ss.DataString;
      Finally
        ss.Free;
      End;
    End;
  Finally
    WB.Free;
  End;
End;
Mich stört aber, dass dieser Code das Gegenteil von resourceschonend ist und neben CPU-Last auch unheimlich RAM verbraucht. Ich habe bei meinen Recherchen schon die Indys als mögliche Alternative ausgemacht. Allerdings kann ich die unter TurboDelphi nicht installieren. Ich könnte Komponenten ggf. zwar zur Laufzeit erzeugen. Allerdings wüsste ich zunächst nicht, in welcher Unit ich suchen muss und vielleicht ist das auch mit Kanonen auf Spatzen schießen.

Gibt es eine Möglichkeit, den html-Code einer Webseite auch ohne TWebBrowser und ohne Indys abzufragen?

Ich vermute dies, weil TDownLoadURL() vergleichsweise schlank daherkommt. Ich bin aber daran gescheitert, den entsprechenden Code für mein Problem nutzbar zu machen. Ich finde es auch wenig elegant, den html-Code zunächst als Datei zu speichern und dann wieder zu laden etc. pp.

Gruß, Alex

Klaus01 15. Nov 2010 15:45

AW: HTML einer URL ohne TWebBrowser und Indys
 
Hallo,

vielleicht hilft Dir dieser Eintrag getHTML aus der CodeLib weiter?

Grüße
Klaus

Luckie 15. Nov 2010 18:37

AW: HTML einer URL ohne TWebBrowser und Indys
 
Mach ein Sleep(0) in die Schleife. Und was ist ReadyState 3?

toms 15. Nov 2010 19:35

AW: HTML einer URL ohne TWebBrowser und Indys
 
Zitat:

Zitat von Luckie (Beitrag 1061677)
Und was ist ReadyState 3?

READYSTATE_INTERACTIVE

http://msdn.microsoft.com/en-us/libr...29(VS.85).aspx

Luckie 15. Nov 2010 19:37

AW: HTML einer URL ohne TWebBrowser und Indys
 
Eigentlich wollte ich darauf hinweisen, dass man bessr sprechende Konstanten verwenden sollte.

Bummi 15. Nov 2010 19:58

AW: HTML einer URL ohne TWebBrowser und Indys
 
ich hätte hier noch eine Version die kein Problem mit Unicode hat.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
uses ExtActns;
{$R *.dfm}
Function GetTempDir:String;
var
p:Pchar;
begin
  p:=stralloc(255);
  GetTempPath(255,p);
  Result:=p;
  strdispose(p);
end;

Function MakeSaveURL(const AURL:String):String;
begin
  if Pos('http',LowerCase(AURL))=0 then Result := 'http://' +AURL else Result := AURL;
end;


function DownloadURLToFile(const AURL, AFileName : TFileName) : boolean;
begin
  Result:=True;

  with TDownLoadURL.Create(nil) do
  try
    URL := MakeSaveURL(AURL);
    Filename := AFileName;
    try
      ExecuteTarget(nil);
    except
      Result:=False;
    end;
  finally
    Free;
  end;
end;


Function GetURLContentAsString(const AURL:String;Var OK:Boolean):String;
var
  sl:TStringList;
  tmpf:String;
begin
  sl:=TStringList.Create;
  OK := false;
  try
  tmpf := IncludeTrailingBackSlash(gettempdir) + FormatDateTime('~hh_zzz',now) + '.tmp';
  if DownloadURLToFile(AURL,tmpf) then
    begin
       sl.LoadFromFile(tmpf);
       deletefile(PChar(tmpf));
       Result := sl.Text;
       ok := true;
    end;
  finally
   sl.Free;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  b:Boolean;
begin
    Memo1.Text := GetURLContentAsString('http://twitter.com/#!/bummi_w',b);
end;

end.

Schwedenbitter 16. Nov 2010 08:50

AW: HTML einer URL ohne TWebBrowser und Indys
 
Zunächst einmal Danke für Eure zahlreichen Hinweise/Vorschläge!

Ich hatte vergessen zu erwähnen, dass ich natürlich ein Polling machen muss/will. Die TK-Anlage meldet sich leider nicht, wenn ein neues Fax eingegangen ist. Aus diesem Grunde muss ich immer wieder nachsehen.
Die Standard-Software, zur der ich nicht wirklich positives berichten kann, macht ein Polling aller 3 Sekunden. Das hatte ich übernommen und festgestellt, dass es über TWebBrowser eben wegen der Resourcen nicht machbar ist.

@Klaus01
Der Code sieht schon einmal gut aus. Er tut was er soll, auch wenn z.B. 2 Variablen nicht benutzt werden (hRequest : hInternet und datalen : Cardinal). Danke dafür. Ich hatte auch schon gesucht, war aber darauf nicht gestoßen.
Ich werde mal ausgiebig testen, ob sich das zum Pollen eignet.

@Luckie
Du hast Recht in Bezug auf die Konstante. [AUSREDE] Aber ich bin/war am Testen und habe den Code einfach quick und dirty aus mehreren Fundstellen zusammengesucht und "gesäubert".[/AUSREDE] Dann kommt eben so etwas raus. In meinem Programm werde ich später im sauberen Code für meine Nachfolger die Konstante verwenden; ich schwöre.

@Bummi
Den Code habe ich schon. Trotzdem Danke. Ich benutze ihn aber eben wegen des Polling nicht. Das Schreiben auf die Platte ist das langsamste von allem.

Ziel ist es später, meine App in eine vorhandene Server-Software zu integrieren, über die unsere gesamte Bürokommunikation läuft. Das muss skalierbar bleiben und muss daher auf das Schonen von Resourcen getrimmt werden. Natürlich will ich das Ganze in einen Thread auslagern. Aber schon der Grund-Code sollte schlank und schnell sein.
Wenn ich das könnte, würde ich mich in Assembler oder so probieren...

Nochmals Danke.

Bummi 16. Nov 2010 09:57

AW: HTML einer URL ohne TWebBrowser und Indys
 
Mal bei den Indy's suchen?

Andreas L. 16. Nov 2010 09:59

AW: HTML einer URL ohne TWebBrowser und Indys
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1061631)
...Ich habe bei meinen Recherchen schon die Indys als mögliche Alternative ausgemacht. Allerdings kann ich die unter TurboDelphi nicht installieren. Ich könnte Komponenten ggf. zwar zur Laufzeit erzeugen. Allerdings wüsste ich zunächst nicht, in welcher Unit ich suchen muss und vielleicht ist das auch mit Kanonen auf Spatzen schießen....

Die Indys sind bei Turbo Delphi schon dabei, nur kannst du Sie nicht in der Tool-Palette sehen ;-)

Delphi-Quellcode:
uses ..., IdHTTP;

...
...

var
  http: TIdHttp;
  quelltext: String;
begin
  http := TIdHttp.create(nil);
  try
    quelltext := http.get('http://url-oder-ip.zu/deiner/weboberflaeche.html');
  finally
    http.free;
  end;
end;

Schwedenbitter 16. Nov 2010 14:19

AW: HTML einer URL ohne TWebBrowser und Indys
 
Hallo,

ich habe es nun über den Code von dem von Klaus01 genannten Link gelöst und werde deshalb hier nicht mehr weiter fragen. Danke nochmal an alle.

Nun stehe ich aber vor dem nächsten Problem:
Einmal runtergeladen muss ich die Faxe auf der TK-Anlage auch löschen. Dort passen nicht viel in den Speicher. Die Weboberfläche macht das über ein Java-Script, welches ich entsprechend auch ausführen müsste. Ich möchte daher an dieser Stelle nur auf das neue Thema verlinken.

Gruß, Alex

[edit]Bei Bedarf stelle ich meine Unit für das Abrufen der Faxe von der DeTeWe OpenCom X320 per PM zur Verfügung.[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Seite 1 von 2  1 2      

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