Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Javascript ohne TWebBrowser ausführen (https://www.delphipraxis.net/156005-javascript-ohne-twebbrowser-ausfuehren.html)

Schwedenbitter 16. Nov 2010 14:12

Javascript ohne TWebBrowser ausführen
 
Hallo,

ich lade aus meiner TK-Anlage Faxe runter. Hierzu gibt es bereit einen separaten Thread. Das funktioniert mittlerweile Dank Eurer Hilfe sehr gut, schnell und resourcenschonend.

Jetzt stehe ich aber vor dem Problem, dass ich die bereits abgerufenen Faxe löschen muss. In der TK-Anlage wird das über eine Weboberfläche gemacht. Diese wiederum löscht die Daten offenbar mittels Javascript, wobei <A CLASS='list' HREF='javascript:bttnDeleteEntry(3, 512, "77")';> entscheidend sein dürfte:
Code:
<A HREF='/fax/001/11_16_14_39_u_0003.exe'><IMG SRC='/images1/pict_cl_fax.gif' TITLE='Anzeigen (110 kB)' BORDER='0'></A><A HREF='/fax/001/11_16_14_39_u_0003.sff'><IMG SRC='/images1/pict_save.gif' TITLE='Speichern (37 kB)' BORDER='0'></A><A CLASS='list' HREF='javascript:bttnDeleteEntry(3, 512, "77")';><IMG SRC='/images1/pict_del_entry.gif' WIDTH='20' HEIGHT='17' BORDER='0' NAME='' TITLE='Eintrag löschen'></A>
Ich möchte ebenso wie beim Download gern auf TWebBrowser verzichten. Ich habe einige Ansätze gefunden, wie es damit geht.

Gibt es eine Möglichkeit, den Code ohne TWebBrowser auszuführen? Falls ja, bitte ich ausdrücklich um Hinweise.

Danke, Alex

s.h.a.r.k 16. Nov 2010 14:15

AW: Javascript ohne TWebBrowser ausführen
 
Schau mal nach, wie die JavaScript-Methode selbst aussieht. Ich denke fast, dass da mit AJAX gearbeitet wird, die dem Server ein gewisses Kommand zukommen lässt. Ohne die JavaScript-Methode können wir leider nichts anfangen.

--EDIT
Mein Ansatz wäre es nun, zu schauen, wie der Browser mit dem Server kommuniziert und das dann nachzubauen.

Schwedenbitter 16. Nov 2010 14:23

AW: Javascript ohne TWebBrowser ausführen
 
Hallo s.h.a.r.k,

Danke für die Antwort.
Zitat:

Zitat von s.h.a.r.k (Beitrag 1061932)
... zu schauen, wie der Browser mit dem Server kommuniziert und das dann nachzubauen.

Wie macht man so etwas? Wobei mich grundsätzlich erstmal das Abhören der Kommunikation interessiert. Unter Linux hätte ich da evtl. eine Idee. Aber unter Windows, wo das ganze Szenario spielt, bin ich ratlos.

wicht 16. Nov 2010 14:26

AW: Javascript ohne TWebBrowser ausführen
 
Mit Wireshark. Oder (etwas komfortabler wie ich finde) mit Fiddler..

s.h.a.r.k 16. Nov 2010 14:36

AW: Javascript ohne TWebBrowser ausführen
 
Schau doch einfach mal im Quellcode nach der JavaScript-Methode. Im Firefox öffnet dir Strg+U den Quellcode der Website. Dort (oder in den Unterdateien) kannst du die JS-Methode finden! Und bzgl. meiner Vermutung bzgl AJAX: Da reicht auf jedenfall die Firebug-Erweiterung für Firefox. Dort gibt es dann einen Tab "Netzwerk", wo man alles sieht, was man brauch. AJAX-Requests werden auch in der Konsole dargestellt, soweit ich weiß.

-- EDIT
Wireshark etc. wäre hier mit Kanonen auf Spatzen geschossen ;)

Schwedenbitter 16. Nov 2010 15:15

AW: Javascript ohne TWebBrowser ausführen
 
Danke. Ich habe jetzt Firebug installiert. Wie muss ich das benutzen?

Ich habe gemäß Deiner Anleitung den Tab "Netzwerk" gewählt. Dort gibt es nun die SubTabs "Alle | HTML | CSS | JS | XHR | Grafiken | Flash". Ich bin dann zu "JS" gewechselt und habe auf "Eintrag löschen" geklickt. Es wurde aber nichts angezeigt, was ich verwursten könnte.
Was mache ich verkehrt?

s.h.a.r.k 16. Nov 2010 15:21

AW: Javascript ohne TWebBrowser ausführen
 
Wenn das Netzwerk-Modul aktiviert ist, dann siehst du wie die Kommunikation zwischen Browser und Server abläuft, also welche Anfragen an den Server gehen und wie diese beantwortet werden. Nun navigiere im Browser eben auf die Seite und drücke den Löschen-Button. Wenn ein Seiten-Reload erfolgt, dann wird wohl nur ein GET-Request an den Server geschickt. Wenn kein Seiten-Reload erfolgt, dann ists wohl ein AJAX-Request.

Klickst du auf das Plus vor dem Delete-Request, dann kannst du einsehen, welche Daten an den Server geschickt werden. Und das kannst du nachbauen.

-- EDIT
Wenn Jabber oder ICQ hast, dann schick mir einfach eine PN, dann können wir das auch da klären.

Schwedenbitter 16. Nov 2010 16:12

AW: Javascript ohne TWebBrowser ausführen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von s.h.a.r.k (Beitrag 1061959)
Wenn ein Seiten-Reload erfolgt, dann wird wohl nur ein GET-Request an den Server geschickt. Wenn kein Seiten-Reload erfolgt, dann ists wohl ein AJAX-Request.

Es sieht nicht danach aus. Denn die Seite wird aller 3 Sek. neu geladen und das sehe ich im Reiter "HTML". Insoweit besteht auch das Problem, dass der von mir gewählte Eintrag bei der Aktualisierung den Focus verliert es sehr schnell unübersichtlich wird.

Zitat:

Zitat von s.h.a.r.k (Beitrag 1061959)
Klickst du auf das Plus vor dem Delete-Request, dann kannst du einsehen, welche Daten an den Server geschickt werden. Und das kannst du nachbauen.

Ich habe mal die Einträge als txt-Dateien angehängt. Ich kann allerdings nicht sehen, inwiefern ich da etwas benutzen könnte.

[EDIT]Ein Fax habe ich noch zum Löschen. Dann muss ich erst wieder warten, bis etwas bei uns eingeht :-)[/EDIT]

Jabber oder ICQ habe ich nicht und möchte ich auch nicht unbedint wegen dieser Sache hier installieren.

wicht 16. Nov 2010 16:44

AW: Javascript ohne TWebBrowser ausführen
 
Hinter dem "Eintrag löschen"-Knopf steht die JS-Funktion bttnDeleteEntry. Diese ist unten definiert in 02_Antwort.txt, die URL, die da aufgerufen wird, wäre dann "/vphone/vp-list-mailin.asp?mode=11&entry='+entry+'&rnr='+rnr+'&typ e='+type+'&read=" - dort müssen dann drei Parameter rein.. die müsstest du noch mitgeben bzw. herausfinden, was sie bedeuten :P

HTH

Schwedenbitter 16. Nov 2010 19:41

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von wicht (Beitrag 1061978)
... dort müssen dann drei Parameter rein.. die müsstest du noch mitgeben bzw. herausfinden, was sie bedeuten :P

Nichts leichter als das. Denn die zu übergebenden Parameter stehen ja im html-Code (Siehe mein erster Post):
Code:
<A CLASS='list' HREF='javascript:bttnDeleteEntry(3, 512, "77")';> ... </A>
Wobei 3 für den Eintrag Nr. 3 steht, ich zur 512 keine Ahnung habe und "77" für Faxe steht. Die Anlage verwaltet auch Telefongespräche, Nachrichten etc. pp.

Wenn ich Dein Post also richtig verstehe, bedeutet das, dass ich Bezug nehmend auf mein obiges Beispiel "nur"
Code:
http://192.168.1.2/vphone/vp-list-mailin.asp?mode=11&entry=3&rnr=512&typ e="77"&read="
an den Server absetzen muss und der Eintrag ist gelöscht? Wie sende ich das ohne TWebBrowser? Muss ich da die '' bzw. "" mit angeben oder reicht das auch so?

Gruß & Dank, Alex

wicht 16. Nov 2010 20:28

AW: Javascript ohne TWebBrowser ausführen
 
Das musst du mit einer x-beliebigen Socket/HTTP-Komponente an den Webserver schicken (die Indys werden oft empfohlen). Die aufzurufende URL müsste dann z.B. so aussehen:
Code:
http://192.168.1.2/vphone/vp-list-mailin.asp?mode=11&entry=3&nr=512&type=77&read=
, also ohne irgendwelche " oder '.

s.h.a.r.k 16. Nov 2010 22:43

AW: Javascript ohne TWebBrowser ausführen
 
Wichtig ist dabei auch, dass das Ergebnis abgefragt wird! Die HTTP Codes kann hier evtl. helfen. Denn am Schluss willst ein Fax löschen, dass es gar nicht mehr gibt.

BTW: gibts eigentlich keine API für diese Anlage?! Denn sobald der Hersteller der Anlage ein Update raus bringt, kann unter Umständen deine Software nicht mehr funktionieren. Mir ist schon klar, dass das mit einer API auch passieren kann, da ist aber das Risiko geringer.

Schwedenbitter 16. Nov 2010 23:06

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von wicht (Beitrag 1062025)
Das musst du mit einer x-beliebigen Socket/HTTP-Komponente an den Webserver schicken (die Indys werden oft empfohlen).

Ich habe es jetzt mit dem Code von hier probiert - Leider ohne Erfolg. Welche Komponente/Unit von den Indys muss ich denn verwenden?

Sir Rufo 16. Nov 2010 23:22

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1062078)
Zitat:

Zitat von wicht (Beitrag 1062025)
Das musst du mit einer x-beliebigen Socket/HTTP-Komponente an den Webserver schicken (die Indys werden oft empfohlen).

Ich habe es jetzt mit dem Code von hier probiert - Leider ohne Erfolg. Welche Komponente/Unit von den Indys muss ich denn verwenden?

Ach den ... Und welchen von den dreien?

s.h.a.r.k 16. Nov 2010 23:30

AW: Javascript ohne TWebBrowser ausführen
 
Wieso drei? Er referenziert doch genau einen -> Anker im Link! Den mittleren halt ;)

Schwedenbitter 16. Nov 2010 23:34

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1062085)
Ach den ... Und welchen von den dreien?

Der erste funktioniert laut Fragesteller nicht und der letzte benutzt die Komponentensammlung 'synapse'. Also der 2. natürlich, zumal der Code von meinem Link auch genau auf diesen scrollen sollte. Das tut er jedenfalls in meinem Browser.

Die Frage zur API muss ich dann mal an den Telefon-Menschen weiterleiten. Im Dezember soll sowieso ein Update aufgespielt werden.

Folgender Code kommt zwar bis zur letzten Bedingung durch und liefert mit ein 'True' zurück. Das Fax bleibt aber beharrlich in der Anlage und nicht dort wo sie hinsollte - ins Nirvana:
Delphi-Quellcode:
Function DeleteItem(sURL, ItemEntry, ItemNr : String): Boolean;
Var
  S       : String;
  hSession : hInternet;
  hConnect : hInternet;
  hRequest : hInternet;
Begin
  Result:=False;
  hSession:=InternetOpenA('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  If (Assigned(hSession)) Then
  Begin
    hConnect:=InternetConnectA(hSession, PChar(sURL), INTERNET_DEFAULT_HTTP_PORT,
      nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    If (Assigned(hConnect)) Then
    Begin
      hRequest:=HttpOpenRequestA(hConnect, 'POST', PChar(sURL),
        nil, nil, nil, INTERNET_SERVICE_HTTP, 0);
      If (Assigned(hRequest)) Then
      Begin
        S:='http://' + sURL + '/vphone/vp-list-mailin.asp?mode=11&entry=' +
          ItemEntry + '&nr=' + ItemNr + '&type="77"&read= ';
        Result:=HttpSendRequestA(hRequest, nil, 0, Pointer(S), Length(S));
        InternetCloseHandle(hRequest);
      End;
      InternetCloseHandle(hConnect);
    End;
    InternetCloseHandle(hSession);
  End;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(BoolToStr(DeleteItem('192.168.1.2', '0', '512'), True));
end;
Wo liegt mein Fehler?
Jetzt muss ich morgen vermutlich doch mal zum Siffer greifen und nachsehen, was exakt die Software an den Server in der Anlage sendet.

Gruß, Dank & Gute Nacht, Alex

Sir Rufo 16. Nov 2010 23:43

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1062086)
Wieso drei? Er referenziert doch genau einen -> Anker im Link! Den mittleren halt ;)

Genau den hätte ich nicht genommen.

Ich würde es mal mit synapse probieren. Da braucht auch nichts installiert werden und nach meinen Erfahrungen sehr sauber und extrem stabil.

Schwedenbitter 17. Nov 2010 08:45

AW: Javascript ohne TWebBrowser ausführen
 
OK. Dieses Thema hat mich auf folgende Idee gebracht:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  With TDownloadURL.Create(self) Do
  Try
    URL:='http://192.168.1.2/vphone/vp-list-mailin.asp?mode=11&entry=0&nr=512&type="77"&read=';
    FileName:='Dummy.html';
    Try
      ExecuteTarget(nil);
      ShowMessage('Executed OK');
    Except
      On E : Exception Do ShowMessage(E.Message);
    End;
  Finally
    Free;
  End;
end;
Zwar löscht er mir den Eintrag auch nicht. Aber ich bekomme eine html-Datei zurück, die mir mögliche Fehler verrät:
Code:
<html><body>
<h2><b>ASP Error</b></h2>
vp_list_mailin(mode,entry,rnr,type,read);
</body></html>
Wenn ich das richtig verstehe, ist mein 'POST' angekommen und der Server ist sogar noch so nett und sagt mir, wie ich die Funktion richter Weise benutzen soll. Da ich read= nirgends finden kann, bleibt mir also doch nur ein Shniffer. Oder sehe ich das falsch?

Ich möchte keine anderen Komponenten verwenden (Indys eingeschlossen), wenn und soweit die Chance besteht, dass ich es mit den Bordmitteln hinbekomme.

[EDIT]
Habe jetzt den Traffic mal mit Live HTTP Headers mitgeschnitten und es hat den Anschein, dass die Variablen vertauscht und die Argumente andere sind. Ich muss jetzt leider warten, bis wieder ein Fax eingeht und werde es dann probieren. Bins schon ganz euphorisch!
[/EDIT]

Gruß, Alex

Sir Rufo 17. Nov 2010 09:01

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1062119)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  With TDownloadURL.Create(self) Do
  Try
    URL:='http://192.168.1.2/vphone/vp-list-mailin.asp?mode=11&entry=0&nr=512&type="77"&read=';
    FileName:='Dummy.html';
    Try
      ExecuteTarget(nil);
      ShowMessage('Executed OK');
    Except
      On E : Exception Do ShowMessage(E.Message);
    End;
  Finally
    Free;
  End;
end;
Zwar löscht er mir den Eintrag auch nicht. Aber ich bekomme eine html-Datei zurück, die mir mögliche Fehler verrät:
Code:
<html><body>
<h2><b>ASP Error</b></h2>
vp_list_mailin(mode,entry,rnr,type,read);
</body></html>
Ich möchte keine anderen Komponenten verwenden (Indys eingeschlossen), wenn und soweit die Chance besteht, dass ich es mit den Bordmitteln hinbekomme.

Ist das ein Tippfehler in deinem Code?
statt
Code:
entry=0&nr=512&type
müsste es doch
Code:
entry=0&rnr=512&type
lauten

Schwedenbitter 17. Nov 2010 10:07

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1062125)
Ist das ein Tippfehler in deinem Code?
statt
Code:
entry=0&nr=512&type
müsste es doch
Code:
entry=0&rnr=512&type
lauten

Ja - genau das. Und auch die Argumente sind anders als im html-Quelltext angegeben. Im Quelltext steht
Code:
type="77"
und
Code:
nr=512
(ohne das zusätzliche r), während es die Funktion umgekehrt und mit r will. Vielleicht eine Falle für Leute, die eine Software für die Anlagen schreiben wollen :lol: Wie auch immer.
Es funktioniert jetzt über die URL
Code:
http://192.168.1.2/vphone/vp-list-mailin.asp?mode=11&entry=0&rnr=77&type=512&read=
Danke für Eure Hilfe. Ich fasse mal zusammen:

1. Man kann ein 'POST' ziemlich einfach über TDownloadURL absetzen und damit eine Javascript-Funktion ausführen lassen.
2. Oben steht, wie es insbesondere bei einer OpenCom X320 geht.

BUG 17. Nov 2010 14:31

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1062134)
1. Man kann ein 'POST' ziemlich einfach über TDownloadURL absetzen und damit eine Javascript-Funktion ausführen lassen.

Kann man das so stehen lassen?
Denn JavaScript führst du damit ja nicht aus, sondern du hast die Funktionalität der JavaScript-Funktion nachprogrammiert, und die ruft eben eine URL auf (aber anscheinend mit GET)

Schwedenbitter 17. Nov 2010 14:59

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von BUG (Beitrag 1062181)
Kann man das so stehen lassen?

Stimm insoweit, als es nicht exakt ausgedrückt ist. Nicht ich (mein Programm), sondern der Server führt das JS aus. Ich fordere ihn dazu nur auf und übergebe ihm mit/in der URL die Argumente. Und da diese wiederum nicht im Header, sondern eben in der URL selbst stehen, ist es per Definition nach dem Artikel von wikimedia.org ein 'GET'.

So gesehen ist aber auch das Thime nicht richtig formuliert, woran bislang keiner Anstoß genommen hat. Es müsste heißen: "Javascript ohne TWebBrowser auf einem http-Server ausführen lassen".

Soll ich es ändern?

wicht 17. Nov 2010 15:19

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Nicht ich (mein Programm), sondern der Server führt das JS aus.
Weder der Server, noch du, führen hier JS aus. Der Server kann das nicht, weil es eine Clientseitige Sprache ist (sprich das Script läuft im Browser), und du schickst an den Server einene ganz normale GET-Anfrage.
Du machst es hier eben selber, ansonsten führt das JavaScript diese Anfrage aus dem Browser heraus aus (genau genommen surft das JS nur zu der URL, die den Befehl an den Server sendet). Das ganze hat eigentlich nur wenig mit JS zu tun, das, was im Browser abläuft, würde sich wohl auch über einen ganz normalen Link bewerkstelligen lassen.

BUG 17. Nov 2010 15:20

AW: Javascript ohne TWebBrowser ausführen
 
Dass hinter ASP auch Javascript stecken kann, habe ich nicht gewusst :wall:

Von mir aus brauchst du nichts ändern (wenn du nicht möchtest), ich wollte nur vermeiden, das irgendjemand auf die Idee kommt, man könne auf diese Weise irgendwie clientseitiges Javascript ausführen (was du ja afaik mit TWebBrowser gemacht hattest).

Schwedenbitter 17. Nov 2010 15:30

AW: Javascript ohne TWebBrowser ausführen
 
Ich bin Laie und verstehe das nicht so recht. Dass Java auf dem Client läuft, leuchtet mir noch ein. Sonst müsste ich nicht das JRE installieren. Also erzeuge ich im Grunde nur das Ergebnis eines Java-Scripts und schicke die URL an den Server.

Aber wie nennt man dann das, was auf dem Server passiert? Ich beeinflusse den insofern, als der mein Fax dort löscht.:gruebel: Und das nicht einfach so, sondern erst aufgrund der von mir gesendeten Daten.

BUG 17. Nov 2010 15:46

AW: Javascript ohne TWebBrowser ausführen
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1062193)
Dass Java auf dem Client läuft, leuchtet mir noch ein. Sonst müsste ich nicht das JRE installieren. Also erzeuge ich im Grunde nur das Ergebnis eines Java-Scripts und schicke die URL an den Server.

Aua: Bei Google suchenJavaScript ist nicht Java

Zitat:

Zitat von Schwedenbitter (Beitrag 1062193)
Aber wie nennt man dann das, was auf dem Server passiert? Ich beeinflusse den insofern, als der mein Fax dort löscht.:gruebel: Und das nicht einfach so, sondern erst aufgrund der von mir gesendeten Daten.

Im Grunde ist es völlig egal wie etwas auf dem Server passiert, er ist eine BlackBox.
Du hast HTTP als Protokoll: du schickst eine Anfrage, der Server interpretiert die, macht dementsprechend etwas und schickt dir dann/dabei eine Antwort.

Vergleiche es einfach mal mit einem Kommandozeilenprogramm:
Dir kann es völlig egal sein, in welcher Sprache es programmiert ist. Du gibst Text rein, der wird verarbeitet, das Programm tut seinen Dienst und gibt dir Text aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.

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