![]() |
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:
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.
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; 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 |
AW: HTML einer URL ohne TWebBrowser und Indys
|
AW: HTML einer URL ohne TWebBrowser und Indys
Mach ein Sleep(0) in die Schleife. Und was ist ReadyState 3?
|
AW: HTML einer URL ohne TWebBrowser und Indys
Zitat:
![]() |
AW: HTML einer URL ohne TWebBrowser und Indys
Eigentlich wollte ich darauf hinweisen, dass man bessr sprechende Konstanten verwenden sollte.
|
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. |
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. |
AW: HTML einer URL ohne TWebBrowser und Indys
Mal bei den Indy's suchen?
|
AW: HTML einer URL ohne TWebBrowser und Indys
Zitat:
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; |
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 ![]() 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:40 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