
API切换单个策略组的标准接口
调用PUT /proxies端点切换策略组
Clash VPN的外部控制器API提供了切换策略组节点的标准接口,允许第三方程序通过发送HTTP请求更改指定策略组当前选中的节点。该接口为PUT /proxies/{groupName},请求体为{"name": "targetNode"},其中{groupName}为策略组名称,targetNode为目标节点名称。当服务端成功处理后返回204状态码表示切换成功,若策略组不存在或节点名称错误则返回400或404错误。该接口是自动化切换节点的基础能力。
获取可用节点列表后再执行切换
在调用切换接口之前,建议先通过GET /proxies接口获取所有策略组及其可用节点的完整列表,确认目标节点是否存在于该策略组的all列表中。若目标节点不在策略组的可用节点列表中,切换请求将失败并返回错误响应。该预检步骤可避免因节点名称拼写错误或节点已从该策略组移除而导致的切换失败,提高自动化脚本的健壮性。
切换成功后的状态同步
成功切换策略组节点后,新节点立即生效,所有新建连接将使用新节点进行路由,但已存在的活跃连接仍沿用旧节点直至自然断开。如需让新连接立即全部使用新节点,可在切换后调用DELETE /connections接口强制关闭所有活跃连接,应用自动重新建立连接时即使用新节点。该操作与节点切换配合使用,可实现无缝的节点更换。
API本身不支持批量切换多个策略组
设计上无批量切换的专用端点
Clash API的/proxies/{groupName}端点设计为单策略组操作,每次调用只能针对一个策略组进行节点切换。API设计中没有提供类似/proxies/batch或/proxies/switch-all这样的批量切换端点,无法通过单次请求同时切换多个策略组。若需要实现多个策略组同时切换的效果,必须在外部程序中对多个策略组依次调用PUT /proxies/{groupName}接口。
单请求仅作用于单一策略组
每个PUT /proxies/{groupName}请求的URL路径中必须指定具体的策略组名称,请求体仅包含目标节点名称,不包含任何指示“同时修改其他策略组”的字段。该设计的初衷是精确控制单个策略组的行为,避免因一次请求影响多个策略组而导致的不可预期结果。对需要同时切换多个策略组的场景,需通过多次独立的API请求实现。
切换操作的原子性限制
多次独立的API请求无法保证原子性,若在批量切换过程中某次请求失败,可能出现部分策略组已切换而部分未切换的不一致状态。Clash API本身不提供事务机制来确保多策略组切换的一致性,开发者需在程序中自行处理异常捕获和状态回滚。若切换过程中发生网络中断或Clash异常,可能导致策略组状态不一致。
通过编程方式实现批量切换效果
循环调用API实现多策略组切换
由于API原生不支持批量切换,实际应用中的批量切换通常借助编程方式实现。开发者可先通过GET /proxies获取所有策略组列表,筛选出需要切换的策略组名称,然后循环调用PUT /proxies/{groupName}为每个策略组分别设置目标节点。这种方式在技术上可实现多个策略组同时切换的结果,但底层仍由多个独立的API请求完成,并非原子操作。
筛选需要切换的策略组类型
在批量切换前,需明确需要切换的策略组类型,因为不同类型策略组的切换逻辑不同。select类型组可通过PUT /proxies/{groupName}切换节点;url-test和fallback类型组不支持手动切换,其节点选择由Clash内核的自动逻辑控制,调用切换接口会返回错误。在批量切换时需先筛选出类型为select的策略组,仅对这些组执行切换操作,避免对自动类型组的无效调用。
切换失败时的错误处理策略
在循环切换过程中,需为每次切换请求添加错误处理逻辑,确保某次请求失败不影响后续策略组的切换。常见的错误包括策略组不存在、节点不在可用列表中、Clash API服务中断等。程序应捕获每次请求的响应状态,记录失败信息并继续处理剩余策略组。切换完成后输出成功和失败的统计结果,便于用户了解切换状态并手动处理失败的策略组。
批量切换的最佳实践方案
使用脚本封装批量切换逻辑
将批量切换逻辑封装为可复用脚本,方便在需要时一键执行。脚本的核心流程为:通过GET /proxies获取策略组列表,筛选出select类型的策略组,对每个策略组调用PUT /proxies/{groupName}并指定目标节点名称。脚本支持通过命令行参数指定目标节点,或从配置文件中读取预设的目标节点映射。封装后的脚本可在终端中快速执行,避免每次手动调用多个curl命令。
编写配置驱动型切换脚本
对于需要频繁切换的场景,可编写配置驱动型脚本,通过外部配置文件定义策略组与节点的对应关系。配置示例为{"Proxy": "香港节点", "Game": "日本节点", "Stream": "美国节点"},脚本读取该配置后自动为每个策略组切换至对应的节点。这种方案支持不同策略组使用不同节点,比统一切换更具灵活性,且修改配置无需调整脚本代码。
通过Dashboard面板手动批量切换
对于不熟悉编程的用户,可通过Dashboard面板手动完成多个策略组的节点切换。在YACD或zashboard面板中,逐一选择每个select策略组并从中选择目标节点,该操作即为单次API调用在UI上的映射。虽然Dashboard面板不支持一键批量切换,但可视化的操作方式降低了切换门槛,适合策略组数量较少时的日常使用。
批量切换的注意事项与限制
url-test和fallback组无法通过API切换
url-test类型组由Clash内核按照延迟测速结果自动选择节点,fallback类型组按照预设优先级自动切换,两者均不支持通过PUT /proxies/{groupName}接口手动切换节点。若对这两类分组调用切换接口,Clash会返回400错误。批量切换时需先通过GET /proxies获取各组类型信息,仅对select类型组执行切换操作。
策略组嵌套场景下的切换限制
若策略组之间存在嵌套关系(如外层select组引用了内层url-test子组),切换外层组仅改变外层引用的子组,不改变内层子组的自动选线逻辑。若需改变最终出口节点,应切换最底层的select组而非顶层组。在批量切换前需分析策略组的层级结构,明确哪些组是实际控制出口的节点,避免切换无效组。
并发切换请求可能导致的冲突
若多个客户端或脚本同时对Clash API发起切换请求,可能产生竞态条件,导致策略组节点在切换过程中被多次覆盖。例如脚本A将某策略组切换至节点X,脚本B在同一瞬间将其切换至节点Y,最终结果取决于请求到达的先后顺序。在需要并发控制的场景中,建议在脚本层实现互斥锁或队列机制,避免对同一策略组的并发修改。
常见问题FAQ
通过API一次请求能切换多个分组吗?
不能。Clash的API设计没有提供批量切换多个策略组的接口,每个PUT /proxies/{groupName}请求只能切换一个策略组。若需同时切换多个分组,需在程序中多次调用API接口,通过循环或遍历方式依次切换。
如何在脚本中实现批量切换?
使用循环遍历目标策略组列表,为每个策略组分别调用PUT /proxies/{groupName}接口。具体步骤为:先通过GET /proxies获取所有策略组信息,筛选出类型为select的策略组,然后依次发送切换请求。若所有分组使用相同的目标节点,则切换操作完全一致。
url-test和fallback类型的分组能通过API切换吗?
不能。url-test和fallback类型组由Clash内核自动控制节点选择,不支持通过PUT /proxies/{groupName}接口手动切换。若对这些分组调用切换接口,Clash会返回400错误。在批量切换前需通过GET /proxies获取策略组类型,仅对select类型组执行切换。
切换多个策略组时中途失败怎么办?
切换过程中某次请求失败时,已切换的策略组不会自动回滚,可能出现部分切换部分未切换的不一致状态。程序应在每次请求后检查响应状态,记录成功和失败的策略组列表,并在切换完成后输出统计结果。若需完全一致性,可在切换前备份当前节点状态,失败时手动恢复或实现自定义回滚逻辑。