Benutzerdefinierter Protokollhandler in Chrom

86

Wie richte ich einen benutzerdefinierten Protokollhandler in Chrome ein? Etwas wie:

myprotocol: // testdatei

Ich würde dies benötigen, um eine Anfrage an http://example.com?query=testfile zu senden und dann die htt-Antwort an meine Nebenstelle zu senden.

Test Tester
quelle
Ich glaube nicht, dass Chrome dies derzeit unterstützt. Es stehen nur begrenzte APIs für Erweiterungen zur Verfügung.
Wladimir Palant

Antworten:

77

Die folgende Methode registriert eine Anwendung in einem URI-Schema. Sie können also mycustproto: in Ihrem HTML-Code verwenden, um eine lokale Anwendung auszulösen. Es funktioniert auf einer Google Chrome-Version 51.0.2704.79 m (64-Bit).

Ich habe diese Methode hauptsächlich zum stillen Drucken von Dokumenten verwendet, ohne dass der Druckdialog angezeigt wurde. Das Ergebnis ist ziemlich gut und eine nahtlose Lösung zur Integration der externen Anwendung in den Browser.

HTML-Code (einfach):

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

HTML-Code (alternativ):

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

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

Das URI-Schema sieht folgendermaßen aus:

Sie können das URI-Schema manuell in der Registrierung erstellen oder die Datei "mycustproto.reg" ausführen (siehe unten).

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 Beispiel:

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

Versuchen Sie zuerst, das Programm auszuführen, um sicherzustellen, dass das Programm im richtigen Pfad platziert wurde:

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

Klicken Sie auf den Link auf Ihrer HTML-Seite:

Zum ersten Mal wird ein Warnfenster angezeigt.

Geben Sie hier die Bildbeschreibung ein

So setzen Sie die Einstellung für den externen Protokollhandler in Chrome zurück:

Wenn Sie das benutzerdefinierte Protokoll in Chrome jemals akzeptiert haben und die Einstellung zurücksetzen möchten, gehen Sie folgendermaßen vor (derzeit gibt es in Chrome keine Benutzeroberfläche zum Ändern der Einstellung):

Bearbeiten Sie " Local State " dieser Datei unter folgendem Pfad:

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

oder gehen Sie einfach zu:

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

Suchen Sie dann nach dieser Zeichenfolge: protocol_handler

Von dort aus sehen Sie das benutzerdefinierte Protokoll.

Hinweis: Schließen Sie Google Chrome, bevor Sie die Datei bearbeiten. Andernfalls wird die von Ihnen vorgenommene Änderung von Chrome überschrieben.

Referenz:

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

Jun Xie
quelle
Das sieht vielversprechend aus. Kann ich diesen Ansatz verwenden, um von einem Tablet aus zu drucken? wenn ja, wie man mit Registrierung usw. in diesem Fall
Venkat
1
@Venkat Ich denke, es ist besser, zuerst den Namen des Tablets und das Betriebssystem anzugeben (z. B. Oberfläche, iPad usw.) und zu prüfen, ob andere dies bereits getan haben. Die Lösung, die ich veröffentlicht habe, war für Windows. Ich habe die ähnlichen Einstellungen für OS X und Linux gesehen. Ich hatte diese Geräte / Umgebungen jedoch nicht zum Experimentieren zur Hand. Sie können es zuerst unter Windows ausprobieren, um eine grundlegende Vorstellung davon zu erhalten, wie es funktioniert. Ich hoffe das wird helfen.
Jun Xie
3
Für die Aufzeichnung habe ich die Konfigurationsoption protocol_handler in der PreferencesDatei gegründet, die sich am%localappdata%\Google\Chrome\User Data\Default
Babblo
Es ist nicht möglich, mehrere Protokolle nacheinander in einem einzelnen Javascript-Aufruf in Chrome aufzurufen.
Prem
Was ist, wenn mein Schlüssel nicht in der Registrierung gefunden wird? Vom Browser aus möchte ich die Anwendung anhand des Schlüssels aufrufen? Wie kann ich hier den Benutzer benachrichtigen, dass der Schlüssel nicht in der Registrierung gefunden wurde?
Akhil Nair
55

Chrome 13 unterstützt jetzt die navigator.registerProtocolHandlerAPI. Beispielsweise,

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

Beachten Sie, dass Ihr Protokollname web+mit einigen Ausnahmen für häufig verwendete (wie mailtousw.) beginnen muss. Weitere Informationen finden Sie unter: http://updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler

Boris Smus
quelle
6
+1 für die Tatsache, dass Protokolle mit web + beginnen müssen, um "SECURITY_ERR: DOM Exception 18" zu vermeiden
Catch22
3
Wie funktioniert torrent:und steam:verlinkt dann? Haben Chrome Packaged Apps auch diese Einschränkung?
Steven Roose
1
@StevenRoose Soweit ich weiß, gibt Chrome diese an das Betriebssystem weiter. Selbst bei Verwendung der chrome.webNavigationAPI werden tel:Links niemals gemeldet.
PixnBits
Dies scheint in einer Chrome-App nicht zu funktionieren und das Protokoll in der App nicht umzuleiten. Viel bessere Antwort ist Gordon Williams Antwort unten.
Karel Bílek
30

Diese Frage ist jetzt alt, aber es gab kürzlich ein Update für Chrome (zumindest was gepackte Apps betrifft) ...

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

und

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

Sie können einen Handler für eine URL registrieren (sofern Sie diese besitzen). Leider nein, myprotocol://aber zumindest können Sie dort http://myprotocol.mysite.comeine Webseite erstellen, die Personen auf die App im App Store verweist.

Gordon Williams
quelle
Vielen Dank für diese Antwort! Im Gegensatz zur am besten bewerteten Antwort beantwortet sie tatsächlich die Frage!
Karel Bílek
10

So habe ich es gemacht. Ihre App müsste bei der Installation einige Registrierungsschlüssel installieren. In jedem Browser können Sie einfach einen Link zu foo: \ anyHere.txt erstellen. Dadurch wird Ihre App geöffnet und dieser Wert übergeben.

Dies ist nicht mein Code, sondern etwas, das ich bei der Suche nach derselben Frage im Internet gefunden habe. Ändern Sie einfach alle "foo" im Text unten in den gewünschten Protokollnamen und ändern Sie auch den Pfad zu Ihrer Exe.

(Fügen Sie dies in eine Textdatei ein, die als foo.reg auf Ihrem Desktop gespeichert ist, und doppelklicken Sie dann darauf, um die Schlüssel zu installieren.) ----- Unterhalb dieser Zeile wird die .reg-Datei angezeigt (ohne diese Zeile) --- --- ---.

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\"" 
Muffinmann
quelle
5
Dies funktioniert nicht in Chrom, was die spezifische Frage war.
Kjetil Watnedal
1
@KjetilWatnedal: Es funktioniert gut in Chrome (zumindest in Version 40 +) und mit dieser Lösung. Im Zusammenhang mit der ersten Frage wollte OP, dass der Browser automatisch etwas an eine Site sendet, anscheinend ohne eine lokale Handler-Anwendung, was in der Tat möglicherweise nicht möglich ist.
Marcel N.
7
Ich möchte alle wissen lassen, dass seine Lösung tatsächlich in Chrome funktioniert (heute in 49.0.2623.87 getestet). Wenn Sie dieses Protokoll jedoch direkt im Browser eingeben (foo: // C: /test.txt), müssen Sie möglicherweise Strg + Eingabetaste verwenden, da der Browser das Protokoll und die Suchprotokollabschnitte nicht sofort erkennt die Aktion vor dem Betriebssystem kann. Das Einfügen in einen Link funktionierte jedoch korrekt.
Timmy
@timmy - vielen Dank! Ich habe mir die Haare ausgerissen, um Protokollhandler dazu zu bringen, in Chrom zu arbeiten. Es stellte sich heraus, dass ich nur Strg + Eingabetaste verwenden musste! Danke noch einmal!
Spur
@timmy vielen Dank, ich dachte bereits, meine Benutzer müssten sich an Internet Explorer
Pipe
2

Ich bin mir nicht sicher, ob dies der richtige Ort für meine Antwort ist, aber da ich nur sehr wenige hilfreiche Themen gefunden habe und dies einer davon war, veröffentliche ich meine Lösung hier.

Problem : Ich wollte, dass Linux Mint 19.2 Cinnamon Evolution öffnet, wenn Sie auf mailtoLinks in Chromium klicken . Google Mail wurde als Standardhandler in chrome: // settings / handlers registriert und ich konnte keinen anderen Handler auswählen.

Lösung : Verwenden Sie die xdg-Einstellungen in der Konsole

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

Die Lösung wurde hier https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution gefunden und für meinen Fall angepasst.

Peter Schober
quelle
0

öffnen

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

Öffnen Preferencesund suchen excluded_schemesSie danach. Sie finden es in 'protocol_handler'. Löschen Sie diese ausgeschlossenen Schemata, um Chrome zurückzusetzen und die URL mit der Standardanwendung zu öffnen

Abdelrahman Maharek
quelle