创建自定义 URL 协议处理程序

pal*_*wim 21 url xdg-open xdg

我想为我自己的自定义 URL 协议注册一个 URL 方案(或协议)处理程序,以便单击具有此自定义协议的链接将在该 URL 上执行命令。我需要采取哪些步骤来添加这个处理程序?

示例:我想ddg://query%20terms在新的 DuckDuckGo 浏览器搜索中打开 URL 。如果此协议已经存在,我假设覆盖处理程序的步骤与创建新处理程序的步骤没有太大区别。是的,从技术上讲,这只是一个 URL 方案,而不是一个协议。

pal*_*wim 26

要向 XDG 注册新的 URL 方案处理程序,首先创建一个指定x-scheme-handler/...MIME 类型的桌面条目:

[Desktop Entry]
Type=Application
Name=DDG Scheme Handler
Exec=open-ddg.sh %u
StartupNotify=false
MimeType=x-scheme-handler/ddg;
Run Code Online (Sandbox Code Playgroud)

请注意,根据桌面条目规范%u将 URL(例如ddg://query%20terms)作为单个参数传递

创建此桌面条目并安装后(即,将其放在applicationsXDG的本地或系统目录中,例如~/.local/share/applications//usr/share/applications/),然后您必须使用 MIME 类型注册应用程序(假设您已将桌面条目命名为ddg-opener.desktop):

xdg-mime default ddg-opener.desktop x-scheme-handler/ddg
Run Code Online (Sandbox Code Playgroud)

ddg-open.sh处理程序的参考实现:

#!/bin/bash

# bash and not just sh because we are using some bash-specific syntax

if [[ "$1" == "ddg:"* ]]; then
    ref=${1#ddg://}
    #ref=$(python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])" "$ref") # If you want decoding
    xdg-open "https://duckduckgo.com/?q=$ref"
else
    xdg-open "$1" # Just open with the default handler
fi
Run Code Online (Sandbox Code Playgroud)