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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.