Пользовательский обработчик протокола в хроме

88

Как мне настроить собственный обработчик протокола в Chrome? Что-то типа:

myprotocol: // тестовый файл

Мне это нужно, чтобы отправить запрос на http://example.com?query=testfile , а затем отправить httpresponse на мое расширение.

Тестовый тестер
источник
Я не думаю, что Chrome в настоящее время поддерживает это, у него довольно ограниченный набор API, доступных для расширений.
Владимир Палант

Ответы:

77

Следующий метод регистрирует приложение в схеме URI. Итак, вы можете использовать mycustproto: в своем HTML-коде для запуска локального приложения. Он работает на Google Chrome версии 51.0.2704.79 м (64-бит).

Я в основном использовал этот метод для печати документа без вывода сообщений о печати. Результат довольно хороший и представляет собой простое решение для интеграции внешнего приложения с браузером.

HTML-код (простой):

<a href="mycustproto:Hello World">Click Me</a>

HTML-код (альтернатива):

<input id="DealerName" />
<button id="PrintBtn"></button>

$('#PrintBtn').on('click', function(event){
  event.preventDefault();
  window.location.href = 'mycustproto:dealer ' + $('#DealerName').val();
});

Схема URI будет выглядеть так:

Вы можете создать схему URI вручную в реестре или запустить файл «mycustproto.reg» (см. Ниже).

HKEY_CURRENT_USER\Software\Classes
   mycustproto
      (Default) = "URL:MyCustProto Protocol"
      URL Protocol = ""
      DefaultIcon
         (Default) = "myprogram.exe,1"
      shell
         open
            command
               (Default) = "C:\Program Files\MyProgram\myprogram.exe" "%1"

Пример mycustproto.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\mycustproto]
"URL Protocol"="\"\""
@="\"URL:MyCustProto Protocol\""

[HKEY_CURRENT_USER\Software\Classes\mycustproto\DefaultIcon]
@="\"mycustproto.exe,1\""

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell]

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell\open]

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell\open\command]
@="\"C:\\Program Files\\MyProgram\\myprogram.exe\" \"%1\""

Консольное приложение C # - myprogram.exe:

using System;
using System.Collections.Generic;
using System.Text;

namespace myprogram
{
  class Program
  {
    static string ProcessInput(string s)
    {
       // TODO Verify and validate the input 
       // string as appropriate for your application.
       return s;
    }

    static void Main(string[] args)
    {
      Console.WriteLine("Raw command-line: \n\t" + Environment.CommandLine);
      Console.WriteLine("\n\nArguments:\n");

      foreach (string s in args)
      {
        Console.WriteLine("\t" + ProcessInput(s));
      }

      Console.WriteLine("\nPress any key to continue...");
      Console.ReadKey();
    }
  }
}

Попробуйте сначала запустить программу, чтобы убедиться, что программа находится по правильному пути:

cmd> "C:\Program Files\MyProgram\myprogram.exe" "mycustproto:Hello World"

Щелкните ссылку на своей HTML-странице:

Вы впервые увидите всплывающее окно с предупреждением.

введите описание изображения здесь

Чтобы сбросить настройку внешнего обработчика протокола в Chrome:

Если вы когда-либо принимали собственный протокол в Chrome и хотели бы сбросить настройки, сделайте это (в настоящее время в Chrome нет пользовательского интерфейса для изменения настройки):

Отредактируйте этот файл " Local State " по этому пути:

C:\Users\Username\AppData\Local\Google\Chrome\User Data\

или просто перейдите по ссылке:

%USERPROFILE%\AppData\Local\Google\Chrome\User Data\

Затем найдите эту строку: protocol_handler

Оттуда вы увидите пользовательский протокол.

Примечание. Закройте Google Chrome перед редактированием файла. В противном случае внесенное вами изменение будет перезаписано Chrome.

Справка:

https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx

Цзюнь Се
источник
это выглядит многообещающим, могу ли я использовать этот подход для печати с планшета. если это так , как иметь дело с реестром и т.д. , в этом случае
Venkat
1
@Venkat Я думаю, что лучше сначала указать имя планшета и операционную систему (например, Surface, iPad и т. Д.) И посмотреть, делали ли это другие раньше. Я опубликовал решение для Windows. Я видел похожие настройки для OS X и Linux. Однако у меня не было этого устройства / среды для экспериментов. Вы можете сначала попробовать его в Windows, чтобы получить общее представление о том, как он работает. Я надеюсь, это поможет.
Цзюнь Се
3
Для записи, я Preferences%localappdata%\Google\Chrome\User Data\Default
обнаружил
Невозможно вызвать несколько протоколов один за другим в одном вызове javascript в Chrome.
Прем
Что делать, если мой ключ не найден в реестре? Из браузера прошу вызвать приложение по ключу? здесь, как я могу сообщить пользователю, что ключ не найден в реестре?
Ахил Наир
55

Chrome 13 теперь поддерживает navigator.registerProtocolHandlerAPI. Например,

navigator.registerProtocolHandler(
    'web+custom', 'http://example.com/rph?q=%s', 'My App');

Обратите внимание, что имя вашего протокола должно начинаться с web+, за некоторыми исключениями для общих (например mailto, и т. Д.). Для получения дополнительной информации см. Http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler.

Борис Смус
источник
6
+1 за тот факт, что протоколы должны начинаться с web +, чтобы избежать "SECURITY_ERR: DOM Exception 18"
Catch22,
3
Как тогда torrent:и steam:ссылки работают? Есть ли это ограничение в пакетных приложениях Chrome?
Стивен Руз
1
@StevenRoose Насколько я могу судить, Chrome передает их ОС. Даже при использовании chrome.webNavigationAPI tel:ссылки никогда не передаются.
PixnBits 04
Кажется, это не работает внутри приложения Chrome и, похоже, не может перенаправить протокол внутри приложения. Намного лучший ответ - это ответ Гордона Уильямса ниже.
Карел Билек
30

Этот вопрос сейчас старый, но недавно было обновление Chrome (по крайней мере, когда речь идет о пакетных приложениях) ...

http://developer.chrome.com/apps/manifest/url_handlers

а также

https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/url-handler

Он позволяет вам зарегистрировать обработчик URL-адреса (если он принадлежит вам). К сожалению, нет, myprotocol://но, по крайней мере, вы можете сделать http://myprotocol.mysite.comи можете создать там веб-страницу, которая будет указывать людям на приложение в магазине приложений.

Гордон Уильямс
источник
Большое спасибо за этот ответ! В отличие от ответа, получившего наибольшее количество голосов, он фактически отвечает на вопрос!
Карел Билек
10

Вот как я это сделал. Ваше приложение должно будет установить несколько ключей reg при установке, затем в любом браузере вы можете просто указать ссылку на foo: \ somethingHere.txt, и оно откроет ваше приложение и передаст ему это значение.

Это не мой код, это просто то, что я нашел в Интернете при поиске того же вопроса. Просто замените все «foo» в тексте ниже на имя протокола, которое вы хотите, и также измените путь к вашему exe.

(поместите это в текстовый файл как файл foo.reg на рабочем столе, затем дважды щелкните его, чтобы установить ключи) ----- Эта строка переходит в файл .reg (НЕ включая эту строку) --- ---

REGEDIT4

[HKEY_CLASSES_ROOT\foo]
@="URL:foo Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\foo\shell]

[HKEY_CLASSES_ROOT\foo\shell\open]

[HKEY_CLASSES_ROOT\foo\shell\open\command]
@="\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\" \"%1\"" 
Маффинмен
источник
5
Это не работает в Chrome, это был конкретный вопрос.
Кьетил Ватнедал
1
@KjetilWatnedal: он отлично работает в Chrome (по крайней мере, в версии 40+) и с этим решением. Что касается первоначального вопроса, OP хотел, чтобы браузер отправлял что-то на сайт автоматически, по-видимому, без приложения локального обработчика, что действительно может быть невозможно.
Марсель Н.
7
Я хочу, чтобы все знали, что его решение действительно работает в Chrome (сегодня протестировано в 49.0.2623.87). Однако я обнаружил, что если вы вводите этот протокол непосредственно в браузере (foo: // C: /test.txt), вам, возможно, придется использовать ctrl + enter, потому что браузер не сразу распознает протокол, а протокол поиска перехватывает действие до того, как ОС сможет. Однако размещение его в ссылке сработало правильно.
Timmy
@timmy - большое спасибо! Я рвал волосы, пытаясь заставить обработчики протоколов работать в Chrome - оказалось, все, что мне нужно было сделать, это использовать Ctrl + Enter! Еще раз спасибо!
переулок
@timmy большое вам спасибо, я уже думал, что моим пользователям придется придерживаться Internet Explorer
Pipe
2

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

Проблема : я хотел, чтобы Linux Mint 19.2 Cinnamon открывал Evolution при нажатии на mailtoссылки в Chromium. Gmail был зарегистрирован как обработчик по умолчанию в chrome: // settings / handlers, и я не мог выбрать другой обработчик.

Решение : используйте xdg-settings в консоли

xdg-settings set default-url-scheme-handler mailto org.gnome.Evolution.desktop

Решение было найдено здесь https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution и адаптировано для моего случая.

Питер Шобер
источник
0

открытым

C:\Users\<Username>\AppData\Local\Google\Chrome\User Data\Default

откройте, Preferencesзатем excluded_schemesвыполните поиск, вы найдете его в 'protocol_handler', удалите эту исключенную схему (ы), чтобы сбросить Chrome, чтобы открыть URL-адрес с приложением по умолчанию

Абдельрахман Махарек
источник