Throne API 与 thronectl
通过 Throne API 及其命令行客户端 thronectl,从脚本、热键和其他设备控制和管理 Throne。
Throne API(自 1.4.0 起)让脚本、热键工具和其他设备可以控制 Throne:启动和停止配置档、切换 TUN 模式和系统代理、更改路由配置档、运行测试,以及读取配置档和流量统计。它还可以管理 Throne:导入配置档、添加和更新订阅、删除分组和配置档、更改设置、备份和恢复,以及重启或退出 Throne。
thronectl 是该 API 的命令行客户端。本页介绍如何在 Throne 桌面版中开启 API、如何安装并连接 thronectl,以及每条命令的作用。
无界面 Throne 在服务器或容器中以无窗口方式运行,它从首次启动起就开启了 API,你需要用 thronectl 来管理它。使用 thronectl 管理介绍了如何连接并设置它。
Throne for Android 没有 Throne API。
在 Throne 中开启 API
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(默认)监听 127.0.0.1,因此只有这台电脑上的程序可以连接。Local network 监听这台电脑的所有地址,因此其他设备也可以连接。 |
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。 |
- 更改在你点击
确定(OK)后生效。新的密钥、端口或地址会关闭已打开的连接。使用旧密钥的脚本会停止工作,因此在Regenerate替换已保存的密钥之前,Throne 会先询问你。 - 使用
Local network时,窗口会警告你:你网络中的设备可以凭密钥控制 Throne。你的防火墙可能会询问是否允许 Throne。 - Throne 会把每个会更改内容的请求连同客户端地址写入日志,例如
[API] PUT /v1/connection from 127.0.0.1。以[API]开头的行也会显示被拒绝的连接。 - 如果开启了断网保护(kill switch),并且 API 在局域网上监听,断网保护会放行 API 的响应,因此客户端仍然可以连接。
安装 thronectl
thronectl 是一个适用于 Linux、Windows、macOS 和 FreeBSD 的单一程序。它不包含在 Throne 软件包中;无界面 Throne 的 Docker 镜像中包含它。
-
从 Throne-api 的发布页面下载并解压,然后把
thronectl(在 Windows 上为thronectl.exe)放到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 从不接受以命令行参数形式给出的密钥,因此密钥不会出现在你的 shell 历史记录中。请把密钥保存在只有你能读取的文件中,并让 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 |
以 JSON 而不是表格的形式打印 Throne 的响应。 |
--timeout 30s |
超过这段时间后放弃,默认为 30s。0 表示一直等到 Throne 完成。 |
对于无界面 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 |
从一个不超过 900 KiB 的文件导入分享链接、订阅内容,或 Clash、sing-box、Xray、WireGuard 或 OpenVPN 配置。- 表示从标准输入读取;--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 的 geo 文件;重新下载它们。 |
restart |
重启 Throne。 |
shutdown [--yes] |
询问后退出 Throne。 |
keygen [-o FILE] |
创建一个新密钥:打印它,或把它写入一个只有你能读取的新文件。它不会连接 Throne。 |
call <METHOD> <PATH> [key=value…] [--body JSON] |
发送 API 规范中的任意请求,并打印响应。 |
completion bash、zsh、fish 或 powershell |
打印一个 Shell 补全脚本。 |
version |
打印 thronectl 的版本。 |
需要了解的几点:
--name是一个不区分大小写的正则表达式,可以匹配名称中的任意部分。请在 shell 中给它加上引号,例如--name 'DE|NL'。--parts接受一个用逗号分隔的列表,可包含profiles、routes、settings、otp、ip_lists和icons。- 启动或停止配置档的命令会等待结果,最长等待
--timeout。如果 Throne 需要更长时间,thronectl会显示当前状态(例如connecting),Throne 会自行完成操作。导入、更新、删除和下载也以同样的方式等待。--no-wait会立即返回。 - 测试和 geo 下载可能需要几分钟,因此请给它们更长的
--timeout,例如--timeout 15m。耗时更长的测试会在 Throne 中继续运行;可以用thronectl job <id>跟踪它。 - Throne 同一时间只运行一个测试,无论你是从窗口还是通过 API 启动它。
thronectl成功时以0退出;以下情况以1退出:Throne 返回错误(打印为error: <code>: <message>)、订阅、规则集或 geo 更新失败,或者对询问回答了否;命令或参数错误时以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 |
| 混合入站 | 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 |
| 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)。无界面 Throne 则需要改用--api-admin-lan。 - 备份存档以明文形式包含你的配置档的密码和密钥,以及你的 OTP 密钥。
thronectl创建的存档只有你能读取。请保持这种状态,并在不再需要时删除它们。 - 如果存档中的配置档会在电脑上运行程序或读取文件(例如额外核心(Extra Core)配置档),
backup restore会拒绝该存档(invalid_archive)。请在 Throne 窗口中恢复这类存档。 backup restore和shutdown会在执行前询问。在没有终端的脚本中,请加上--yes。
恢复 settings 时,会保留属于这台电脑的设置:Throne API、入站和端口、TUN、断网保护、记住上次的配置档(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
通过按键启动命令的程序通常不会读取你的 shell 设置。请把 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 }
Shell 补全
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 之间的每条消息都使用密钥加密和认证,在局域网上也是如此。它不提供前向保密:获得密钥的人可以读取之前录下的流量。- 如果密钥泄露,请点击
Regenerate,并把新密钥交给你的脚本。对于无界面 Throne,请参见防锁定与恢复。 - 除非你需要在网络上使用 API,否则请让
Listen on保持为This computer only。在网络上使用时,请在Allowed addresses中列出允许连接的设备。 - 如果同一地址在一分钟内连接失败 5 次,Throne 会在 60 秒内拒绝该地址。在此期间,同一地址的其他客户端(例如位于同一路由器之后的设备)也会被锁定。Throne 从不拒绝
127.0.0.1,也不会拒绝在过去 10 分钟内有客户端成功登录过的地址。 - 响应中从不包含你的配置档的凭据或你的订阅的 URL。备份是例外。
Go 库
Throne-api 仓库还包含一个 Go 库 github.com/throneproj/Throne-api,它为每种请求都提供了一个方法;仓库中还有包含通信协议的 API 规范,因此你可以用其他语言编写客户端。