"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Webseite als geplanten Task starten?

Umlüx 03.05.2022 - 09:17 2324 9
Posts

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 8897
Ich hab hier ein Script, welches einen Sony Bravia TV ein- und ausschalten kann. Das würde ich gerne regelmässig als geplanten Task ausführen lassen um den TV nachts auszuschalten und morgens wieder einzuschalten.
Das Problem: Das ist Javascript auf einer Webseite, muss also im Browser aufgerufen werden.
Wenn ich aber nun einfach eine Firefox instanz im Taskplaner mit der url starte, bleibt der Browserprozess natürlich zurück...
Rufe ich die URL in einem Powershell auf (mit invoke-WebRequest), führt er natürlich das JS nicht aus.

Wie könnte ich das am elegantesten lösen?

quilty

Ich schau nur
Avatar
Registered: Jul 2005
Location: 4202
Posts: 2932
Soll eigentlich mit PhantomJS oder vergleichbaren einfach lösbar sein.
Scriptable headless web browser als "Stichwort".

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19585
Kann man nicht einfach ein Batch-/Command-File starten dass zuerst alle z.B. firefox.exe prozesse killt (taskkill) und danach die URL aufruft (geht das ev. einfach via "start firefox.exe %url%")?
Die API oder was auch immer da vom Fernseher via JS angesprochen wird einfach selbst ansprechen via script (müsste man halt wissen wie das aussieht und was das JS genau macht).

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 8897
Möchte ungern einfach alle Prozesse killen, eventuell lässt mal wer eine Seite offen die später noch gebraucht wird.

Soweit ich das erkannt habe wird im Script ein json Paket auf die Rest API vom TV geschickt.
Ich dachte auch schon daran, das JS aus dem HTML zu reissen und vom WSH ausführen zu lassen?
Die Headless Browser sache sieht aber auch sehr interessant aus.
Danke erstmal!

JDK

Oberwortwart
Avatar
Registered: Feb 2007
Location: /etc/graz
Posts: 2742
Einfach das Skript in ein Node.js Skript umbauen und fertig. Wenn’s eh nur ein API Call ist, geht das auch problemlos mit anderen Sprachen.

Hast einen Link zum Skript?

quilty

Ich schau nur
Avatar
Registered: Jul 2005
Location: 4202
Posts: 2932
wenn es immer die gleiche payload ist kannst das json ja auch direkt mit curl an die API schicken

EG

thinking with portals
Avatar
Registered: May 2004
Location: 11**
Posts: 3918
Oder einfach ein bash script mit einem curl-Einzeiler, dass du in einen cronjob wirfst?
Wirkt weniger komplex als einen headless Browser zu bedienen... ^^"

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 8897
Ist ja nicht so, als hätte ich es vorher nicht selber versucht in PowerShell nachzubauen :D leider bin ich aber am JSON gescheitert, der TV nimmts einfach nicht an.

Das Webscript selbst ist eh eher simpel. Ich hab das Sony Script bereits selbst auf das nötige zusammengekürzt.

Code:
<script>
<?php
 // Bravia Power Control
 // usage example: [url]http://intranet/tools/braviacontrol/?ip=10.37.100.240&action=poweron[/url]
 // actions: poweron, poweroff, powerquery
   
 $ip = $_GET["ip"];
 $action = $_GET["action"];
 $psk = "1234";

 switch($action) {
    case "poweron":
        echo "send('system', 'setPowerStatus', {status: true});";
        break;
    
    case "poweroff":
        echo "send('system', 'setPowerStatus', {status: false});";
        break;
    case "powerquery":
        echo "send('system', 'getPowerStatus', {});";
        break; 
 }
?>

function send(service, method, params) {
  var ip = "<?php echo $ip;?>";
  var psk = "<?php echo $psk;?>";
  var xhr = new XMLHttpRequest();
  xhr.onload = function() {
    var resp = xhr.responseText;
    document.write('\nstatus: ' + xhr.status + '\n' + JSON.stringify(JSON.parse(xhr.response), null, '  '))
  };
  xhr.open('POST', 'http://' + ip + '/sony/' + service);
  if (psk) {
    xhr.setRequestHeader('X-Auth-PSK', psk);
  }

  xhr.send(JSON.stringify({
    method: method,
    version: '1.0',
    id: 1,
    params: params ? [params] : [],
  }));
}
</script>

meepmeep

Here to stay
Avatar
Registered: Feb 2006
Location: Wien
Posts: 2330
wenn ich das skript richtig interpretiert hab sollte das funktionieren:

Code:
curl -d '{"method":"setPowerStatus","version":"1.0","id":1,"params":[{"status":true}]}' -H "X-Auth-PSK: 1234" -X POST [url]http://[/url]<ip:port>/sony/system

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 8897
Danke dir. Aber anscheinend nicht ganz.
"{"error":[5,"Illegal JSON"]}"

Genau hier häng ich nämlich auch mit meiner Powershell Version und finde keine Lösung.

Edit:

geht doch :D
Unter Windows muss die JSON Payload anscheinend in doppelte Anführungszeichen. Und danach gehören die Inneren mit Backslash escaped.

DANKE!
Bearbeitet von Umlüx am 03.05.2022, 12:39
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz