Manipulador de protocolo personalizado no Chrome

88

Como faço para configurar um manipulador de protocolo personalizado no Chrome? Algo como:

myprotocol: // testfile

Eu precisaria disso para enviar uma solicitação para http://example.com?query=testfile e , em seguida, enviar o httpresponse para minha extensão.

Test Tester
fonte
Não acho que o Chrome atualmente suporte isso, ele tem um conjunto bastante limitado de APIs disponíveis para extensões.
Wladimir Palant

Respostas:

77

O método a seguir registra um aplicativo em um Esquema de URI. Portanto, você pode usar mycustproto: em seu código HTML para acionar um aplicativo local. Ele funciona em um Google Chrome versão 51.0.2704.79 m (64 bits).

Usei esse método principalmente para imprimir documentos silenciosamente, sem que a caixa de diálogo de impressão fosse exibida. O resultado é muito bom e é uma solução perfeita para integrar o aplicativo externo com o navegador.

Código HTML (simples):

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

Código HTML (alternativa):

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

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

Esquema de URI será semelhante a este:

Você pode criar o Esquema de URI manualmente no registro ou executar o arquivo "mycustproto.reg" (veja abaixo).

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"

exemplo 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\""

Aplicativo de console 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();
    }
  }
}

Tente executar o programa primeiro para verificar se ele foi colocado no caminho correto:

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

Clique no link em sua página HTML:

Você verá uma janela pop-up de aviso pela primeira vez.

insira a descrição da imagem aqui

Para redefinir a configuração do manipulador de protocolo externo no Chrome:

Se você já aceitou o protocolo personalizado no Chrome e gostaria de redefinir a configuração, faça isso (atualmente, não há IU no Chrome para alterar a configuração):

Edite o " Estado Local " este arquivo neste caminho:

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

ou simplesmente vá para:

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

Em seguida, pesquise por esta string: protocol_handler

Você verá o protocolo personalizado a partir daí.

Observação: feche o Google Chrome antes de editar o arquivo. Caso contrário, a alteração que você fez será substituída pelo Chrome.

Referência:

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

Jun Xie
fonte
parece promissor, posso usar essa abordagem para imprimir de um tablet. em caso afirmativo, como lidar com registro etc. nesse caso
Venkat
1
@Venkat Acho melhor especificar o nome do tablet e o sistema operacional primeiro (ex: Surface, iPad, etc) e ver se outros já fizeram isso antes. A solução que postei foi para Windows. Eu vi as configurações semelhantes para OS X e Linux. No entanto, eu não tinha esses dispositivos / ambientes à mão para experimentar. Você pode experimentá-lo no Windows primeiro para ter uma ideia básica de como funciona. Espero que isso ajude.
Jun Xie
3
Para registro, fundei a opção de configuração protocol_handler no Preferencesarquivo, localizado em%localappdata%\Google\Chrome\User Data\Default
Babblo
Não é possível invocar vários protocolos um após o outro em uma única chamada de javascript no Chrome.
prem
E se minha chave não for encontrada no registro? Estou pedindo para chamar o aplicativo do navegador com base na chave? aqui, como posso notificar ao usuário que a chave não foi encontrada no registro?
Akhil Nair de
55

O Chrome 13 agora oferece suporte à navigator.registerProtocolHandlerAPI. Por exemplo,

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

Observe que o nome do seu protocolo deve começar com web+, com algumas exceções para os comuns (como mailto, etc). Para obter mais detalhes, consulte: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler

Boris Smus
fonte
6
+1 para o fato de que os protocolos devem começar com web + para evitar "SECURITY_ERR: DOM Exception 18"
Catch22
3
Como torrent:e steam:links funcionam, então? Os aplicativos empacotados do Chrome também têm essa restrição?
Steven Roose de
1
@StevenRoose Pelo que posso dizer, o Chrome passa isso para o sistema operacional. Mesmo usando a chrome.webNavigationAPI, os tel:links nunca são relatados.
PixnBits
Isso não parece funcionar dentro de um aplicativo do Chrome e não parece ser capaz de redirecionar o protocolo dentro do aplicativo. Uma resposta muito melhor é a resposta de Gordon Williams abaixo.
Karel Bílek
30

Esta pergunta é antiga agora, mas houve uma atualização recente do Chrome (pelo menos no que diz respeito a aplicativos empacotados) ...

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

e

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

Ele permite que você registre um manipulador para um URL (desde que você o possua). Infelizmente não, myprotocol://mas pelo menos você pode fazer http://myprotocol.mysite.come pode criar uma página da web que direcione as pessoas para o aplicativo na loja de aplicativos.

Gordon Williams
fonte
Muito obrigado por esta resposta! Ao contrário da resposta mais votada, ele realmente responde à pergunta!
Karel Bílek
10

É assim que eu fiz. Seu aplicativo precisaria instalar algumas chaves reg na instalação e, em qualquer navegador, você pode apenas vincular a foo: \ anyHere.txt e ele abrirá seu aplicativo e transmitirá esse valor.

Este não é o meu código, apenas algo que encontrei na web ao pesquisar a mesma pergunta. Basta alterar todos os "foo" no texto abaixo para o nome do protocolo que você deseja e alterar o caminho para o seu exe também.

(coloque-o em um arquivo de texto salvando-o como foo.reg em sua área de trabalho e clique duas vezes nele para instalar as chaves) ----- Abaixo desta linha, vai para o arquivo .reg (NÃO inclui esta linha) --- ---

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\"" 
MuffinMan
fonte
5
Isso não funciona no cromo, que era a questão específica.
Kjetil Watnedal
1
@KjetilWatnedal: Funciona bem no Chrome (pelo menos na v40 +) e com esta solução. Em relação à pergunta inicial, o OP queria que o navegador enviasse algo a um site automaticamente, aparentemente sem um aplicativo manipulador local, o que de fato pode não ser possível.
Marcel N.
7
Quero que todos saibam que sua solução, de fato, funciona no Chrome (testado em 49.0.2623.87 hoje). No entanto, descobri que se você digitar este protocolo diretamente no navegador (foo: // C: /test.txt), poderá ter que usar ctrl + enter porque o navegador não reconhece imediatamente o protocolo e o protocolo de pesquisa intercepta a ação antes que o sistema operacional possa. Colocá-lo em um link funcionou corretamente, no entanto.
timmy
@timmy - muito obrigado! Tenho arrancado os cabelos tentando fazer com que os manipuladores de protocolo funcionem no cromo - descobri que tudo que eu precisava fazer era usar Ctrl + Enter! Obrigado novamente!
pista de
@timmy, muito obrigado, já pensei que meus usuários teriam que usar o Internet Explorer
Pipe
2

Não tenho certeza se este é o lugar certo para minha resposta, mas como encontrei muito poucos tópicos úteis e este foi um deles, estou postando minha solução aqui.

Problema : Eu queria que o Linux Mint 19.2 Cinnamon abrisse o Evolution ao clicar em mailtolinks no Chromium. O Gmail foi registrado como manipulador padrão em chrome: // settings / handlers e não pude escolher outro manipulador.

Solução : use as configurações xdg no console

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

A solução foi encontrada aqui https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution e adaptada para o meu caso.

Peter Schober
fonte
0

abrir

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

abra, em Preferencesseguida, pesquise por excluded_schemesvocê encontrará em 'protocol_handler' exclua este (s) esquema (s) excluído (s) para redefinir o Chrome para abrir o url com o aplicativo padrão

Abdelrahman Maharek
fonte