Gestionnaire de protocole personnalisé dans Chrome

88

Comment configurer un gestionnaire de protocole personnalisé dans Chrome? Quelque chose comme:

myprotocol: // fichier de test

J'en aurais besoin pour envoyer une requête à http://example.com?query=testfile , puis envoyer la réponse http à mon extension.

Testeur de test
la source
Je ne pense pas que Chrome le supporte actuellement, il dispose d'un ensemble plutôt limité d'API disponibles pour les extensions.
Wladimir Palant

Réponses:

77

La méthode suivante enregistre une application dans un schéma URI. Ainsi, vous pouvez utiliser mycustproto: dans votre code HTML pour déclencher une application locale. Il fonctionne sur une version de Google Chrome 51.0.2704.79 m (64 bits).

J'ai principalement utilisé cette méthode pour imprimer un document en silence sans que la boîte de dialogue d'impression ne s'affiche. Le résultat est plutôt bon et constitue une solution transparente pour intégrer l'application externe au navigateur.

Code HTML (simple):

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

Code HTML (alternative):

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

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

Le schéma d'URI ressemblera à ceci:

Vous pouvez créer le schéma d'URI manuellement dans le registre ou exécuter le fichier "mycustproto.reg" (voir ci-dessous).

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"

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

Application 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();
    }
  }
}

Essayez d'abord d'exécuter le programme pour vous assurer que le programme a été placé dans le bon chemin:

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

Cliquez sur le lien sur votre page HTML:

Vous verrez une fenêtre contextuelle d'avertissement pour la première fois.

entrez la description de l'image ici

Pour réinitialiser le paramètre du gestionnaire de protocole externe dans Chrome:

Si vous avez déjà accepté le protocole personnalisé dans Chrome et que vous souhaitez réinitialiser le paramètre, procédez comme suit (actuellement, il n'y a pas d'interface utilisateur dans Chrome pour modifier le paramètre):

Editez " Local State " ce fichier sous ce chemin:

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

ou allez simplement à:

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

Ensuite, recherchez cette chaîne: protocol_handler

Vous verrez le protocole personnalisé à partir de là.

Remarque: veuillez fermer votre Google Chrome avant de modifier le fichier. Sinon, la modification que vous avez apportée sera écrasée par Chrome.

Référence:

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

Jun Xie
la source
cela semble prometteur, puis-je utiliser cette approche pour imprimer à partir d'une tablette. si oui, comment gérer le registre, etc. dans ce cas
Venkat
1
@Venkat Je pense qu'il vaut mieux spécifier d'abord le nom de la tablette et le système d'exploitation (ex: Surface, iPad, etc.) et voir si d'autres l'ont déjà fait. La solution que j'ai publiée était pour Windows. J'ai vu des paramètres similaires pour OS X et Linux. Cependant, je n'avais pas ces appareils / environnements à portée de main pour expérimenter. Vous pouvez d'abord l'essayer sous Windows pour avoir une idée de base de son fonctionnement. J'espère que cela aidera.
Jun Xie
3
Pour mémoire, j'ai fondé l' option de configuration protocol_handler dans le Preferencesfichier, situé à%localappdata%\Google\Chrome\User Data\Default
Babblo
Impossible d'appeler plusieurs protocoles l'un après l'autre dans un seul appel javascript dans Chrome.
prem
Que faire si ma clé n'est pas trouvée dans le registre? Depuis le navigateur, je demande d'appeler l'application en fonction de la clé? ici, comment puis-je informer l'utilisateur que la clé n'est pas trouvée dans le registre?
Akhil Nair
55

Chrome 13 prend désormais en charge l' navigator.registerProtocolHandlerAPI. Par exemple,

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

Notez que le nom de votre protocole doit commencer par web+, à quelques exceptions près pour les plus courants (comme mailto, etc.). Pour plus de détails, voir: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler

Boris Smus
la source
6
+1 pour le fait que les protocoles doivent commencer par web + pour éviter "SECURITY_ERR: DOM Exception 18"
Catch22
3
Comment fonctionnent les liens torrent:et steam:alors? Les applications Chrome Packaged ont-elles également cette restriction?
Steven Roose
1
@StevenRoose D'après ce que je peux dire, Chrome les transmet au système d'exploitation. Même en utilisant l' chrome.webNavigationAPI, les tel:liens ne sont jamais signalés.
PixnBits
Cela ne semble pas fonctionner dans une application Chrome et ne semble pas pouvoir rediriger le protocole dans l'application. La réponse de Gordon Williams ci-dessous est bien meilleure.
Karel Bílek
30

Cette question est ancienne maintenant, mais il y a eu une mise à jour récente de Chrome (du moins en ce qui concerne les applications packagées) ...

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

et

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

Il vous permet d'enregistrer un gestionnaire pour une URL (tant que vous en êtes propriétaire). Malheureusement non, myprotocol://mais au moins vous pouvez le faire http://myprotocol.mysite.comet vous pouvez créer une page Web qui dirige les gens vers l'application dans l'App Store.

Gordon Williams
la source
Merci BEAUCOUP pour cette réponse! Contrairement à la réponse la plus votée, elle répond en fait à la question!
Karel Bílek
10

Voilà comment je l'ai fait. Votre application devra installer quelques clés de registre lors de l'installation, puis dans n'importe quel navigateur, vous pouvez simplement créer un lien vers foo: \ anyHere.txt et il ouvrira votre application et lui transmettra cette valeur.

Ce n'est pas mon code, juste quelque chose que j'ai trouvé sur le Web en cherchant la même question. Changez simplement tous les "foo" dans le texte ci-dessous par le nom du protocole que vous voulez et changez également le chemin de votre exe.

(placez-le dans un fichier texte sous le nom de fichier foo.reg sur votre bureau, puis double-cliquez dessus pour installer les clés) ----- Au-dessous de cette ligne va dans le fichier .reg (sans inclure cette ligne) --- ---

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
la source
5
Cela ne fonctionne pas dans Chrome, qui était la question spécifique.
Kjetil Watnedal
1
@KjetilWatnedal: Cela fonctionne très bien dans Chrome (au moins en v40 +) et avec cette solution. En ce qui concerne la question initiale, OP voulait que le navigateur soumette automatiquement quelque chose à un site, apparemment sans application de gestionnaire local, ce qui peut en effet ne pas être possible.
Marcel N.28
7
Je veux que tout le monde sache que sa solution fonctionne, en fait, dans Chrome (testé en 49.0.2623.87 aujourd'hui). Cependant, j'ai trouvé que si vous tapez ce protocole directement dans le navigateur (foo: // C: /test.txt), vous devrez peut-être utiliser ctrl + enter car le navigateur ne reconnaît pas immédiatement le protocole et le protocole de recherche intercepte l'action avant le système d'exploitation. Cependant, le mettre dans un lien fonctionnait correctement.
timmy
@timmy - merci beaucoup! Je me suis arraché les cheveux en essayant de faire fonctionner les gestionnaires de protocole dans Chrome - il s'est avéré que tout ce que j'avais à faire était d'utiliser Ctrl + Entrée! Merci encore!
voie le
@timmy merci beaucoup, je pensais déjà que mes utilisateurs devraient s'en tenir à Internet Explorer
Pipe
2

Je ne sais pas si c'est le bon endroit pour ma réponse, mais comme j'ai trouvé très peu de fils utiles et que c'était l'un d'entre eux, je publie ma solution ici.

Problème : je voulais que Linux Mint 19.2 Cinnamon ouvre Evolution en cliquant sur des mailtoliens dans Chromium. Gmail a été enregistré comme gestionnaire par défaut dans chrome: // settings / handlers et je ne pouvais pas choisir un autre gestionnaire.

Solution : utilisez les paramètres xdg dans la console

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

La solution a été trouvée ici https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution et adaptée à mon cas.

Peter Schober
la source
0

ouvert

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

ouvrez Preferencespuis recherchez excluded_schemesvous le trouverez dans 'protocol_handler' supprimez ce (s) schéma (s) exclu (s) pour réinitialiser chrome pour ouvrir l'url avec l'application par défaut

Abdelrahman Maharek
la source