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

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

мой протокол://тестовый файл

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


person Test Tester    schedule 17.08.2011    source источник
comment
Я не думаю, что Chrome в настоящее время поддерживает это, у него довольно ограниченный набор API, доступных для расширений.   -  person Wladimir Palant    schedule 17.08.2011


Ответы (7)


Следующий метод регистрирует приложение в схеме 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

person Jun Hsieh    schedule 02.06.2016
comment
это выглядит многообещающе, могу ли я использовать этот подход для печати с планшета? если да, то как быть с реестром и т. д. в этом случае - person Venkat; 05.09.2016
comment
@Venkat Я думаю, что лучше сначала указать имя планшета и операционную систему (например, Surface, iPad и т. д.) и посмотреть, делали ли это раньше другие. Решение, которое я опубликовал, было для Windows. Я видел аналогичные настройки для OS X и Linux. Однако у меня не было под рукой этих устройств/среды для экспериментов. Вы можете сначала попробовать его в Windows, чтобы получить общее представление о том, как это работает. Я надеюсь, это поможет. - person Jun Hsieh; 08.09.2016
comment
Для справки: я установил параметр конфигурации protocol_handler в файле Preferences, расположенном по адресу %localappdata%\Google\Chrome\User Data\Default. - person Babblo; 24.11.2017
comment
Невозможно вызвать несколько протоколов один за другим в одном вызове javascript в chrome. - person prem; 17.08.2018
comment
Что делать, если мой ключ не найден в реестре? Из браузера я прошу вызвать приложение по ключу? вот как я могу уведомить пользователя, что ключ не найден в реестре? - person Akhil Nair; 17.09.2018
comment
Вы упомянули, что используете это для печати файлов, но я не вижу никаких функций печати в приведенном вами примере. У вас есть больше документации? - person Helpful; 27.09.2018

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

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

person Boris Smus    schedule 18.08.2011
comment
+1 за то, что протоколы должны начинаться с web+, чтобы избежать SECURITY_ERR: DOM Exception 18 - person Catch22; 08.03.2012
comment
Как тогда работают ссылки torrent: и steam:? Имеют ли упакованные приложения Chrome это ограничение? - person Steven Roose; 18.08.2014
comment
@StevenRoose Насколько я могу судить, Chrome передает их в ОС. Даже при использовании chrome.webNavigation API никогда не сообщается о tel: ссылках. - person PixnBits; 05.03.2015
comment
Похоже, это не работает внутри приложения Chrome и, похоже, не может перенаправить протокол внутри приложения. Гораздо лучший ответ - ответ Гордона Уильямса ниже. - person Karel Bílek; 22.05.2015

Этот вопрос уже устарел, но недавно было обновлено 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 и создать там веб-страницу, которая указывает людям на приложение в магазине приложений.

person Gordon Williams    schedule 25.03.2014

Вот как я это сделал. Вашему приложению потребуется установить несколько ключей reg при установке, затем в любом браузере вы можете просто сослаться на foo:\anythingHere.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\"" 
person MuffinMan    schedule 21.02.2014
comment
Это не работает в хроме, что было конкретным вопросом. - person Kjetil Watnedal; 19.03.2014
comment
@KjetilWatnedal: он отлично работает в Chrome (по крайней мере, в v40+) и с этим решением. Что касается первоначального вопроса, OP хотел, чтобы браузер автоматически отправлял что-то на сайт, по-видимому, без локального приложения-обработчика, что действительно может быть невозможно. - person Marcel N.; 28.05.2015
comment
Я хочу, чтобы все знали, что его решение действительно работает в Chrome (сегодня протестировано в 49.0.2623.87). Однако я обнаружил, что если вы вводите этот протокол непосредственно в браузере (foo://C:/test.txt), вам, возможно, придется использовать ctrl+enter, потому что браузер не сразу распознает протокол, а протокол поиска перехватывает действие до того, как ОС сможет. Однако размещение его в ссылке сработало правильно. - person timmy; 18.03.2016
comment
@timmy - большое спасибо! Я рвал на себе волосы, пытаясь заставить обработчики протоколов работать в хроме - оказалось, все, что мне нужно было сделать, это использовать Ctrl + Enter! Еще раз спасибо! - person lane; 20.07.2017
comment
@timmy большое спасибо, я уже думал, что моим пользователям придется придерживаться Internet Explorer - person Pipe; 16.04.2018
comment
У меня не было никакого успеха в Chrome, пока я не вызвал собственный протокол со страницы https. Тогда все вышеперечисленное работало отлично. - person axeman; 17.08.2019
comment
Может ли кто-нибудь показать пример файла reg с фактическим chrome.exe, открывающим определенный веб-сайт и определенную страницу на этом сайте, которая будет иметь дело с открытой страницей протокола? - person user280109; 24.02.2021

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

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

Решение. Используйте настройки xdg в консоли.

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 и адаптирован для моего случая.

person Peter Schober    schedule 18.12.2019

Я обнаружил, что решение Jun Hsieh и MuffinMan обычно работает, когда дело доходит до нажатия ссылок на страницах в Chrome или вставки в адресную строку, но оно не работает в конкретном случае передача строки в командной строке.

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

"c:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "foo://C:/test.txt"
"c:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --new-window "foo://C:/test.txt"

Для сравнения, передача Chrome URL-адреса http или https с помощью любой из этих команд приводит к открытию веб-страницы.

Это стало очевидным, потому что один из наших клиентов сообщил, что при переходе по ссылкам на наш продукт из PDF-файла, отображаемого в Adobe Reader, наш продукт не вызывается, когда Chrome является браузером по умолчанию. (Он отлично работает с MSIE и Firefox по умолчанию, но не с Chrome или Edge по умолчанию.)

Я предполагаю, что вместо того, чтобы просто сказать Windows вызвать URL-адрес и позволить Windows разобраться, продукт Adobe находит браузер по умолчанию, которым в данном случае является Chrome, а затем передает URL-адрес в командной строке.

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

Я тестировал это на Chrome 88.0.4324.182.

person MikeM    schedule 17.02.2021

открыть

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

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

person Abdelrahman Maharek    schedule 25.01.2019