Forum: PC-Programmierung Event in Firefox extern auslösen


von Daffy (Gast)


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.

von DPA (Gast)


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.

von Daffy (Gast)


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.

von c.m. (Gast)


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.

von DPA (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.