深度链接
在桌面版和 Android 上使用 throne:// 链接,一键添加订阅、路由配置档和代理配置档。
深度链接是一种 throne:// URL,用来让 Throne 完成一项操作:添加订阅、导入路由配置档、添加远程路由配置档,或添加一个代理配置档。服务商会把深度链接放在网站上或二维码中。你也可以用它来分享自己的路由配置档。
Throne 如何接收深度链接
你的系统必须知道由 Throne 打开 throne:// 链接。Throne 只为你当前的用户账户注册自己,因此不需要管理员权限。
| 系统 | 是否默认注册 |
|---|---|
| Linux | 是 |
| macOS | 是(从 Throne.app 运行 Throne 时) |
| Windows,通过安装程序安装 | 是 |
| Windows,从 ZIP 文件解压 | 否 |
要开启注册(例如对于从 ZIP 解压的 Windows 副本):
- 打开
设置(Settings)→基本设置(Basic Settings)。 - 在
通用(Common)标签页的链接和文件(Links and Files)下,勾选启动时注册 throne:// 链接(Register throne:// links at startup)。 - 点击
确定(OK)。Throne 会立即完成注册。
开启此选项后,Throne 每次启动时都会检查注册,并在需要时修复,例如在你移动 Throne 文件夹之后。如果你在 Windows 或 Linux 上保留了多个副本,链接会在最后一个开启此选项并启动的副本中打开。
当链接会在当前这份 Throne 中打开时,选项旁边的状态显示为 已安装(Installed)。安装(Install)按钮只注册一次,不会开启该选项。卸载(Uninstall)会移除注册并关闭该选项。仅取消勾选该选项则会保留现有的注册。
macOS: 链接处理程序是 Throne.app 的一部分,因此没有 安装 和 卸载 按钮。如果 Throne 不是从应用包中运行的,该选项会显示 不可用于这个安装(Not available for this installation)。
Throne 可以通过以下方式接收深度链接:
- 在浏览器、聊天应用或文档中点击链接。如果 Throne 没有运行,它会先启动,然后处理该链接。
- 复制链接,然后在主窗口中按
Ctrl+V,对应菜单程序(Program)→添加剪贴板中的配置档(Add profile from clipboard)。即使没有开启注册,此方法也有效。 - 将链接文本拖放到主窗口上。
- 启动 Throne 时将链接作为参数传入。参见命令行。
链接格式
所有深度链接的形式都相同:
throne://<command>/<payload>
throne://必须小写。命令不区分大小写:throne://AddSub/…也有效。- 命令后面必须跟一个斜杠和载荷(payload)。缺少斜杠时,大多数链接不会产生任何效果。
- Throne 会忽略链接中
?或#之后的所有内容。链接携带的全部信息都在载荷中。 - 如果载荷经过了百分号编码(例如用
%2B代替+),Throne 会先对其解码。
| 命令 | 作用 | 是否先询问? |
|---|---|---|
addsub |
添加一个订阅分组并更新它 | 是 |
route |
导入链接中携带的路由配置档 | 是 |
remoteroute |
按 URL 添加远程路由配置档 | 是 |
add |
向当前分组添加一个代理配置档 | 否。在 Android 上,在其他应用中点按该链接时会询问。 |
Base64 规则
载荷是 Base64 文本。可以使用哪种 Base64 字母表取决于命令:
| 命令 | 接受的载荷 |
|---|---|
addsub、remoteroute |
仅限标准 Base64:字母、数字、+ 和 /。末尾的 = 填充可有可无。 |
route、add |
URL 安全的 Base64(- 和 _)或标准 Base64,带不带填充均可。Throne 自己生成的是不带填充的 URL 安全 Base64。 |
对于 addsub 和 remoteroute,包含 - 或 _ 的 URL 安全载荷会失败。请让载荷保持在一行内,不要包含空格。
在 Linux 或 Windows 的 Git Bash 中编码载荷:
printf '%s' 'https://example.com/sub/abc123#MyProvider' | base64 -w 0
在 macOS 上,请去掉 -w 0。在 PowerShell 中:
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('https://example.com/sub/abc123#MyProvider'))
这两条命令输出的都是带填充的标准 Base64。
addsub:添加订阅
添加一个新的订阅分组,并立即更新它。
throne://addsub/<base64>
载荷是以下这一行文本的 Base64:
<subscription_url>#<group_name>
| 部分 | 必需 | 说明 |
|---|---|---|
<subscription_url> |
是 | 订阅 URL,保持原样。其中的 ?、& 和 / 在 Base64 中是安全的,因此无需进行百分号编码。 |
#<group_name> |
否 | 新分组的名称。省略时,分组以 URL 的主机名命名。名称的百分号编码是可选的:直接使用空格也可以。 |
例如,要将 https://example.com/sub/abc123 添加为名为 MyProvider 的分组,请对 https://example.com/sub/abc123#MyProvider 进行编码:
throne://addsub/aHR0cHM6Ly9leGFtcGxlLmNvbS9zdWIvYWJjMTIzI015UHJvdmlkZXI=
Throne 会显示“添加这个订阅吗?”(Add this subscription?),其中包含分组名称和 URL,以及一个默认已勾选的 自动更新(Auto update)复选框。确认后,Throne 会创建该分组并更新它。
route:导入路由配置档
导入链接中携带的完整路由配置档(默认出站和规则)。
throne://route/<base64>
你无需手动构造这类链接。在 路由设置(Routing Settings)的 路由(Route)标签页中选中该配置档并点击 导出(Export),或在列表中按 Ctrl+C。Throne 会把一条 throne://route/… 链接复制到剪贴板。
当有人打开该链接时,Throne 会显示“添加这个路由配置档吗?”(Add this routing profile?)及其名称,并附上无法导入内容的说明。对方确认后,该配置档会被添加到其列表中。如果该配置档包含 VPN 端点,Throne 会在询问之前先创建相应的 OpenVPN 或 OpenConnect 配置档,并且即使取消导入也会保留它们。导入的配置档不会自动启用:请在 路由(Routing)菜单底部的列表中选择它。
载荷是类似下面这样一个小型 JSON 对象的 Base64:
{
"kind": "throne-route-profile",
"v": 1,
"name": "Example",
"default_outbound": "proxy",
"rules": []
}
下面这条链接携带的就是该 JSON:
throne://route/eyJraW5kIjoidGhyb25lLXJvdXRlLXByb2ZpbGUiLCJ2IjoxLCJuYW1lIjoiRXhhbXBsZSIsImRlZmF1bHRfb3V0Ym91bmQiOiJwcm94eSIsInJ1bGVzIjpbXX0
default_outbound 的值为 proxy、direct、block 或 warp-bypass。原始配置档(手写的 sing-box route 段落)带有 "raw": true 和一个 route 对象,而不是 rules。Throne 会按名称查找规则中使用的服务器,并告诉你哪些没有找到。关于分享的更多信息,请参见路由。
在路由设置中导入
你也可以在 路由设置 的 路由 标签页中粘贴链接:点击 导入(Import),或在列表中按 Ctrl+V。在主窗口中,只有以 throne:// 开头的文本才会被视为深度链接;而在这里,Throne 还接受单独的 Base64 载荷、纯 JSON,以及旧式的 JSON 规则列表(它会在编辑器中打开,以便你为其命名)。通过 route 链接、其 Base64 或其 JSON 导入的配置档,在你点击 确定 后还会成为 通用 标签页中选中的 路由配置档(Routing Profile)。
在这里粘贴的 remoteroute 链接添加的配置档会关闭自动更新,因为这里的提示框没有 自动更新 复选框。你可以稍后在每个配置档的编辑器中勾选 自动更新。
remoteroute:添加远程路由配置档
添加一个或多个远程路由配置档。route 链接携带整个配置档,而 remoteroute 链接只携带 URL:Throne 会下载每个配置档,并可以使其保持最新。可用它来分发你自己维护的路由配置档。
throne://remoteroute/<base64>
载荷是一份纯 URL 列表(每行一个)的 Base64,而不是 JSON:
<profile_url_1>#<name_1>
<profile_url_2>#<name_2>
| 部分 | 必需 | 说明 |
|---|---|---|
<profile_url> |
是 | 一个 http:// 或 https:// URL。不以二者之一开头的行会被跳过。 |
#<name> |
否 | 配置档名称。省略时,配置档以 URL 的主机名命名。 |
每个 URL 都必须提供一个结构化路由配置档:一条 throne://route/ 链接、其 Base64 载荷,或其中的 JSON。原始配置档不能用作远程配置档。
例如,对下面两行进行编码:
printf '%s\n%s' 'https://example.com/routes/bypass-iran.json#BypassIran' 'https://example.com/routes/ads.json' | base64 -w 0
得到的链接如下:
throne://remoteroute/aHR0cHM6Ly9leGFtcGxlLmNvbS9yb3V0ZXMvYnlwYXNzLWlyYW4uanNvbiNCeXBhc3NJcmFuCmh0dHBzOi8vZXhhbXBsZS5jb20vcm91dGVzL2Fkcy5qc29u
Throne 会在“添加这些远程路由配置档吗?”(Add these remote routing profiles?)下列出这些 URL,并为它们提供一个共用的 自动更新 复选框,该复选框默认已勾选。确认后,Throne 会添加并下载这些配置档,日志中会显示成功获取了多少个。
- 只有勾选了
基本设置→订阅→路由配置档自动更新(Routing profiles auto update)→启用时,Throne 才会刷新开启了自动更新的配置档。该选项默认关闭。要手动更新,请使用路由设置中路由标签页上的更新(Update)。参见远程配置档。 - 更新会用下载到的规则和默认出站替换配置档原有的内容,配置档名称保持不变。
- 位于
raw.githubusercontent.com上的 URL 会通过路由设置的通用标签页中选择的远程规则集镜像(Remote Rule-set Mirror)下载(默认为 jsDelivr 镜像)。在你修改文件后的一段时间内,镜像可能仍提供旧版本。 路由→下载配置档(Download Profiles)的工作方式相同:它会从 Throne 的路由配置档仓库下载一条remoteroute链接,并显示同样的提示。
add:添加一个代理配置档
向当前分组添加一个代理配置档。
throne://add/<base64>
载荷是该配置档出站设置(JSON 格式)的 Base64。在桌面版上,这种链接不会请求确认:配置档会被立即添加,就像你粘贴了一条 vless:// 或 ss:// 链接一样。
Throne 可以为你生成这类链接:
- 在列表中右键点击配置档 →
分享(Share)→复制选定项的链接 (深度链接)(Copy links of selected (Deep Links)),快捷键Ctrl+Alt+C。 - 右键点击配置档 →
分享→二维码和链接(QR Code and link)。窗口中显示普通分享链接或深度链接,勾选Deep Link即可在两者之间切换。 分组(Groups)→编辑当前分组(Edit current Group)→复制配置档分享链接(深度链接)(Copy profile share links (Deep Links))。
深度链接携带完整的配置档设置,因此也适用于没有标准分享链接的配置档类型和选项。对于这类配置档,复制选定项的链接(Copy links of selected,Ctrl+C)通常会自动复制深度链接,二维码窗口打开时也会勾选 Deep Link。如果这类配置档设置了高级连接选项(例如绑定网络接口),请改用 复制选定项的链接 (深度链接)。
凡是普通分享链接可用的地方,add 链接也同样可用:订阅中、文件中以及二维码中。
Android 版
Throne for Android 2.0.0 支持同样的四个命令。它还接受 clash://install-config?url=…&name=… 链接,这类链接会像 addsub 一样添加订阅。在这类链接中,url 的值需要进行百分号编码。throne:// 协议在安装应用时即完成注册,没有相关设置项。
在其他应用中点按链接,或在 配置(Profiles)界面使用 添加服务器配置(Add profile)→ 从剪切板导入(Import from clipboard)或 扫描二维码(Scan QR code)。在 Android 上,二维码适用于全部四个命令。route 和 remoteroute 链接也可以通过 路由(Routing)界面上的 Import 导入。
与桌面版的区别:
- 在其他应用中点按
add链接时,会先询问“确认要导入配置 …?”(Confirm you want to import profile …?)。在其他应用中点按vless://等链接时也会同样询问。通过剪贴板或二维码导入时则不会询问。 - 导入的路由配置档会被添加,但不会自动启用。请在
路由界面点按它以使用。 - 来自桌面版的原始路由配置档(
"raw": true)会被拒绝,并提示“raw routing profiles are not supported on Android”(Android 不支持原始路由配置档)。分享的路由配置档中的端点会被丢弃,并附带说明。 - 未知命令会在屏幕上显示“Ignored deeplink with unknown command: …”(已忽略带有未知命令的深度链接),而不仅仅记录在日志中。
- 定时更新需要开启相应设置:订阅对应
设置(Settings)→订阅(Subscriptions)→Subscription auto update,远程路由配置档对应设置→Routing→Auto update remote profiles。两者默认均为关闭。
Android 应用也可以生成这些链接:为配置档生成 add 链接,为路由配置档生成 route 链接。
故障排除
以下消息来自 Throne 桌面版。
- 点击链接没有反应,或浏览器询问要使用哪个应用。 当前副本没有注册链接处理程序。对于从 ZIP 解压的 Windows 副本,请开启
启动时注册 throne:// 链接(见 Throne 如何接收深度链接)。在 macOS 上,请从Throne.app运行 Throne。其他情况下,启动一次 Throne 即可。如果你保留了多个副本,请在应当打开链接的那个副本中点击安装。你也始终可以复制链接,然后在 Throne 中按Ctrl+V。 - Linux:链接仍然无法打开。 注册过程会运行
desktop-file-utils软件包中的update-desktop-database工具。如果之前缺少该工具,请先安装,然后点击启动时注册 throne:// 链接旁边的安装。 - 没有任何反应,日志也是空的。 Throne 会不加提示地丢弃以下链接:
- 载荷不是有效标准 Base64 的
addsub链接,例如带有-或_的 URL 安全 Base64,或者包含空格或换行的载荷; - 命令后面缺少斜杠的链接(
add和remoteroute链接除外); - 命令未知且载荷无法解码的链接。
- 载荷不是有效标准 Base64 的
- 日志中出现“忽略了带未知命令的深度链接: …”(Ignored deeplink with unknown command: …)。
throne://后面的单词不是addsub、route、remoteroute或add。请检查拼写。 - “该链接不包含订阅 URL。”(The link did not contain a subscription URL.)
addsub载荷已成功解码,但#前面没有 URL。请编码<url>#<name>,而不是只编码#<name>。 - “Deep link has no data”(深度链接没有数据)或“Base64 is invalid.”(Base64 无效)。 这些消息来自
remoteroute链接:throne://remoteroute/后面没有内容,或者载荷不是标准 Base64。 - “The link did not contain any valid http(s) routing profile URLs.”(该链接不包含任何有效的 http(s) 路由配置档 URL)
remoteroute载荷已成功解码,但没有任何一行以http://或https://开头。载荷必须是 URL 列表(每行一个),而不是 JSON。 - “该链接不包含任何有效的远程路由配置档。”(The link did not contain any valid remote routing profiles.) 链接中
remoteroute后面缺少斜杠。 - “该链接无法解析:”(The link could not be parsed:)及其原因。 这些消息来自
route链接:- “Empty input”(输入为空):
throne://route/后面没有内容。 - “Input is not valid JSON, base64, or a Throne route link”(输入不是有效的 JSON、base64 或 Throne 路由链接):载荷已损坏或被截断。
- “Unrecognized route object”(无法识别的路由对象):JSON 中没有
"kind": "throne-route-profile"。
- “Empty input”(输入为空):
- 日志中出现“导入了 0 个配置档”(Imported 0 profile(s))。
add载荷已损坏或被截断;或者你扫描的二维码中是addsub、route或remoteroute链接:请从日志中复制QR Code Result:之后的文本,然后按Ctrl+V。 - 日志中出现“远程路由配置档 … 失败: …”(Remote routing profile … failed: …)。 配置档已添加,但其 URL 无法下载,或者提供的不是结构化路由配置档。请修正 URL 或文件,然后使用
路由设置中路由标签页上的更新。