Глубокие ссылки

Добавляйте подписки, профили маршрутизации и профили прокси одним щелчком по ссылкам throne:// на компьютере и Android.

Глубокая ссылка — это URL вида throne://, который поручает Throne одно действие: добавить подписку, импортировать профиль маршрутизации, добавить удалённые профили маршрутизации или добавить один профиль прокси. Провайдеры размещают глубокие ссылки на сайтах и в QR-кодах. Вы также можете с их помощью делиться своими профилями маршрутизации.

Как Throne получает глубокую ссылку

Ваша система должна знать, что ссылки throne:// открывает Throne. Throne регистрирует себя только для вашей учётной записи, и для этого не нужны права администратора.

Система Зарегистрирован по умолчанию
Linux Да
macOS Да, если запускать Throne из Throne.app
Windows, установка с помощью установщика Да
Windows, распаковка из ZIP-архива Нет

Чтобы включить регистрацию, например для копии Windows из ZIP-архива:

  1. Откройте Настройки (Settings) → Основные настройки (Basic Settings).
  2. На вкладке Общие (Common) в разделе Links and Files отметьте Зарегистрировать ссылки throne:// при запуске (Register throne:// links at startup).
  3. Нажмите OK. Throne сразу зарегистрирует себя.

Пока параметр включён, Throne проверяет регистрацию при каждом запуске и восстанавливает её, например после перемещения папки Throne. Если у вас несколько копий в Windows или Linux, ссылки открываются в той копии, которая последней запускалась с включённым параметром.

Состояние рядом с параметром показывает Установлено (Installed), когда ссылки открывают эту копию Throne. Кнопка Установить (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/… работает.
  • После команды должны идти косая черта и полезная нагрузка. Без косой черты большинство ссылок ничего не делает.
  • 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 или в Git Bash в Windows:

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 безопасны, поэтому кодировать URL процентами не нужно.
#<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: импорт профиля маршрутизации

Импортирует целый профиль маршрутизации (outbound по умолчанию и правила), переданный внутри ссылки.

throne://route/<base64>

Собирать такие ссылки вручную не нужно. В Настройки маршрутизации (Routing Settings) на вкладке Маршрут (Route) выберите профиль и нажмите Экспорт (Export) или нажмите Ctrl+C в списке. Throne скопирует ссылку throne://route/… в буфер обмена.

Когда кто-то открывает ссылку, Throne показывает запрос «Добавить этот профиль маршрутизации?» (Add this routing profile?) с именем профиля и примечаниями обо всём, что не удалось импортировать. После подтверждения профиль добавляется в список. Если у профиля есть конечные точки VPN, Throne создаёт соответствующие профили OpenVPN или OpenConnect ещё до вопроса и сохраняет их, даже если импорт отменён. Импортированный профиль маршрутизации не становится активным: выберите его в списке внизу меню Маршруты (Routing).

Полезная нагрузка — Base64 небольшого JSON-объекта, например такого:

{
  "kind": "throne-route-profile",
  "v": 1,
  "name": "Example",
  "default_outbound": "proxy",
  "rules": []
}

Вот ссылка с этим JSON:

throne://route/eyJraW5kIjoidGhyb25lLXJvdXRlLXByb2ZpbGUiLCJ2IjoxLCJuYW1lIjoiRXhhbXBsZSIsImRlZmF1bHRfb3V0Ym91bmQiOiJwcm94eSIsInJ1bGVzIjpbXX0

default_outbound принимает значения proxy, direct, block или warp-bypass. Raw-профиль (написанный вручную раздел route sing-box) содержит "raw": true и объект route вместо rules. Throne находит по имени серверы, используемые в правилах, и сообщает о тех, которые не удалось найти. Подробнее об обмене профилями см. Маршрутизация.

Импорт в настройках маршрутизации

Ссылку можно также вставить на вкладке Маршрут в Настройки маршрутизации: нажмите Импорт (Import) или нажмите Ctrl+V в списке. В главном окне глубокой ссылкой считается только текст, начинающийся с throne://. Здесь же Throne принимает и одну полезную нагрузку Base64, и простой JSON, и старый JSON-список правил — он открывается в редакторе, чтобы вы задали имя. Профиль, импортированный из ссылки route, её Base64 или её JSON, также выбирается в поле Профиль маршрутизации (Routing Profile) на вкладке Основные (Common), когда вы нажимаете OK.

Ссылка remoteroute, вставленная здесь, добавляет профили с выключенным автоматическим обновлением, потому что в этом запросе нет флажка Авто-обновление. Позже можно отметить Авто-обновление в редакторе каждого профиля.

remoteroute: добавление удалённых профилей маршрутизации

Добавляет один или несколько удалённых профилей маршрутизации. Ссылка route несёт весь профиль целиком. Ссылка remoteroute несёт только URL: Throne скачивает каждый профиль и может поддерживать его в актуальном состоянии. Используйте её, чтобы распространять профиль маршрутизации, который вы сопровождаете.

throne://remoteroute/<base64>

Полезная нагрузка — Base64 простого списка URL, по одному на строку. Это не JSON:

<profile_url_1>#<name_1>
<profile_url_2>#<name_2>
Часть Обязательна Описание
<profile_url> Да URL, начинающийся с http:// или https://. Строки, которые начинаются иначе, пропускаются.
#<name> Нет Имя профиля. Без него профиль получает имя по хосту URL.

Каждый URL должен отдавать структурированный профиль маршрутизации: ссылку throne://route/, её полезную нагрузку в Base64 или JSON из неё. Raw-профили нельзя использовать как удалённые.

Например, закодируйте эти две строки:

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 перечисляет URL под вопросом «Добавить эти удалённые профили маршрутизации?» (Add these remote routing profiles?) с одним общим флажком Авто-обновление для всех. Флажок отмечен. После подтверждения Throne добавляет профили и скачивает их. В логе видно, сколько профилей получено.

  • Throne обновляет профили с включённым Авто-обновление, только если отмечен флажок Основные настройки → Подписка → Авто-обновление профилей маршрутизации (Routing profiles auto update) → Включить. По умолчанию он снят. Чтобы обновить профили вручную, используйте Обновление (Update) на вкладке Маршрут в Настройки маршрутизации. См. Удалённые профили.
  • Обновление заменяет правила профиля и его outbound по умолчанию скачанными. Имя профиля сохраняется.
  • URL на raw.githubusercontent.com скачиваются через зеркало, выбранное в поле Источник профилей маршрутизации (Remote Rule-set Mirror) на вкладке Основные в Настройки маршрутизации (по умолчанию — зеркало jsDelivr). После изменения файла зеркало ещё некоторое время может отдавать старую копию.
  • Маршруты → Скачать профили (Download Profiles) работает так же: скачивает ссылку remoteroute из репозитория профилей маршрутизации Throne и показывает тот же запрос.

add: добавление одного профиля прокси

Добавляет один профиль прокси в текущую группу.

throne://add/<base64>

Полезная нагрузка — Base64 настроек outbound профиля в формате JSON. На компьютере эта ссылка не запрашивает подтверждения: профиль добавляется сразу, как если бы вы вставили ссылку vless:// или ss://.

Throne создаёт такие ссылки за вас:

  • Щёлкните профили в списке правой кнопкой мыши → Поделиться (Share) → Копировать ссылки выбранных (Диплинк) (Copy links of selected (Deep Links)) или нажмите Ctrl+Alt+C.
  • Щёлкните профиль правой кнопкой мыши → Поделиться → QR-код и ссылка (QR Code and link). Окно показывает либо обычную ссылку для обмена, либо глубокую ссылку. Флажок Deep Link переключает между ними.
  • Группы (Groups) → Редактировать текущую группу (Edit current Group) → Копировать ссылки профилей (Диплинк) (Copy profile share links (Deep Links)).

Глубокая ссылка несёт полную конфигурацию профиля, поэтому подходит и для типов профилей и параметров, у которых нет стандартной ссылки для обмена. Для таких профилей Скопировать ссылки выбранных (Copy links of selected), Ctrl+C, обычно автоматически копирует глубокую ссылку, а окно QR открывается с отмеченным флажком Deep Link. Если у такого профиля есть дополнительные параметры подключения, например привязка к интерфейсу (bind interface), используйте вместо этого Копировать ссылки выбранных (Диплинк).

Ссылки add также работают везде, где работают обычные ссылки для обмена: в подписках, в файлах и в QR-кодах.

На Android

Throne для Android 2.0.0 обрабатывает те же четыре команды. Он также принимает ссылки clash://install-config?url=…&name=…, которые добавляют подписку так же, как addsub. В таких ссылках значение url нужно кодировать процентами. Схема throne:// регистрируется при установке приложения; отдельной настройки для неё нет.

Нажмите на ссылку в другом приложении или используйте Добавить профиль (Add profile) → Импорт из буфера обмена (Import from clipboard) или Отсканировать QR-код (Scan QR code) на экране Конфигурация (Profiles). На Android QR-коды работают для всех четырёх команд. Ссылки route и remoteroute работают также через Import на экране Маршруты (Routing).

Отличия от версии для компьютера:

  • Ссылка add, открытая нажатием в другом приложении, сначала спрашивает «Подтвердите, что хотите импортировать профиль …?» (Confirm you want to import profile …?). Ссылки вроде vless://, открытые из другого приложения, спрашивают то же самое. Из буфера обмена или QR-кода профиль импортируется без вопросов.
  • Импортированный профиль маршрутизации добавляется, но не становится активным. Чтобы использовать его, нажмите на него на экране Маршруты.
  • Raw-профили маршрутизации с компьютера ("raw": true) отклоняются с сообщением «raw routing profiles are not supported on Android» (raw-профили маршрутизации на Android не поддерживаются). Конечные точки в переданном профиле маршрутизации отбрасываются с примечанием.
  • При неизвестной команде сообщение «Ignored deeplink with unknown command: …» (глубокая ссылка с неизвестной командой проигнорирована) показывается на экране, а не только в логе.
  • Для обновлений по расписанию нужны Настройки (Settings) → Подписки (Subscriptions) → Subscription auto update для подписок и Настройки → Routing → Auto update remote profiles для удалённых профилей маршрутизации. Оба параметра по умолчанию выключены.

Приложение для Android тоже умеет создавать такие ссылки: add для профилей и route для профилей маршрутизации.

Устранение неполадок

Эти сообщения относятся к Throne для компьютера.

  • Щелчок по ссылке ничего не делает или браузер спрашивает, каким приложением её открыть. Обработчик ссылок не зарегистрирован для этой копии. В копии Windows из ZIP-архива включите Зарегистрировать ссылки throne:// при запуске (см. Как Throne получает глубокую ссылку). В macOS запускайте Throne из Throne.app. В остальных случаях запустите Throne один раз. Если у вас несколько копий, нажмите Установить (Install) в той копии, которая должна открывать ссылки. Вместо всего этого всегда можно скопировать ссылку и нажать Ctrl+V в Throne.
  • Linux: ссылки по-прежнему не открываются. При регистрации запускается утилита update-desktop-database из пакета desktop-file-utils. Если её не было, установите её, затем нажмите Установить рядом с Зарегистрировать ссылки throne:// при запуске.
  • Ничего не происходит, и лог пуст. Throne молча отбрасывает такие ссылки:
    • ссылку addsub, нагрузка которой не является корректным стандартным Base64, например URL-безопасный Base64 с - или _ либо нагрузка с пробелами или переносами строк;
    • ссылку без косой черты после команды, кроме ссылок add и remoteroute;
    • ссылку с неизвестной командой, нагрузка которой не декодируется.
  • «Проигнорирована глубокая ссылка с неизвестной командой: …» (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)-адресов профилей маршрутизации). Нагрузка 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 или ссылкой route Throne): нагрузка повреждена или обрезана.
    • «Unrecognized route object» (нераспознанный объект маршрута): в JSON нет "kind": "throne-route-profile".
  • «Импортирован(ы) 0 профиль(ей)» (Imported 0 profile(s)) в логе. Нагрузка add повреждена или обрезана. Либо вы отсканировали QR-код со ссылкой addsub, route или remoteroute: скопируйте из лога текст после QR Code Result: и нажмите Ctrl+V.
  • «Ошибка получения профиля удаленной маршрутизации …: …» (Remote routing profile … failed: …) в логе. Профиль добавлен, но его URL не удалось скачать или он не отдаёт структурированный профиль маршрутизации. Исправьте URL или файл, затем используйте Обновление на вкладке Маршрут в Настройки маршрутизации.