Как зарегистрировать обработчик протокола URL в Node.js

Я разрабатываю модуль командной строки node и хотел бы иметь возможность запускать его через ссылки на веб-сайте.

Я хочу зарегистрировать собственный протокол my-module:// таким образом, чтобы ссылки имели следующий формат: my-module://action:some-action, и нажатие на них запустило бы пакет node.

Если для этого нет API node (я уверен, что этого не будет), то есть ли способ сделать это из node путем вызова системных команд?

Он должен работать на Windows, Linux и MacOS.

Ответ 1

Его интересная идея. Я не думаю, что в настоящее время существует решение для платформы node.js. Я встретил эту тему людей, просящих одно и то же:

https://github.com/rogerwang/node-webkit/issues/951

Теперь Electron поддерживает его с помощью app.setAsDefaultProtocolClient API (начиная с v0.37.4) для macOS и Windows.

Было бы ужасно сложно написать библиотеку, чтобы сделать это.

для 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"

Затем, когда ваше приложение запускается окнами, вы должны иметь возможность видеть аргументы в process.argv[]. Убедитесь, что вы запускаете оболочку для запуска node, а не только ваше приложение напрямую.

Оригинальная статья MSDN

Обратите внимание, что для этого требуются привилегии администратора и устанавливает обработчик в системном масштабе. Чтобы сделать это на пользователя, вы можете использовать HKEY_CURRENT_USER\Software\Classes вместо этого, поскольку реализация Electron делает это.

Apple:

Процитированная статья "OS X" в комментарии github фактически предназначена для iOS. Я бы посмотрел следующее руководство по программированию для информации о регистрации приложения для обработки схемы URL:

Документация Apple Dev

Итак, вам нужно создать службу запуска и заполнить файл .plist с помощью CFBundleURLTypes, это поле будет массивом и должно быть заполнено только именем протокола i.e. http

Следующий вопрос о суперпользователе имеет лучшее решение, но для каждого пользователя.

"Файл, который вы ищете, это ~/Library/Preferences/com.apple.LaunchServices.plist.

Он содержит массив, называемый LSHandlers, а дети Dictionary, которые определяют LSHandlerURLScheme, могут быть соответствующим образом изменены с помощью LSHandlerRole. "

Linux:

Из того, что я могу сказать, есть несколько способов сделать это в Linux (сюрприз?)

В Gnome есть инструмент, который позволит вам зарегистрировать обработчик URL w3-архивы

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 с различной схемой: применение/х-XDG-от протокола Приложения, поддерживающие определенный протокол URI, могут добавить поддельный тип mime к своему типу MimeType в своих файлах ввода рабочего стола. Таким образом, легко найти все приложения, установленные в системе, поддерживающей схему URI, просмотрев файл mimeinfo.cache. Снова файл defaults.list может быть использован для указания программы по умолчанию для специализированного типа URI. wiki.lxde.org

KDE также поддерживает собственный метод обработки обработчиков URL-адресов:

Создайте файл: $KDEDIR/share/services/your.protocol и заполните его соответствующими данными:

[Protocol]
exec=/path/to/player "%u"
protocol=lastfm
input=none
output=none
helper=true
listing=
reading=false
writing=false
makedir=false
deleting=false

из last.fm форумы всех мест

Надеюсь, что это поможет.

Ответ 2

Вот как я это сделал в 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 именем вашего приложения.

    Сохраните script как пакет приложений в любом месте

  • Перейдите к script, щелкните правой кнопкой мыши, затем "Покажите содержимое пакета", затем отредактируйте 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, и увидеть, как ваше приложение открывается!

Ответ 3

Прежде всего, создание собственного протокола сумасшедшее, не делайте этого.

Кажется, все, что вы хотите сделать, это запустить пакет node из веб-браузера. Обычный способ запуска внешней программы из веб-браузера - написать плагин для браузера.

Вот как pdf, торренты, iTunes запускаются из вашего браузера.

Итак, чтобы сделать то, что вы хотите, вам придется написать плагин и установить, чтобы ваши пользователи были установлены. Я бы сказал, что не очень хорошая идея.