klawischnigg: Anwendung von Browser starten

Hi there,

kennt jemand von Euch ein Browserplugin oder irgendeine andere Möglichkeit, vom Browser aus via javascript eine Anwendung in Windows oder auch evt. Linux zu starten?

(Ehe jetzt jemand in Schnapp-Atmung verfällt - ich brauch' das nur für mich selbst, das bleibt im LAN, das ist nix für "in the wild";).

Es geht im Konkreten darum, daß der Browserinhalt (der eine komplexe Animation ist, die in Realtime mit JS nicht zu realisieren ist) pro erzeugtem Bild durch einen Screenshot erfasst wird, der abgespeichert wird (die screenshots werden nachher in ein Video umgewandelt). Ich hab das jetzt mit einem Webserver gelöst, der auf dem Rechner rennt, auf dem der Browser das Bild generiert und ich mach einen Post auf den Server, der dann PHP die Applikation aufrufen läßt, die den Screenshot macht. Klingt umständlich, ist es auch, daher die Frage, ob ich die Geschichte mit dem Webserver umgehen könnte. Browser wäre egal (solange er nicht von Mirkosaft kommt, ich hab kein Betriebssystem, auf dem ein aktueller IE oder Edge läuft)…

Was ich noch sagen wollte - es gibt Javascripte, die screenshots erzeugen, nur, erstens müßte ich die ja auch irgendwohin posten, um sie speichern zu können und zweitens verstehen sich die nicht auf alle css-effekte, die ich in der Animation verwende…

  1. Hallo,

    … um sie speichern zu können und …

    such mal nach filesaver. Mit "einem Trick" kann javascript auch speichern.

    https://github.com/eligrey/FileSaver.js/

    Ich meine, finde es jetzt aber nicht, das der Chrome auch native speichern kann.

    Gruß
    Jürgen

    1. Hi there,

      such mal nach filesaver. Mit "einem Trick" kann javascript auch speichern.

      https://github.com/eligrey/FileSaver.js/

      Ja, das wäre im Prinzip interessant, kann aber keine Screenshots machen (nur von canvas, was ich aber nicht verwende)…

      1. Hallo,

        such mal nach filesaver. Mit "einem Trick" kann javascript auch speichern.

        https://github.com/eligrey/FileSaver.js/

        Ja, das wäre im Prinzip interessant, kann aber keine Screenshots machen (nur von canvas, was ich aber nicht verwende)…

        natürlich nicht, das ist ja nur eine Speicherbibliothek.

        Was ich noch sagen wollte - es gibt Javascripte, die screenshots erzeugen, nur, erstens müßte ich die ja auch irgendwohin posten, um sie speichern zu können und zweitens verstehen sich die nicht auf alle css-effekte, die ich in der Animation verwende…

        Ich dachte, der Screenshot wäre nicht das Hauptproblem.

        Gruß
        Jürgen

        1. Hi there,

          Ich dachte, der Screenshot wäre nicht das Hauptproblem.

          eh nicht, aber erzeugt muß er trotzdem werden😉. Das ist mit browsereigenen Bordmittel immer noch ein Problem (die neuersten Geräte können das aber), weil da nicht alle css-Effekte mitkommen…

  2. Hallo klawischnigg,

    ich wüsste auch nicht, dass man blindlings das Browserfenster in einen Canvas oder sonst eine Bitmap laden kann. Vermutlich wäre das am elegantensten. Aber die diversen Googletreffer zeigen alle, dass sie das DOM in einen Canvas nachmalen und bei weitem nicht alles CSS verstehen.

    Ich habe noch das hier gefunden - kannst Du das für deine Bedürfnisse anpassen?

    Ansonsten ist das Triggern eines Screenshots via localhost-Webserver und PHP wohl die einfachste Lösung, denn die Browser sind extrem bestrebt, aus Sicherheitsgründen den Zugang zum Client-Computer zu unterbinden.

    Eine Alternative zum Webserver ist ein custom protocol handler, den man über die Registry einrichten kann. Damit könntest Du erreichen, dass der Abruf der URL klawisch://nigg/1 ein von Dir hinterlegtes EXE startet, das nigg/1 als Parameter bekommt. Aber das Programm musst Du auch schreiben, und du kommst in die CORS-Problematik. Bleib bei PHP, wenn es deine Bedürfnisse erfüllt. Eleganter bekommst Du es nicht hin, denke ich.

    Was es auch gibt, sind Browser als Controls für ein Java- oder C# Programm. Die Firma TeamDev hat Chromium für Java und C#. Aber sie wollen für eine Lizenz für einen Entwickler $1200 (C#) bzw. $1800 (Java) sehen. Der IE als Webbrowser-Control ist gratis. Aber es ist eben nur ein IE. Ob der kommende Chromium Edge als Webbrowser-Control nutzbar sein wird, steht in den Sternen Redmonts.

    Eine "bescheuerte" Lösung könnte ein Tool sein, dass die Titelzeile des Browsers beobachtet. Die kannst Du über document.title beeinflussen. Fehlt dann nur die Rückmeldung, dass der Screenshot fertig ist...

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      Was es auch gibt, sind Browser als Controls für ein Java- oder C# Programm. Die Firma TeamDev hat Chromium für Java und C#. Aber sie wollen für eine Lizenz für einen Entwickler $1200 (C#) bzw. $1800 (Java) sehen. Der IE als Webbrowser-Control ist gratis. Aber es ist eben nur ein IE. Ob der kommende Chromium Edge als Webbrowser-Control nutzbar sein wird, steht in den Sternen Redmonts.

      Electron, wenn es etwas Ähnliches, Kostenloses, Systemübergreifendes sein soll. Ob die etwas an Bord haben, um Screenshots zu erzeugen, oder etwas per NodeJS nachladbar ist, weiß ich aber nicht. Ich würde mich aber wundern, wenn nicht.

      dedlfix.

      1. Electron, wenn es etwas Ähnliches, Kostenloses, Systemübergreifendes sein soll. Ob die etwas an Bord haben, um Screenshots zu erzeugen, oder etwas per NodeJS nachladbar ist, weiß ich aber nicht. Ich würde mich aber wundern, wenn nicht.

        Puppeteer von Google ist eine Node.js-Library zum Steuern von (headless) Chrome. Damit kann man auch Screenshots machen.

    2. Hi there,

      Eine "bescheuerte" Lösung könnte ein Tool sein, dass die Titelzeile des Browsers beobachtet. Die kannst Du über document.title beeinflussen. Fehlt dann nur die Rückmeldung, dass der Screenshot fertig ist...

      Das ist eigentlich alles andere als bescheuert (na gut, das mit der Titelzeile ist bescheuert😉) - aber das hat mich sofort auf eine ähnliche Idee gebracht - ich könnt' ja ein cookie setzen, wenn das Graffl fertig ist, und das kann ich irgendwie auslesen. Oder etwas in den local-storage schreiben. Danke, ich denke, das hat mich weitergebracht...😉

      1. Hallo klawischnigg,

        mich hast Du dafür jetzt abgehängt.

        irgendwie

        Das ist wohl das Schlüsselwort. Wie und liest Du von außerhalb des Browsers einen Keks oder localStorage aus, um einen Screenshot zu triggern? Willst Du auf die physische Speicherschicht des Browsers zugreifen? Zum einen ist diese Schicht geöffnet und damit ggf. blockiert, und zum anderen würde hier lazy writing des Browsers unterstellen, d.h. wenn der Keks im SQLite des Browsers landet, ist deine gerenderte Seite schon halb zerkrümelt.

        Was stört Dich so sehr am lokalen Webserver? Wenn Du keinen lokalen WS betreiben willst, dann nimm doch den integrierten Developerserver von PHP (z.B. PHP -S localhost:4711). Diese Animiererei ist doch vermutlich eine einmalige Angelegenheit und keine Sache, die professionell und ausfallsicher als unternehmenskritische Anwendung laufen muss.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hi there,

          irgendwie

          Das ist wohl das Schlüsselwort. Wie und liest Du von außerhalb des Browsers einen Keks oder localStorage aus, um einen Screenshot zu triggern? Willst Du auf die physische Speicherschicht des Browsers zugreifen? Zum einen ist diese Schicht geöffnet und damit ggf. blockiert, und zum anderen würde hier lazy writing des Browsers unterstellen, d.h. wenn der Keks im SQLite des Browsers landet, ist deine gerenderte Seite schon halb zerkrümelt.

          Tja "irgendwie" gehts immer. Im Prinzip hast Du natürlich recht, aber ich muß da eigentlich gar nicht "zugreifen", mir genügt es nachzuschauen, ob sich etwas verändert hat. In dem Zusammenhang wär' die Idee von Jürgen vielleicht brauchbar, wie mir nachträglich ein- oder eher aufgefallen ist, ich muß ja keinen screenshot speichern sondern es reicht, wenn ich irgendwo ein File generier', und wenn da nur drin' steht, daß Dagobert eine geldgierige Ente ist.

          Was stört Dich so sehr am lokalen Webserver?

          Gar nichts, ich wollt's halt nur eine Spur "eleganter" lösen.

          Diese Animiererei ist doch vermutlich eine einmalige Angelegenheit und keine Sache, die professionell und ausfallsicher als unternehmenskritische Anwendung laufen muss.

          Einmalig nicht aber sonst völlig richtig. Ich hab nicht vor, das aus der Hand zu geben oder zu verscherbeln…

          Da kommt dann sowas in der Art heraus…😉

  3. Hallo,

    Es geht im Konkreten darum, daß der Browserinhalt (der eine komplexe Animation ist, die in Realtime mit JS nicht zu realisieren ist) pro erzeugtem Bild durch einen Screenshot erfasst wird, der abgespeichert wird (die screenshots werden nachher in ein Video umgewandelt).

    Ein screenshot-tool, das in festgelegten Abständen feuert, ist vermutlich ungeeignet?

    Gruß
    Kalk

    1. Hi there,

      Es geht im Konkreten darum, daß der Browserinhalt (der eine komplexe Animation ist, die in Realtime mit JS nicht zu realisieren ist) pro erzeugtem Bild durch einen Screenshot erfasst wird, der abgespeichert wird (die screenshots werden nachher in ein Video umgewandelt).

      Ein screenshot-tool, das in festgelegten Abständen feuert, ist vermutlich ungeeignet?

      Leider richtig, weil das Tool ja nicht weiß, wann der Seitenaufbau fertig ist und sich das anderseits nicht richtig synchronisieren ließe, weil ja nicht jede Bildberechnung gleich lange dauert. Ich hab mir das anfangs auch überlegt, aber da kommt man früher oder später (eher früher😉) in des Teufels Küche…

  4. Ich möchte allen danken, die sich des Problems angenommen haben. Es waren sehr gute Anregungen dabei, damit kann ich was anfangen und da kann ich jetzt weiterrecherchieren...😉

  5. Hallo,

    wie wäre es, wenn du das ganze umdrehst, und nich deine Webseite eine Applikation startet, sondern eine Applikation deine Webseite?

    Mein Gedanke geht in die Richtung, dass du in einer kleinen Applikation einen Headless Browser startest (kann auch in beinahe jeder Sprache geschehen, die z.B. Selenium oder sonstige WebDriver Bindings hat), und dort die Screenshot-Funktionalität benutzt?

    Viele Grüße Matti

    1. Hi there,

      wie wäre es, wenn du das ganze umdrehst, und nich deine Webseite eine Applikation startet, sondern eine Applikation deine Webseite?

      Interessant. Die Parameter könnt ich entweder im Aufruf mitübergeben oder aber das Skript einfach vom aufrufenden Programm verändern lassen. Sehr interessant...😉

  6. Hello,

    beim guten alten IE auf Windows gab es HTA. Recherchier doch mal, was davon noch übrig ist.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Hi there,

      beim guten alten IE auf Windows gab es HTA. Recherchier doch mal, was davon noch übrig ist.

      Blöd nur, daß der gute alte IE mein Javascript und mein CSS nicht versteht...😉

      1. Hello,

        beim guten alten IE auf Windows gab es HTA. Recherchier doch mal, was davon noch übrig ist.

        Blöd nur, daß der gute alte IE mein Javascript und mein CSS nicht versteht...😉

        Du hast also nicht recherchiert?

        Für HTA haben sich auch andere Browser durch hinzufügen von Plugins erwärmen können. Ich habe das eine Zeit lang im Firefox nutzen können. Soweit ich das verstanden hatte, ginv es doch nicht um eine öffentliche Anwendung!?

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
  7. Suchst Du sowas:

    use Win32::Screenshot;
     
    $image = CaptureRect( $x, $y, $width, $height );
    $image->Write('screenshot.png');
    

    ?

    1. Suchst Du sowas:

      use Win32::Screenshot;
       
      $image = CaptureRect( $x, $y, $width, $height );
      $image->Write('screenshot.png');
      

      Die Wahrscheinlichkeit ist... gering!

  8. Mahlzeit,

    Wenn ich das richtig verstehe, geht das mit jeder Programmiersprache, die eine Schnittstelle zum Webserver herstellt. Einfach per Ajax z.B. ein PHP-Script aufrufen und das per shell_exec o.ä. ein externes Programm starten lassen. Auch gibt es, zumindest unter Linux, die Möglichkeit ein eigenes Browserprotokoll zu registrieren, damit starte ich z.B. aus einer Debugseite die IDE vund rufe gleich Datei und Zeile auf. Hab jetzt grad keinen Link dazu da, aber mit der Suche nach "register custom browser protocol" solltest du fündig werden.

    --
    42
    1. Hi there,

      Einfach per Ajax z.B. ein PHP-Script aufrufen und das per shell_exec o.ä. ein externes Programm starten lassen.

      Genau so mach ich es ja jetzt, und das hab ich auch geschrieben…