Ik wil graag een userscript schrijven (dat via TamperMonkey in chrome, of via GreaseMonkey in firefox gedraaid wordt) dat kan communiceren met een applicatie (die ik zelf geschreven heb) op de client computer.
Om een lang verhaal kort te houden: het userscript zou tijdens het browsen van een bepaald forum de attachments in een forum thread opsporen, en als er relevante attachments gevonden worden dan wordt de post waar ze bij horen geparsed voor relevante informatie. Die informatie (en de link naar de attachment) wil ik graag doorsturen naar mijn applicatie, zodat deze alles verder af kan handelen.
Ik vraag me af wat mijn opties zijn in dit geval. Ik begrijp dat javascript niet zomaar een client applicatie kan opstarten voor veiligheidsredenen, maar ik kan me wellicht wel wat opties bedenken. Probleem is dat ik met elk van die optie weinig tot geen ervaring heb en ik kan dus niet inschatten wat het makkelijkst / beste is.
Een aantal ideetjes die ik had:
Custom URI scheme
Ik weet niet zo goed hoe dit heet, maar het is blijkbaar mogelijk om een eigen uri scheme te registreren (met een registry entry) zodat het nagiveren naar een bepaalde URL een applicatie opent. Bijvoorbeeld steam kan dit met een "steam://....." link, veel torrent applicaties kunnen rechtstreeks torrent links openen (met "magnet:// ..." geloof ik), etc.
Ik heb kort uitgezocht hoe dit werkt, en ik heb bijvoorbeeld een scheme met "myapp" geregistreerd, die een test applicatie opent welke de command line arguments laat zien. Zo kan ik nu navigeren naar "myapp:test" en opent mijn applicatie met 'test' als command line.
Dit zou een optie zijn, mijn userscript zou dit soort links in een nieuwe tab kunnen "openen" en de relevante informatie via de command line doorsturen. Maar er zijn twee problemen: voor zover ik kan zien wordt er altijd een nieuwe instantie van de applicatie geopend. Volgens mij is er geen manier om informatie door te geven aan een applicatie die al draait. Dit is niet echt wat ik wil, ik kan er vast wel een workaround voor vinden maar liefst wil ik direct communiceren met een applicatie die al draait (en eventueel de applicatie de eerste keer openen als deze nog niet draait, maar dat is optioneel).
Het tweede probleem is dat het niet lijkt te werken in Chrome, hij gaat zoeken naar "myapp:test" in plaats van mijn applicatie te openen. In IE en Firefox werkt het wel. Misschien ligt het aan mijn chrome installatie, maar ook dit is niet ideaal aangezien veel gebruikers chrome hebben.
Communiceren via een webservice
Misschien ga ik nu wel veel te lastig denken, maar het zou in theorie mogelijk zijn om mijn userscript de informatie door te laten sturen naar een webservice (gewoon via een ajax call). Deze webservice zou de informatie in een database kunnen gooien. Mijn client applicatie kan om de zoveel tijd de webservice benaderen om te kijken of er nieuwe data gevonden is, en zo ja deze data downloaden en er verder mee werken. Dit lijkt echter heel erg omslachtig en bovendien zal mijn applicatie op deze manier erg vaak moeten pollen terwijl er bijna nooit nieuwe informatie zal zijn. Ik kan de applicatie niet een keer per uur oid laten pollen, dat is te langzaam want de gebruiker wil wel vrijwel meteen verder werken met de data die hij krijgt als hij een attachment gevonden heeft. Als hij toevallig een attachment tegenkomt en 10 minuten later ineens mijn applicatie begint te miepen is hij alweer vergeten waar het over ging, dit moet dus binnen een seconde of 10 gebeuren.
Er zal echter bijna nooit nieuwe informatie beschikbaar zijn (10 keer per week?), dus zal mijn webservice constant belast worden voor niks.
Ik bedenk me nu echter dat ik in principe ook een lokale 'web'service kan starten, waarmee deze problemen niet echt relevant zijn?
Rechtstreeks communiceren via sockets oid?
Laatste optie die ik zie lijkt ook over the top en misschien niet eens mogelijk, maar misschien kan mijn userscript de data naar een socket / tcp verbinding ofzo sturen, waar mijn applicatie naar luistert. Geen idee hoe ik dit zou moeten implementeren.
Nou ja, dit zijn zo'n beetje de opties die ik kan bedenken. Waarschijnlijk zie ik veel meer logische opties over het hoofd
Als iemand een beter idee heeft dan hoor ik het graag.
TL;DR:
Ik heb een userscript dat constant paginas in een forum parsed en af en toe relevante informatie vindt. Zodra dat gebeurd wil ik die informatie doorsturen naar een client applicatie (die mogelijk al open is) welke er dan mee verder werkt. Wat zijn m'n opties?
Om een lang verhaal kort te houden: het userscript zou tijdens het browsen van een bepaald forum de attachments in een forum thread opsporen, en als er relevante attachments gevonden worden dan wordt de post waar ze bij horen geparsed voor relevante informatie. Die informatie (en de link naar de attachment) wil ik graag doorsturen naar mijn applicatie, zodat deze alles verder af kan handelen.
Ik vraag me af wat mijn opties zijn in dit geval. Ik begrijp dat javascript niet zomaar een client applicatie kan opstarten voor veiligheidsredenen, maar ik kan me wellicht wel wat opties bedenken. Probleem is dat ik met elk van die optie weinig tot geen ervaring heb en ik kan dus niet inschatten wat het makkelijkst / beste is.
Een aantal ideetjes die ik had:
Custom URI scheme
Ik weet niet zo goed hoe dit heet, maar het is blijkbaar mogelijk om een eigen uri scheme te registreren (met een registry entry) zodat het nagiveren naar een bepaalde URL een applicatie opent. Bijvoorbeeld steam kan dit met een "steam://....." link, veel torrent applicaties kunnen rechtstreeks torrent links openen (met "magnet:// ..." geloof ik), etc.
Ik heb kort uitgezocht hoe dit werkt, en ik heb bijvoorbeeld een scheme met "myapp" geregistreerd, die een test applicatie opent welke de command line arguments laat zien. Zo kan ik nu navigeren naar "myapp:test" en opent mijn applicatie met 'test' als command line.
Dit zou een optie zijn, mijn userscript zou dit soort links in een nieuwe tab kunnen "openen" en de relevante informatie via de command line doorsturen. Maar er zijn twee problemen: voor zover ik kan zien wordt er altijd een nieuwe instantie van de applicatie geopend. Volgens mij is er geen manier om informatie door te geven aan een applicatie die al draait. Dit is niet echt wat ik wil, ik kan er vast wel een workaround voor vinden maar liefst wil ik direct communiceren met een applicatie die al draait (en eventueel de applicatie de eerste keer openen als deze nog niet draait, maar dat is optioneel).
Het tweede probleem is dat het niet lijkt te werken in Chrome, hij gaat zoeken naar "myapp:test" in plaats van mijn applicatie te openen. In IE en Firefox werkt het wel. Misschien ligt het aan mijn chrome installatie, maar ook dit is niet ideaal aangezien veel gebruikers chrome hebben.
Communiceren via een webservice
Misschien ga ik nu wel veel te lastig denken, maar het zou in theorie mogelijk zijn om mijn userscript de informatie door te laten sturen naar een webservice (gewoon via een ajax call). Deze webservice zou de informatie in een database kunnen gooien. Mijn client applicatie kan om de zoveel tijd de webservice benaderen om te kijken of er nieuwe data gevonden is, en zo ja deze data downloaden en er verder mee werken. Dit lijkt echter heel erg omslachtig en bovendien zal mijn applicatie op deze manier erg vaak moeten pollen terwijl er bijna nooit nieuwe informatie zal zijn. Ik kan de applicatie niet een keer per uur oid laten pollen, dat is te langzaam want de gebruiker wil wel vrijwel meteen verder werken met de data die hij krijgt als hij een attachment gevonden heeft. Als hij toevallig een attachment tegenkomt en 10 minuten later ineens mijn applicatie begint te miepen is hij alweer vergeten waar het over ging, dit moet dus binnen een seconde of 10 gebeuren.
Er zal echter bijna nooit nieuwe informatie beschikbaar zijn (10 keer per week?), dus zal mijn webservice constant belast worden voor niks.
Ik bedenk me nu echter dat ik in principe ook een lokale 'web'service kan starten, waarmee deze problemen niet echt relevant zijn?
Rechtstreeks communiceren via sockets oid?
Laatste optie die ik zie lijkt ook over the top en misschien niet eens mogelijk, maar misschien kan mijn userscript de data naar een socket / tcp verbinding ofzo sturen, waar mijn applicatie naar luistert. Geen idee hoe ik dit zou moeten implementeren.
Nou ja, dit zijn zo'n beetje de opties die ik kan bedenken. Waarschijnlijk zie ik veel meer logische opties over het hoofd
TL;DR:
Ik heb een userscript dat constant paginas in een forum parsed en af en toe relevante informatie vindt. Zodra dat gebeurd wil ik die informatie doorsturen naar een client applicatie (die mogelijk al open is) welke er dan mee verder werkt. Wat zijn m'n opties?