Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Eigen applicatie openen vanuit browser userscript

Pagina: 1
Acties:

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
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?

Mijn iRacing profiel


  • supreme tweaker
  • Registratie: December 2002
  • Laatst online: 28-08 01:27
Een HTTP server integreren in je applicatie en daar de data naar toe posten? Dat kan inderdaad in de vorm van een webservice of iets dergelijks. In de meeste programmeertalen is dit met een library/framework of met wat triviale code te implementeren

Burp


  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 21-11 16:30
Firefox heeft TCPSocket en TCPServer objecten, maar weet niet of die te exposen zijn naar plugins.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NickThissen schreef op dinsdag 24 juni 2014 @ 12:03:
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).
Dat is heel gebruikelijk, en werkt bij de meeste applicaties zo. Wat je dus moet doen is bij het opstarten je eigen applicatie laten controleren of er al een instantie draait, en zoja de juiste informatie doorgeven en weer afsluiten.

Je probleem met Chrome lijkt alleen voor te komen als je zelf de uri in je adress bar typt, maar niet als je het via Javascript of een link doet: http://stackoverflow.com/...scheme-with-google-chrome

[ Voor 13% gewijzigd door Woy op 25-06-2014 12:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Siebsel
  • Registratie: November 2004
  • Laatst online: 21-11 15:53
Hoe ik zoiets onlangs afgevangen heb:

Vanuit onze webapplicatie wou ik on-the-fly labels kunnen printen via onze zelfgeschreven software. Probleem: die web-app draait extern, dus directe communicatie wordt al heel lastig (zelfde probleem als jij hebt).

Nu heb ik de software, welke verantwoordelijk is voor het afdrukken van de verschillende soorten labels, voorzien van een websocket-server (via deze package). In de webapp check ik nu of er een websocket connectie opgezet kan worden met ws://localhost:8801 en zo ja, activeer ik specifieke linkjes/functies in de webapp die vervolgens heel simpel websocket "messages" stuurt naar de label software. Deze kan die commandos weer interpreteren en vervolgens verwerken. Uiteraard heb je de volledige mogelijkheden van websockets ter beschikking en indien gewenst zou je zelfs nog met certificaten etc. kunnen werken.

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
supreme tweaker schreef op woensdag 25 juni 2014 @ 12:17:
Een HTTP server integreren in je applicatie en daar de data naar toe posten? Dat kan inderdaad in de vorm van een webservice of iets dergelijks. In de meeste programmeertalen is dit met een library/framework of met wat triviale code te implementeren
Ik heb dit uiteindelijk ook zo opgelost, chrome heeft wel ondersteuning voor sockets vanuit plugins, maar dit werkte toen niet of heel instabiel.

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 08:35
Voor mijn begrip ben ik nog wel benieuwd naar wat je met de attachments wilt doen? Wat doet "jouw applicatie" met de attachments? Worden ze gewoon verzameld en moet dit per se een desktop-applicatie zijn?

Je kan natuurlijk vrij makkelijk een GreaseMonkey script maken die alle attachment-urls in een json zet en naar een web service stuurt die dan alle info verzameld en op een mooie website overzichtelijk neerzet. Alle talen/frameworks hebben wel mooie libraries om makkelijk inhoud van een html pagina te parsen. Daar heb je geen lokale applicatie voor nodig.

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Bedankt voor de reacties, ik zal eens op zoek gaan naar wat jullie aanraden.
Ramon schreef op vrijdag 27 juni 2014 @ 10:32:
Voor mijn begrip ben ik nog wel benieuwd naar wat je met de attachments wilt doen? Wat doet "jouw applicatie" met de attachments? Worden ze gewoon verzameld en moet dit per se een desktop-applicatie zijn?

Je kan natuurlijk vrij makkelijk een GreaseMonkey script maken die alle attachment-urls in een json zet en naar een web service stuurt die dan alle info verzameld en op een mooie website overzichtelijk neerzet. Alle talen/frameworks hebben wel mooie libraries om makkelijk inhoud van een html pagina te parsen. Daar heb je geen lokale applicatie voor nodig.
Er is user interactie nodig nadat de attachment opgehaald is, en dat is niet iets wat ik in een chrome extension of zelfs een website kan stoppen.

Lang verhaal kort: de attachments zijn afstellingen van race auto's voor een race simulator. Mensen delen hun eigen afstellingen op een forum maar het is gewoon vervelend voor de eindgebruiker om al die forums voor alle auto's af te zoeken dus heb ik al een tijd een database waar deze afstellingen verzameld worden.

Nu heb ik een applicatie (draait al een tijdje) die een aantal uitgekozen gebruikers kunnen gebruiken om de attachments op te sporen en verder af te handelen. Zodra ze er een vinden wordt de attachment geupload naar mijn database, maar ze moeten ook een aantal eigenschappen zelf invullen die mijn applicatie niet uit de attachment / post kan lezen (welke racebaan het is, voor welk race seizoen, etc). Vandaar user interactie nodig. Daarnaast doet de applicatie nog veel meer wat allemaal niet belangrijk is, maar het is dus niet mogelijk om alles af te handelen in een userscript of zelfs een website; de client applicatie is helaas nodig.

Mijn doel hier is om het 'zoeken naar attachments' makkelijker te maken, momenteel zit er een simpele browser ingebouwd in mijn applicatie die de gebruikers nodig hebben, dat is omslachtig, liefst kunnen ze gewoon met hun eigen browser de forums op (zoals ze toch al dagelijks doen) en als ze toevallig een attachment tegenkomen kan hij gelijk naar de applicatie gestuurd worden.

Mijn iRacing profiel


  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 08:35
Klinkt als een nodeloos complexe workflow.

In een ideale situatie moet je gewoon de mensen die de afstellingen uploaden overtuigen om dat niet als attachment op een forum te te doen, maar op een website die jij hebt gemaakt. Dat scheelt volgens mij iedereen gedoe ;) Ik neem dan aan dat jouw database al een website is die ergens gehost wordt?

Een stapje verder zou zijn dat je een extension voor Firefox/Chrome maakt waarmee iemand die attachments direct kan uploaden naar (wederom) jouw website. Bij wijze van spreken right click op een attachment en dan "upload to db" en dan een dialoog waar extra info wordt gevraagd alvorens de attachment te uploaden. Zal niet al te ingewikkeld zijn denk ik.

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Probleem is dat er 40.000 gebruikers zijn. Als ik er daar 400 van kan overtuigen dat te doen ben ik blij. Dus ik krijg never nooit alle afstellingen op die manier, omdat ik afhankelijk ben van de bereidheid van anderen om hun bestanden te uploaden. We mogen al van geluk spreken dat er mensen bereid zijn die afstellingen te delen, dus ik vraag liever niet om ze nog meer moeite te doen dan dat.

Op mijn nieuwe manier zoek ik een aantal mensen waarvan ik weet dat ze bereid zijn dit te doen (omdat ze momenteel ook al alle bestanden zitten op te zoeken alleen dan geheel handmatig wat enorm veel werk is) en maak ik hun werk een stuk makkelijker. Als bonus krijg ik automatisch alle bestanden in mijn database.

Mijn iRacing profiel


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Siebsel schreef op woensdag 25 juni 2014 @ 17:14:
Hoe ik zoiets onlangs afgevangen heb:

Vanuit onze webapplicatie wou ik on-the-fly labels kunnen printen via onze zelfgeschreven software. Probleem: die web-app draait extern, dus directe communicatie wordt al heel lastig (zelfde probleem als jij hebt).

Nu heb ik de software, welke verantwoordelijk is voor het afdrukken van de verschillende soorten labels, voorzien van een websocket-server (via deze package). In de webapp check ik nu of er een websocket connectie opgezet kan worden met ws://localhost:8801 en zo ja, activeer ik specifieke linkjes/functies in de webapp die vervolgens heel simpel websocket "messages" stuurt naar de label software. Deze kan die commandos weer interpreteren en vervolgens verwerken. Uiteraard heb je de volledige mogelijkheden van websockets ter beschikking en indien gewenst zou je zelfs nog met certificaten etc. kunnen werken.
Bedankt, ik heb uiteindelijk deze manier gebruikt, en het werkt inderdaad erg makkelijk!

Mijn iRacing profiel

Pagina: 1