Throne API и thronectl
Управляйте Throne из скриптов, с помощью горячих клавиш и с других устройств через Throne API и его клиент командной строки thronectl.
Throne API (начиная с 1.4.0) позволяет скриптам, программам для горячих клавиш и другим устройствам управлять Throne: запускать и останавливать профили, переключать режим TUN и системный прокси, менять профиль маршрутизации, запускать тесты, получать список профилей и статистику трафика. Через него также можно администрировать Throne: импортировать профили, добавлять и обновлять подписки, удалять группы и профили, менять настройки, создавать и восстанавливать резервные копии, перезапускать Throne и завершать его работу.
thronectl — клиент командной строки для API. На этой странице описано, как включить API в Throne для компьютера, как установить и подключить thronectl и что делает каждая команда.
В Headless Throne, который работает без окна на сервере или в контейнере, API включён с первого запуска, а управляют им с помощью thronectl. Как подключиться к нему и настроить его, описано на странице Управление через thronectl.
В Throne для Android нет Throne API.
Включение API в Throne
По умолчанию API выключен.
- Откройте
Настройки(Settings) →Integration Settings, а затем вкладкуThrone API. - Отметьте
Enable the Throne API. Throne создаст новый ключ. - Нажмите
ОК(OK). В полеStatusпоявитсяListening on 127.0.0.1:9095.
На вкладке есть следующие элементы:
| Элемент | Что делает |
|---|---|
Enable the Throne API |
Включает API. |
Listen on |
This computer only (по умолчанию): API слушает 127.0.0.1, поэтому подключаться могут только программы на этом компьютере. Local network: API слушает все адреса компьютера, поэтому подключаться могут и другие устройства. |
Port |
TCP-порт, по умолчанию 9095. |
Allowed addresses |
Только с Local network: IP-адреса и диапазоны, с которых можно подключаться, например 192.168.1.0/24, 10.0.0.5, через запятую или пробел. Если поле пустое, подключаться можно с любого адреса. Программы на этом компьютере всегда могут подключиться через 127.0.0.1. |
Разрешить управление из локальной сети (Allow management from the local network) |
Только с Local network: другие устройства тоже могут отправлять административные запросы, например импорт, изменение настроек и резервное копирование. Программы на этом компьютере могут отправлять их всегда. |
Key |
Секретный ключ длиной 43 символа, который нужен клиентам. Show показывает его, Copy копирует, а Regenerate создаёт новый. |
Copy for scripts |
Копирует две настройки, которые читает thronectl: THRONE_ADDR и THRONE_KEY. С Local network в качестве адреса указывается адрес компьютера в вашей сети. |
Status |
Слушает ли Throne, например Listening on port 9095 (local network), а если нет, то почему, например Port 9095 is in use. |
- Изменения вступают в силу, когда вы нажимаете
ОК. Новый ключ, порт или адрес закрывает открытые подключения. Скрипты со старым ключом перестают работать, поэтому Throne спрашивает подтверждение, прежде чемRegenerateзаменит сохранённый ключ. - С
Local networkокно предупреждает, что устройства в вашей сети могут управлять Throne с помощью ключа. Брандмауэр может спросить, разрешить ли Throne подключения. - Каждый запрос, который что-то меняет, Throne записывает в лог вместе с адресом клиента, например
[API] PUT /v1/connection from 127.0.0.1. В строках, которые начинаются с[API], также видны отклонённые подключения. - Если включён kill switch и API слушает локальную сеть, kill switch пропускает ответы API, поэтому клиенты по-прежнему могут подключиться.
Установка thronectl
thronectl — это одна программа для Linux, Windows, macOS и FreeBSD. Она не входит в пакеты Throne; в образе Docker для headless Throne она есть.
-
Скачайте её со страницы релизов Throne-api, распакуйте и поместите
thronectl(thronectl.exeв Windows) в папку, которая указана вPATH. -
Или, если установлен Go:
go install github.com/throneproj/Throne-api/cmd/thronectl@latest
thronectl version выводит версию программы.
Подключение thronectl к Throne
thronectl читает адрес Throne и ключ из переменных окружения:
| Переменная | Что содержит |
|---|---|
THRONE_ADDR |
Адрес и порт, например 127.0.0.1:9095. По умолчанию: 127.0.0.1:9095. |
THRONE_KEY |
Сам ключ. |
THRONE_KEY_FILE |
Путь к файлу, в котором хранится ключ. |
thronectl никогда не принимает ключ как аргумент командной строки, поэтому ключ не попадает в историю оболочки. Храните его в файле, который можете читать только вы, и укажите этот файл в THRONE_KEY_FILE:
-
В Throne нажмите
Copy for scripts. -
Сохраните в файл строку
THRONE_KEY=…безTHRONE_KEY=, то есть только ключ, например в~/.config/throne/api-key. В Linux и macOS выполните для этого файлаchmod 600. -
Задайте переменные, например в
~/.bashrc:export THRONE_ADDR=127.0.0.1:9095 export THRONE_KEY_FILE=~/.config/throne/api-keyВ PowerShell, например в
$PROFILE:$env:THRONE_ADDR = "127.0.0.1:9095" $env:THRONE_KEY_FILE = "$HOME\throne-api-key.txt" -
Проверьте подключение:
thronectl status
Эти флаги можно указывать до или после команды:
| Флаг | Что делает |
|---|---|
--addr host:port |
Адрес Throne. По умолчанию: THRONE_ADDR, а если она не задана, то 127.0.0.1:9095. |
--key-file file |
Читает ключ из этого файла. Имеет приоритет над THRONE_KEY и THRONE_KEY_FILE. |
--json |
Выводит ответ Throne в формате JSON вместо таблицы. |
--timeout 30s |
Прекращает ожидание через указанное время, по умолчанию 30s. 0 означает ждать столько, сколько нужно Throne. |
Для headless Throne команда Throne --print-connection выводит строки export для обеих переменных. См. Подключение thronectl к Throne.
Команды
thronectl help <command> описывает команду. В своих списках thronectl показывает ID профилей, групп, профилей маршрутизации и тестов; команды принимают эти ID.
| Команда | Что делает |
|---|---|
status |
Показывает состояние, запущенный профиль, режимы, профиль маршрутизации, версию Throne, а если TUN занят чем-то другим, то чем именно. |
groups |
Выводит список групп с их ID. |
profiles [--group N] [--name REGEX] [--ids 1,2] |
Выводит список профилей с результатами их последних тестов. |
connect <id> |
Запускает профиль. --restart перезапускает его, если он уже запущен. |
connect last |
Запускает работающий профиль, если его нет, то последний, а если нет и его, то запомненный. |
connect best [--group N] [--name REGEX] [--max-age 1h] |
Запускает профиль с наименьшей задержкой. Сначала проверяет профили, у которых нет результата новее --max-age. По умолчанию используется группа, которую показывает Throne. |
disconnect |
Останавливает запущенный профиль. |
toggle |
connect last, если ничего не запущено, иначе disconnect. |
tun on, tun off, tun toggle |
Включает или выключает режим TUN. |
proxy on, proxy off, proxy toggle |
Включает или выключает системный прокси. |
routes |
Выводит список профилей маршрутизации. |
route <id> |
Делает профиль маршрутизации активным и перезапускает запущенный профиль. |
test latency, test ip, test speed |
Выполняет тест задержки (URL-тест), тест IP или тест скорости и показывает результаты. Добавьте --group N (при необходимости с --name REGEX) или ID профилей. |
jobs, job <id>, cancel <id> |
Выводит список недавних тестов, показывает один тест, останавливает тест. |
clear |
Удаляет результаты тестов. Добавьте --group N (при необходимости с --name REGEX) или ID профилей. |
live |
Показывает текущую скорость трафика. |
traffic [--by profile] [--by app] [--since 24h] |
Показывает суммарный трафик по профилям (по умолчанию) или по приложениям. --since принимает и дни, например 7d. |
import [--group N] FILE |
Импортирует ссылки для обмена, тело подписки или конфигурацию Clash, sing-box, Xray, WireGuard или OpenVPN из файла размером до 900 KiB. - читает стандартный ввод; с --url URL Throne один раз загружает URL. По умолчанию используется группа, которую показывает Throne. |
sub add <url> [--name NAME] |
Добавляет группу подписки, по умолчанию названную по имени хоста из URL, и обновляет её. --no-auto-update исключает её из автоматических обновлений; с --no-update группа сейчас не загружается. |
sub update <id>…, sub update --all |
Обновляет группы подписок или все группы, кроме архивных. |
group add <name>, group rm <id> |
Добавляет группу; удаляет группу вместе с её профилями. |
profile rm <id>…, profile rm --group N [--name REGEX] |
Удаляет профили. |
settings [get] [KEY…] |
Показывает настройки, которыми управляет API. См. Настройки. |
settings set KEY=VALUE… |
Меняет настройки. true, false и числа передаются как есть, всё остальное — как текст. |
backup create [-o FILE] [--parts LIST] |
Записывает архив .thrbackup, по умолчанию throne-backup-<time>.thrbackup. |
backup restore FILE [--parts LIST] [--yes] |
Показывает содержимое архива, спрашивает подтверждение, восстанавливает архив и перезапускает Throne. Части по умолчанию: profiles,routes,otp,ip_lists. |
rulesets update |
Заново загружает удалённые наборы правил запущенного профиля. |
geo, geo update [geoip] [geosite] [--only-missing] |
Показывает геофайлы Xray; заново загружает их. |
restart |
Перезапускает Throne. |
shutdown [--yes] |
Завершает работу Throne после подтверждения. |
keygen [-o FILE] |
Создаёт новый ключ: выводит его или записывает в новый файл, который можете читать только вы. К Throne не подключается. |
call <METHOD> <PATH> [key=value…] [--body JSON] |
Отправляет любой запрос из спецификации API и выводит ответ. |
completion bash, zsh, fish или powershell |
Выводит скрипт автодополнения для оболочки. |
version |
Выводит версию thronectl. |
Полезно знать:
--name— регулярное выражение, которое не учитывает регистр и может совпадать с любой частью имени. Заключайте его в кавычки в оболочке, например--name 'DE|NL'.--partsпринимает список через запятую из значенийprofiles,routes,settings,otp,ip_listsиicons.- Команды, которые запускают или останавливают профиль, ждут результата, но не дольше
--timeout. Если Throne нужно больше времени,thronectlпоказывает текущее состояние, напримерconnecting, а Throne завершает действие сам. Импорт, обновление, удаление и загрузка ждут так же. С--no-waitкоманда завершается сразу. - Тесты и загрузка геофайлов могут занимать минуты, поэтому задавайте для них больший
--timeout, например--timeout 15m. Тест, который длится дольше, продолжает выполняться в Throne; следите за ним с помощьюthronectl job <id>. - Throne выполняет только один тест за раз, независимо от того, запущен он из окна или через API.
thronectlзавершается с кодом0при успехе;1— при ошибке от Throne (выводится какerror: <code>: <message>), при неудачном обновлении подписки, набора правил или геофайлов или при отрицательном ответе на вопрос;2— при неверной команде или флаге;3— если не удаётся подключиться, ключ отклонён или файл нельзя прочитать.
Настройки
thronectl settings показывает настройки, которые может менять API, а thronectl settings set меняет их, например thronectl settings set log_level=debug kill_switch=true. Throne сначала проверяет каждое значение и ничего не меняет, если хотя бы одно из них неверно.
| Область | Настройки |
|---|---|
| Запуск | remember_enable |
| Логи | log_level, xray_log_level |
| Смешанный входящий порт (mixed) | inbound_enabled, inbound_address, inbound_port |
| Тесты | test_url, test_concurrency, test_timeout_ms |
| Автоматические обновления | sub_auto_update, sub_respect_server_interval, route_auto_update (в минутах, 0 — выключено) |
| Kill switch | kill_switch |
| TUN | tun_strict_route, tun_auto_redirect (Linux), tun_mtu, tun_ipv6, tun_ipv4_cidr, tun_ipv6_cidr |
| Порты и API | dns_in_port, clash_api_port, clash_listen_addr, singbox_api_port |
| DNS и время | remote_dns, direct_dns, ntp_enabled, ntp_server, ntp_interval |
Большинство изменений логов, входящего подключения, портов, DNS и NTP вступают в силу при следующем запуске профиля. Настройкам TUN этот перезапуск нужен, только пока профиль работает в режиме TUN; иначе они применяются при следующем включении режима TUN. Пока перезапуск нужен, thronectl status сообщает об этом; thronectl connect last --restart применяет изменения. Допустимые значения указаны в таблице настроек спецификации.
Административные запросы
Эти команды отправляют административные запросы: import, sub add, group add, group rm, profile rm, settings set, backup, restart и shutdown. Остальные команды, включая sub update, rulesets update и geo update, отправляют запросы управления. Ключ для обоих видов запросов один и тот же.
- Throne отвечает на административные запросы только со своего компьютера, то есть с
127.0.0.1или::1. - С другого устройства они завершаются ошибкой
forbidden, если не включён параметрРазрешить управление из локальной сети(Allow management from the local network). Для headless Throne вместо этого нужен параметр--api-admin-lan. - Архивы резервных копий содержат пароли и ключи ваших профилей и секреты OTP в открытом виде.
thronectlсоздаёт их так, что читать их можете только вы. Не меняйте это и удаляйте архивы, когда они больше не нужны. backup restoreотклоняет архив, профили которого запускали бы программы или читали файлы на компьютере, например профили дополнительного ядра (Extra Core) (invalid_archive). Восстановите такой архив в окне Throne.backup restoreиshutdownспрашивают подтверждение, прежде чем что-либо сделать. В скрипте без терминала добавьте--yes.
При восстановлении settings сохраняются настройки, которые относятся к этому компьютеру: Throne API, входящее подключение и порты, TUN, kill switch, Запомнить последний профиль (Remember last profile), NTP, логирование, системный прокси и пути.
Примеры
Повседневные команды:
thronectl status
thronectl profiles --group 3 --name 'DE|NL'
thronectl connect 12
thronectl tun on
thronectl route 2
thronectl --timeout 2m test latency --group 3
thronectl traffic --by app --since 7d
thronectl sub add 'https://sub.example.com/abc' --name Provider
thronectl --timeout 2m sub update --all
thronectl backup create -o throne.thrbackup
Подключение лучшего профиля
Подключите профиль с наименьшей задержкой в группе, которую показывает Throne. Результаты старше десяти минут проверяются заново:
thronectl connect best --max-age 10m
Подключение самого быстрого профиля
Выполните тест скорости для профилей группы 3, в именах которых есть DE или NL, а затем подключите самый быстрый из них. Для этого нужен jq:
best=$(thronectl --json --timeout 15m test speed --group 3 --name 'DE|NL' |
jq -r '[.results[] | select(.download_bps > 0)] | max_by(.download_bps) | .id // empty')
[ -n "$best" ] && thronectl connect "$best"
Подключение и отключение одной клавишей
Чтобы подключаться и отключаться одной клавишей Stream Deck, макропада или программы для горячих клавиш, назначьте этой клавише команду:
thronectl toggle
Программы, которые запускают команды по нажатию клавиши, часто не читают настройки вашей оболочки. Задайте THRONE_KEY_FILE (и при необходимости THRONE_ADDR) как переменную окружения своей учётной записи пользователя или добавьте к команде --key-file. В Throne для компьютера также есть глобальные горячие клавиши Start/Stop Profile и Toggle Tun Mode.
PowerShell
Пример с тестом скорости в PowerShell:
$job = thronectl --json --timeout 15m test speed --group 3 --name 'DE|NL' | ConvertFrom-Json
$best = $job.results | Where-Object download_bps -gt 0 | Sort-Object download_bps -Descending | Select-Object -First 1
if ($best) { thronectl connect $best.id }
Автодополнение в оболочке
thronectl completion <shell> выводит скрипт, который дополняет команды, флаги, имена настроек, части резервной копии и другие фиксированные значения в bash, zsh, fish и PowerShell. Если Throne отвечает в течение секунды, скрипт также дополняет ID профилей, групп, профилей маршрутизации и тестов вместе с их именами.
# bash: in ~/.bashrc (on macOS, ~/.bash_profile)
eval "$(thronectl completion bash)"
# zsh: in ~/.zshrc
autoload -Uz compinit && compinit
source <(thronectl completion zsh)
# fish
thronectl completion fish > ~/.config/fish/completions/thronectl.fish
# In $PROFILE
thronectl completion powershell | Out-String | Invoke-Expression
Скрипты спрашивают у thronectl, что дополнять, поэтому остаются правильными после обновления thronectl.
Безопасность
- Тот, у кого есть ключ, управляет подключением, режимами и маршрутизацией Throne и может читать имена, адреса, результаты тестов и трафик ваших профилей. С этого компьютера, а также из локальной сети, если включён параметр
Разрешить управление из локальной сети(Allow management from the local network), ключ также позволяет импортировать, удалять, менять настройки и создавать резервные копии, которые содержат ваши учётные данные в открытом виде. - Не указывайте ключ в командных строках и скриптах, которые могут читать другие. Используйте файл ключа, который можете читать только вы, или
THRONE_KEYиз менеджера паролей или хранилища секретов. - Каждое сообщение между
thronectlи Throne шифруется и аутентифицируется с помощью ключа, в том числе в локальной сети. Прямой секретности (forward secrecy) нет: тот, кто узнает ключ, сможет прочитать записанный ранее трафик. - Если ключ утёк, нажмите
Regenerateи передайте скриптам новый ключ. Для headless Throne см. Защита от потери доступа и восстановление. - Оставьте для
Listen onзначениеThis computer only, если API не нужен вам в сети. Если API работает в сети, перечислите вAllowed addressesустройства, которым можно подключаться. - После 5 неудачных попыток подключения за минуту с одного адреса Throne отклоняет этот адрес на 60 секунд. Пока это время не истечёт, блокируются и другие клиенты с тем же адресом, например за тем же роутером. Throne никогда не отклоняет
127.0.0.1и адрес, с которого клиент успешно вошёл за последние 10 минут. - Ответы никогда не содержат учётных данных ваших профилей и URL ваших подписок. Исключение — резервные копии.
Библиотека для Go
Репозиторий Throne-api также содержит библиотеку для Go, github.com/throneproj/Throne-api, с методом для каждого запроса, и спецификацию API с описанием протокола обмена, чтобы вы могли написать клиент на другом языке.