Javascript ausführen über Console oder PHP

  • Hallo zusammen,


    suche nach einer Möglichkeit folgendes Script über die Console auszuführen:



    Hat jemand eine Idee?

  • Go to Best Answer
  • suche nach einer Möglichkeit folgendes Script über die Console auszuführen:

    Das ist kein Script - das ist eine gesamte Website. Du kannst

    • sie im Browser deiner Wahl öffnen und diesen mit der Ausführung beauftragen
    • das JavaScript extrahieren und für Node.js (Server-Seitiges JavaScript) anpassen
    • die WebSocket-Verbindung in einer anderen Sprache deiner Wahl schreiben - ist ja kein Hexenwerk
  • Danke für die schnelle Rückmeldung.

    Möchte so serverseitig bestimmte Aktualisierungen einer Benutzeroberfläche anstoßen...


    Das ist kein Script - das ist eine gesamte Website. Du kannst

    • sie im Browser deiner Wahl öffnen und diesen mit der Ausführung beauftragen
    • das JavaScript extrahieren und für Node.js (Server-Seitiges JavaScript) anpassen
    • die WebSocket-Verbindung in einer anderen Sprache deiner Wahl schreiben - ist ja kein Hexenwerk

    zu 1, ist dies auch serverseitig über einen Consolenbefehl möglich?

    zu 2, hab ich noch nie gemacht und traus mir auf die schnelle auch nicht zu

    zu 3, werde ich evtl. mal mit python versuchen- müsste gehen oder?

  • zu 1, ist dies auch serverseitig über einen Consolenbefehl möglich?

    Über Umwege - theoretisch kannst du einen Headless-Browser starten, ist aber komplett overkill. Am besten gleich wieder vergessen.


    zu 3, werde ich evtl. mal mit python versuchen- müsste gehen oder?

    Ja: https://websockets.readthedocs.io/en/stable/intro.html


    Ungetestet:

  • Besten Dank,

    habs so gelöst:


    Python
    #!/usr/bin/python
    
    from websocket import create_connection
    ws = create_connection("ws://localhost:8008/websocket")
    ws.send('{"type":"reload", "user_id":"server", "number":"1234"}')
    result =  ws.recv()
    print "Received '%s'" % result
    ws.close()


    Wäre evtl. noch vorteilhaft die parameter für type, und number als Argumente beim Aufrufen übergeben zu können...

    Bin leider nicht so fit mit python..

  • ChrisChip Python 2 sollte man nicht mehr verwenden. Das ist seit Anfang des Jahres am Ende und Du wirst das dann sowieso auf Python 3 portieren müssen wenn Python 2 aus den Linuxdistributionen raus ist.


    Spätestens wenn Werte in dem JSON variabel sein sollen, würde ich das nicht mehr als Zeichenkette machen sondern als Datenstruktur die dann als JSON serialisiert wird. Das gilt erst recht wenn die Werte die da eingesetzt werden sollen von aussen kommen. Neben kaputten JSON wäre das Programm sonst auch für so etwas ähnliches wie SQL-Injektion offen, nur dass beliebiges JSON eingeschmuggelt werden könnte.


    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

    • Best Answer

    habs so gelöst:

    Sieht gut aus, ist aber nicht optimal:

    • Du verwendest Python 2, das sieht man an print und dem Shebang. Das ist aber seit Anfang 2020 ohne Support und sollte nicht mehr verwendet werden. Auf deinem System sollte ebenfalls ein halbwegs aktuelles Python (>= 3.6) installiert sein, verwende das.
    • Strings lassen sich dann mit f-Strings einfacher, schöner und performanter formatieren.


    Wäre evtl. noch vorteilhaft die parameter für type, und number als Argumente beim Aufrufen übergeben zu können...

    Das geht, klar - entweder mit argparse (https://docs.python.org/3/library/argparse.html) oder in einfachen Programmen wie deinem sys.argv (https://docs.python.org/3/library/sys.html#sys.argv)


    Alles in allem dann:

    type_ Mit Unterstrich, um nicht die built-in-function type() zu überschreiben. Das JSON direkt als String zu schreiben würde ich nicht empfehlen, da kann es zu Problemen kommen wenn etwas escaped werden muss.

  • Jo, irgendwas. Was das genau ist steht weiter unten und ist auf dem Bildschirmfoto nicht mehr mit drauf. Wobei man Text auch besser als Text und als Code formatiert in den Beitrag schreiben sollte statt ein Bild davon zu machen.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Python
    #!/usr/bin/python
    import json
    import sys
    from websocket import create_connection
    ws = create_connection("ws://localhost:8008/websocket")
    type_ = sys.argv[1]
    number_ = sys.argv[2]
    ws.send(json.dumps({"type": type_, "user_id": "server", "number": number_}))
    ws.close()

    So funktioniert es jetzt. Kann mit dem veraltetem python leben.

    Hab nur noch das Problem, das jedes mal erst eine Verbindung aufgebaut werden muss (dauert > 200ms).

    Wie kann ich die Verbindung öffnen und halten und nur noch die Argumente übergeben?


    Dachte an sowas wie:

    INIT

    - Verbindung herstellen

    - ws in Datei Speichern


    SENDEN

    - ws aus Datei auslesen

    - ws.send...


    Verbindung könnte dauerhaft erhalten bleiben. Könnte das klappen oder hab ich einen Denkfehler?

  • Keiner eine Idee wie ich die Verbindung aufrecht erhalten und diese beim nächsten aufrufen des Python- Scripts verwenden kann?

    Abpseichern des Inhalts von "ws" in ein Textfile und anschließendes auslesen hab ich schon versucht, bekomme aber immer eine Fehlermeldung...

  • Kann mit dem veraltetem python leben.

    Nein, kannst du auf Dauer nicht (Prognose: bis zum nächsten Debian/Raspbian Release).


    Keiner eine Idee wie ich die Verbindung aufrecht erhalten und diese beim nächsten aufrufen des Python- Scripts verwenden kann?

    Daemon-Prozess erstellen, der die Verbindung offen hält und dem dann per IPC mitteilen, wenn eine neue Nachricht gesendet werden soll.


    Abpseichern des Inhalts von "ws" in ein Textfile und anschließendes auslesen hab ich schon versucht, bekomme aber immer eine Fehlermeldung...

    das ist nicht, wie Computer funktionieren :-/

  • Nein, kannst du auf Dauer nicht (Prognose: bis zum nächsten Debian/Raspbian Release).


    Daemon-Prozess erstellen, der die Verbindung offen hält und dem dann per IPC mitteilen, wenn eine neue Nachricht gesendet werden soll.


    das ist nicht, wie Computer funktionieren :-/


    Hab ich schon fast befürchtet das es nicht geht :conf: bin dabei aber auf was andres gekommen.

    Hätte bereits einen Daemon Prozess laufen den ich vielleicht dafür verwenden könnte:

    Handelt sich um meinen Websocket Server (ich weiß, PHP ist nicht die Sprache der Wahl dafür, funktioniert aber ganz gut soweit)


    Wo könnte ich hier meinen Code reinpacken der zyklisch aufgerufen werden soll?

    Möchte ein paar Daten aus meiner DB abfragen und bei Bedarf ein

    Code
    $client->send(json_encode(array("type"=>$type,"msg"=>$message)));

    raushauen?