我正在开发命令行节点模块,并希望能够通过网站上的链接启动它。如何在Node.js中注册url协议处理程序
我想注册一个自定义协议my-module://
,这样链接将具有以下格式:my-module://action:some-action
并点击它们将启动节点包。
如果没有为此的节点API(我敢肯定不会有),那么有没有办法通过调用系统命令从节点执行?
它必须在Windows,Linux和MacOS上运行。
我正在开发命令行节点模块,并希望能够通过网站上的链接启动它。如何在Node.js中注册url协议处理程序
我想注册一个自定义协议my-module://
,这样链接将具有以下格式:my-module://action:some-action
并点击它们将启动节点包。
如果没有为此的节点API(我敢肯定不会有),那么有没有办法通过调用系统命令从节点执行?
它必须在Windows,Linux和MacOS上运行。
它是一个有趣的想法。我不认为目前有一个跨平台的node.js解决方案。我也碰到过这个线程的人问同样的事情:
https://github.com/rogerwang/node-webkit/issues/951
电子现在用app.setAsDefaultProtocolClient
API(since v0.37.4)适用于MacOS和Windows支持它。
要编写库来做到这一点并不难。
的Windows:
在窗户边你必须注册应用程序作为处理该URI方案的应用。
您需要为您的应用程序的注册表项:
HKEY_CLASSES_ROOT alert (Default) = "URL:Alert Protocol" URL Protocol = "" DefaultIcon (Default) = "alert.exe,1" shell open command (Default) = "C:\Program Files\Alert\alert.exe" "%1"
然后,当你的应用程序是由Windows上运行,你应该能够看到process.argv[]
的参数。确保你启动一个shell来运行节点,而不是直接运行你的应用程序。
注意这需要管理员权限,并设置处理系统范围。要为每个用户执行此操作,您可以使用HKEY_CURRENT_USER\Software\Classes
代替Electron的实施does it。
苹果:在GitHub的评论
所引用的 “OS X” 的文章实际上是为iOS。我想看看下面的节目指南信息上注册应用程序来处理URL方案:
总之,你需要创建一个启动服务,并与CFBundleURLTypes
填充的.plist文件,这个字段是一个数组,应该只填写协议名称,即http
以下Super User Question有一个更好的解决方案,但是是一个用户设置。
“你所寻求的文件是〜/库/首选项/ com.apple.LaunchServices.plist。
它拥有一个数组叫LSHandlers和定义的LSHandlerURLScheme字典的孩子可以用LSHandlerRole相应修改“。
的Linux:(?惊讶)
据我所知,有几种方法可以在Linux中实现这个
侏儒有一个工具,可以让你注册一个URL处理器w3 archives
gconftool-2 -t string -s /desktop/gnome/url-handlers/tel/command "bin/vonage-call %s"
gconftool-2 -s /desktop/gnome/url-handlers/tel/needs_terminal false -t bool
gconftool-2 -t bool -s /desktop/gnome/url-handlers/tel/enabled true
一些较轻的权重管理器看起来像允许您创建假的MIME类型并将它们注册为URI协议处理程序。
“假MIME类型都与这样的各种方案的URI创建: 应用程序/ x-XDG-协议 - 应用支持特定URI协议可以在他们的桌面项文件中的假MIME类型添加到他们的MimeType键。因此,通过查看mimeinfo.cache文件,可以很容易地找出系统上安装的所有支持URI方案的应用程序。再次,defaults.list文件可用于指定默认程序,以指定URI类型。 wiki.lxde.org
KDE也支持自己处理URL协议处理程序方法:
创建一个文件:$KDEDIR/share/services/your.protocol
和相关数据来填充它:从所有地方的last.fm forums
希望
[Protocol] exec=/path/to/player "%u" protocol=lastfm input=none output=none helper=true listing= reading=false writing=false makedir=false deleting=false
这有助于。
好的,这似乎回答了MacOS和Windows部件。如果您可以提供有关Linux的更多信息,包括如何在使用更轻桌面环境的系统上工作,例如Linux上的XFCE和LXDE;我会奖励赏金。 (另外,这主要是基于链路,因此,请在链接腐烂的情况下引用这些资源。) – FakeRainBrigand
从研究,它看起来像Windows可能处理这个是最好的,在Mac方面,它应该不会太困难。在Linux方面,如果你知道最终用户将使用什么,你应该能够找到一个幸福的中位数,并且可能会运行一个有效的系统。这将是一个非常棒的npm模块,如果你最终创造了一些东西,那么请关注它,我很乐意看到它!我甚至愿意为编码和测试而努力。 – jeremy
太棒了!这有很大帮助。我想我会把所有这些都包含在一个节点模块中,当它完成时我会在这里再次发表评论。不过,我暂时无法做到这一点。 – FakeRainBrigand
首先创建自己的协议是疯狂的,不要这样做。
看来你想要做的就是能够从网络浏览器启动你的节点包。 从网络浏览器启动外部程序的正常方式是编写一个浏览器插件。
这是pdf,torrents,iTunes从浏览器启动的方式。
因此,总而言之,要做你想做的事情,你将不得不编写一个插件并让用户安装。不是特别的,我会说。
我不同意,一个浏览器插件最好的办法是,它必须是一个本地扩展,而不是一个普通的扩展。 iTunes使用协议,而不是插件(itms://),github,spotify等也是如此。虽然注册协议处理程序可能相当困难,但它肯定不是不可能的,编写浏览器插件会更困难(你需要为每个平台单独一个)。 –
这里是我是如何做到在Mac OS与应用NW.js:
打开应用/Applications/Utilities/Script Editor
型编辑器
on open location this_URL
do shell script "/Applications/X.app/Contents/MacOS/x '" & this_URL & "'"
end open location
更换X下面的代码由您的应用程序的名称。
保存脚本作为应用程序捆绑随时随地
转到脚本,请右键单击,然后“显示包内容”然后编辑Contents/info.plist
在文件的最后添加这些行,就在</dict></plist>
:
<key>CFBundleIdentifier</key>
<string>com.mycompany.AppleScript.AppName</string> <!-- edit here -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>AppName</string> <!-- edit here -->
<key>CFBundleURLSchemes</key>
<array>
<string>myurlscheme</string> <!-- your url scheme here -->
</array>
</dict>
</array>
现在你可以打开一个链接从myurlscheme开始:并看到您的应用程序正在启用!
所以你让一个应用程序打开另一个应用程序? 为什么不把这些info.plist文件放在你想打开的应用程序的info.plist中?由于某种原因,这不起作用吗? – Houseman
这不会是一个节点的API,这将是一个浏览器设置。 – hexacyanide
@hexacyanide地址协议是由OS不是浏览器处理,我已经成功地实现了它的Windows(你必须添加一些注册表项),但想知道是否有一个跨平台的API节点,而不是单独实现每个平台。 –
这似乎是不一致的,因为协议处理程序可以通过设置在Chrome和Firefox中添加。 – hexacyanide