Event in Firefox extern auslösen

Gast #5947640
Lesenswert?

Ich versuche gerade herauszufinden, wie ich von einem externen Skript 
aus einen Event in Firefox auslösen kann, auf den ich dann zB mit JS 
reagieren kann. Das Ganze soll lokal auf Windows funktionieren, ohne daß 
das Netzwerk involviert werden braucht. Alles innerhalb vom Konto meines 
Benutzers, daher könnte ich an etwaigen Sicherheitseinstellungen auch 
schrauben.

Ich stelle mir das idealerweise so vor:
1. Eine lokale Seite als Startseite in FF, mit einem JS Event-Listener
2. Skript startet einen Websocket Server auf Port 12345
3. Skript triggert FF zB mit Parameter 12345
4. FF verbindet an 127.0.0.1:12345
5. Skript liefert alles weitere per WS
6. Skript endet und schliesst Port 12345
7. JS Listener idlet und wartet auf den nächsten Event

Mit Ausnahme von 3 bekomme ich alles hin denke ich; nur fehlt mir da die 
entscheidende Idee. Irgendwelche externe Dienste möchte ich vermeiden, 
da es sich teilweise um private Daten handelt und sowas will ich nicht 
in's Netz pusten.

Idealerweise würde ich einen Websocket Server schreiben und den als 
Dienst laufen lassen, aber das wird leider nicht erlaubt. In meinem 
Benutzerkonto darf ich aber alles machen. Die lokale Startseite soll 
dann als eine Art Dashboard funktionieren wo dann mehrere Skripte Infos 
abliefern. Den Port-Parameter braucht es weil evtl zwei Skripte 
gleichzeitig laufen und dann jedes seinen eigenen WS Server aufmacht.
Gast #5947710
Lesenswert?

Du brauchst irgend eine shared ressource, mit der du die Notifikation 
durchführen kannst. Bei lokalen Seiten mit file:// url fallen service 
worker ja schonmal flach, null origin ist bei solchem kram immer 
schwierig. Eventuell mit localStorage?

a.html
1
<script>
2
function sendMessage(key, message){
3
  localStorage.setItem(key, Math.random().toFixed(8).substr(2) + JSON.stringify(message||null));
4
}
5
if(!location.hash){
6
  window.addEventListener('storage', function(event){
7
    top.postMessage({
8
      what: 'storage',
9
      key: event.key,
10
      value: JSON.parse(event.newValue.substr(8))
11
    },"*");
12
  });
13
}else{
14
  console.log(location.hash.substr(1).split(':',2), location.hash)
15
  sendMessage(...location.hash.substr(1).split(':',2));
16
  window.close();
17
}
18
</script>

b.html
1
<script>
2
function receiveMessage(event) {
3
  console.log(event.data);
4
}
5
addEventListener("message", receiveMessage, false);
6
</script>
7
<iframe src="a.html" style="display:none;"></iframe>

Öffne in b.html die console, danach in nem anderen Fenster a.html und 
füge #bla:test bei der URL hinten dran (seite neu laden, hash change ist 
kein reload...). Console sollte sowas liefern:
1
Object { what: "storage", key: "bla", value: "test" }

Dann musst du nur noch herausfinden, wie du die Seite im Hintergrund aus 
deinem Script starten und stoppen kannst, und fertig.
Gast #5947987
Lesenswert?

Also erst mal vielen Dank für Deine Bemühungen!

Aber bedeutet das nicht, daß a und b innerhalb von Firefox laufen, also 
in zwei Tabs? Oder kann ich auch von außen auf localStorage zugreifen?

Vielleicht war ja der von mir verwendete Begriff Skript etwas 
verwirrend. Ich meinte damit ein Programm außerhalb von Firefox, also zB 
in Python, Perl oder sowas, was von der Kommandozeile oder via 
Taskplaner gestartet wird.

Eine eine URL wie zB a.html#bla:test zuzugreifen wäre ja kein Problem, 
bloß wird damit doch nicht das Javascript ausgeführt. Das Programm 
bekommt nur den HTML Source und nichts weiter. Selbst wenn das Programm 
JS interpretieren würde, wäre es außerhalb von Firefox.
Gast #5948009
Lesenswert?

Eventuell suchst du etwas wie das Selenium Framework - 
Browserfernsteuerung.
Da gibts diverse bindings zu verschiedenen Sprachen, Java zum beispiel. 
Ob eine deiner Scriptprachen dabei ist weiss ich nicht.
Gast #5948042
Lesenswert?

Ich dachte man könnte eventuell die a.html headless öffnen:
1
firefox.exe -headless "file:///C:/Users/abre2/Desktop/a.html#test:123"

Aber offenbar geht headless und browser modus nicht gleichzeitig im 
gleichen Profil...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren