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

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

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

Это удобно для сайтов провайдеров, страниц поддержки, QR-кодов, скриптов или просто для того, чтобы поделиться профилем маршрутизации с другом.

Ссылки, добавляющие подписку или профиль маршрутизации, сначала запрашивают подтверждение: Throne показывает, что именно будет добавлено, и ждёт вашего согласия. Единственное исключение — команда add: она без запроса добавляет один профиль прокси прямо в текущую группу, точно так же, как вставка ссылки vless://.

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

Схема throne:// регистрируется автоматически при первом запуске Throne в Windows, Linux и macOS. Поскольку Throne поставляется в виде переносимого архива без установщика, регистрация выполняется при запуске, не требует прав администратора и восстанавливается автоматически, если вы переместите или обновите папку приложения.

После регистрации Throne принимает глубокую ссылку из любого из этих источников:

  • Щелчок по ссылке throne:// в браузере, мессенджере или документе — ОС передаёт её в Throne.
  • Программа (Program) → Добавить профиль из буфера обмена (Add profile from clipboard) — этот пункт есть и в меню Сервер (Server), горячая клавиша Ctrl+V; он считывает ссылку из буфера обмена.
  • Перетаскивание текста ссылки в главное окно.
  • Передача в качестве аргумента запуска в командной строке (Windows/Linux). В macOS система передаёт URL напрямую уже запущенному приложению.

Если Throne уже открыт, ссылка передаётся существующему окну, а не запускает второй экземпляр.

Формат ссылки

Все глубокие ссылки устроены одинаково — команда, косая черта и полезная нагрузка в Base64:

throne://<command>/<base64_payload>
  • Команда не зависит от регистра (throne://AddSub/... и throne://addsub/... — одно и то же).
  • Косая черта и полезная нагрузка обязательны. Ссылка без /<payload> после команды отбрасывается молча — ничего не происходит и ничего не пишется в журнал.
  • Параметров запроса нет. Всё, что несёт ссылка, находится внутри полезной нагрузки Base64.
КомандаНазначениеЗапрашивает подтверждение?
addsubДобавить группу подписки и сразу обновить еёДа
routeИмпортировать профиль маршрутизации, вложенный в ссылкуДа
remoterouteДобавить один или несколько удалённых профилей маршрутизации по URLДа
addДобавить один профиль прокси в текущую группуНет

Нераспознанная команда игнорируется и отмечается в журнале как Ignored deeplink with unknown command.

Какой алфавит Base64 использовать

Это важно, и для разных команд требования отличаются:

КомандаДопустимая кодировка
addsubТолько стандартный Base64 (алфавит с + и /). Сохраняйте заполнение =.
remoterouteТолько стандартный Base64 (алфавит с + и /). Сохраняйте заполнение =.
routeURL-безопасный Base64, стандартный Base64 или даже обычный незакодированный JSON.
addСоздаётся самим Throne — см. add ниже.

Для addsub и remoteroute URL-безопасная нагрузка, содержащая - или _, не декодируется, и ссылка будет отклонена. Кодируйте стандартным алфавитом.

addsub — Добавление подписки

Добавляет новую группу подписки и сразу же обновляет её.

throne://addsub/<base64>

Полезная нагрузка — это Base64 одной строки:

<subscription_url>[#<group_name>]
ЧастьОбязательноОписание
<subscription_url>ДаURL подписки.
#<group_name>НетИмя новой группы, записанное как фрагмент URL. Если опущено, используется хост URL подписки.

Автообновление не является частью ссылки. Throne спрашивает о нём в диалоге подтверждения, и флажок Auto update по умолчанию установлен.

Пример

Чтобы добавить https://example.com/sub/abc123 как группу с именем MyProvider, закодируйте в Base64 строку:

https://example.com/sub/abc123#MyProvider

и используйте результат как полезную нагрузку:

throne://addsub/aHR0cHM6Ly9leGFtcGxlLmNvbS9zdWIvYWJjMTIzI015UHJvdmlkZXI=

Throne попросит подтверждение:

Добавить эту подписку?

Имя: MyProvider URL: https://example.com/sub/abc123

☑ Автообновление

После подтверждения группа создаётся, и подписка загружается немедленно.

Поскольку всё целиком кодируется в Base64, URL подписки не нужно кодировать процентами — его символы ?, & и / надёжно скрыты внутри полезной нагрузки. А вот имя группы стоит закодировать процентами, если в нём есть пробелы или другие специальные символы (пробел становится %20).

route — Импорт профиля маршрутизации

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

throne://route/<base64>

Полезная нагрузка — профиль маршрутизации, закодированный в Base64. Сам Throne создаёт URL-безопасный Base64 (с заполнением или без); стандартный Base64 и обычный незакодированный JSON также принимаются.

Как создать ссылку route

Обычно такие ссылки не составляют вручную — Throne создаёт их за вас:

  1. Откройте Меню маршрутизации (Routing Menu) → Настройки маршрутизации (Routing Settings).
  2. Выберите профиль маршрутизации, которым хотите поделиться.
  3. Нажмите Ctrl+C (или воспользуйтесь действием экспорта).

Throne скопирует в буфер обмена готовую ссылку вида throne://route/.... Отправьте её кому угодно; когда получатель откроет её (или вставит в Настройках маршрутизации через Ctrl+V, или воспользуется пунктом Добавить профиль из буфера обмена), Throne покажет имя профиля и все примечания, а после подтверждения импортирует его.

Что внутри полезной нагрузки

Base64 декодируется в небольшую JSON-оболочку, описывающую профиль:

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

Так что ссылка выглядит следующим образом (полезная нагрузка — это Base64 указанного JSON):

throne://route/eyJraW5kIjoidGhyb25lLXJvdXRlLXByb2ZpbGUiLCJ2IjoxLCJuYW1lIjoiQnlwYXNzIExBTiIsImRlZmF1bHRfb3V0Ym91bmQiOiJwcm94eSIsInJ1bGVzIjpbXX0

Профили, созданные из написанной вручную секции route, содержат "raw": true и объект route вместо rules; при импорте Throne заново сопоставляет ссылки на исходящие соединения по имени и сообщает обо всём, что не удалось разрешить.

При импорте из буфера обмена Throne распознаёт ту же полезную нагрузку и в виде обычного JSON, и в виде «голого» Base64, поэтому ссылка, скопированная с другой машины, работает, даже если по пути потеряла префикс throne://route/. Устаревший простой массив правил тоже принимается — он открывается в редакторе, чтобы вы задали имя и исходящее соединение по умолчанию.

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

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

throne://remoteroute/<base64>

Полезная нагрузка — это Base64 обычного списка URL, разделённых переводами строк, а не JSON:

<profile_url_1>[#<name_1>]
<profile_url_2>[#<name_2>]
...
ЧастьОбязательноОписание
<profile_url>ДаСсылка http:// или https:// на профиль маршрутизации. Строки, не являющиеся корректными http(s)-адресами, пропускаются.
#<name>НетОтображаемое имя профиля, записанное как фрагмент URL. Если опущено, используется хост URL.

Автообновление задаётся не для каждой записи отдельно. Throne спрашивает один раз в диалоге подтверждения, и ответ применяется ко всем профилям из ссылки. Флажок Auto update по умолчанию установлен.

Пример

Закодируйте в Base64 этот список из двух строк:

https://example.com/routes/bypass-iran.json#BypassIran
https://example.com/routes/ads.json

и используйте результат как полезную нагрузку:

throne://remoteroute/aHR0cHM6Ly9leGFtcGxlLmNvbS9yb3V0ZXMvYnlwYXNzLWlyYW4uanNvbiNCeXBhc3NJcmFuCmh0dHBzOi8vZXhhbXBsZS5jb20vcm91dGVzL2Fkcy5qc29u

Throne перечислит всё, что добавит ссылка, и дождётся вашего подтверждения:

Добавить эти удалённые профили маршрутизации?

  1. https://example.com/routes/bypass-iran.json
  2. https://example.com/routes/ads.json

☑ Автообновление

После подтверждения каждый профиль добавляется и сразу же загружается. Профили с включённым автообновлением затем обновляются в фоне с интервалом Routing profiles auto update из Основных настроек (Basic Settings) (интервал меньше 30 минут отключает обновления).

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

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

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

throne://add/<base64>

Полезная нагрузка — Base64 исходящего JSON профиля, того самого объекта, который Throne экспортирует для сервера. В отличие от трёх других команд, эта не запрашивает подтверждение: профиль добавляется прямо в текущую группу, ровно так же, как если бы вы вставили ссылку vless:// или ss://.

Такие ссылки не составляют вручную. Throne создаёт их за вас:

  • Сервер (Server) → Поделиться (Share) → Copy links of selected (Deep Links) (Ctrl+Alt+C)
  • Окно «Поделиться»/QR показывает глубокую ссылку рядом с обычной ссылкой для обмена
  • Кнопка Copy profile share links (Deep Links) в редакторе группы

Глубокие ссылки полезны для протоколов и параметров, у которых нет стандартного URL-адреса вида ://, поскольку полная JSON-конфигурация переживает передачу без потерь.

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

  • Щелчок по ссылке ничего не делает / браузер спрашивает, каким приложением её открыть. Запустите Throne один раз, чтобы он зарегистрировал схему, затем попробуйте снова. Если вы переместили папку Throne, просто запустите его ещё раз — регистрация восстанавливается при старте.
  • Вообще ничего не происходит, и журнал пуст. Скорее всего, в ссылке нет косой черты и полезной нагрузки после команды (throne://addsub вместо throne://addsub/<base64>) либо её Base64 не удалось декодировать. Оба случая отбрасываются молча.
  • «Ignored deeplink with unknown command». Часть с командой — не addsub, route, remoteroute или add. Проверьте написание слова сразу после throne://.
  • «The link did not contain a subscription URL». Полезная нагрузка addsub декодировалась, но перед # не оказалось URL — убедитесь, что вы закодировали <url>#<name>, а не только #<name>.
  • «Base64 is invalid.» / «Deep link has no data». Полезная нагрузка пуста или не декодируется. Для addsub и remoteroute убедитесь, что использован стандартный Base64: URL-безопасная нагрузка с - или _ отклоняется.
  • «The link did not contain any valid remote routing profiles». Ни одна из декодированных строк не начинается с http:// или https://. Помните, что полезная нагрузка — это список URL, разделённых переводами строк, а не массив JSON.
  • «The link could not be parsed». Полезная нагрузка route не является корректным JSON, Base64 или ссылкой Throne route — либо это JSON-объект без маркера "kind": "throne-route-profile".