- 本文记录了为解决 Clash 订阅更新问题所进行的一系列尝试和最终实现的自动化方案。
- 主要目标是克服订阅链接中 token 频繁变化带来的不便,并最终实现近乎全自动化的 Clash 订阅更新。
背景与痛点 🤔
-
使用某机场提供的 Clash 订阅服务,该服务通过订阅链接提供配置信息。
-
需要在手机、电脑和服务器上使用 Clash。
-
订阅链接中的 token 会定期更新,每次都需要手动更新所有设备的配置,令人苦不堪言 😫。
-
核心需求:
- 实现多设备共享 Clash 配置。
- 终极目标: 尽可能减少手动操作,实现全自动更新。
初始方案与架构
1. 局域网共享 (临时方案) 🔗
- 最初,为了在手机上使用 Clash,利用电脑作为中转。
- 电脑运行 Clash 后,手机通过局域网连接到电脑的 Clash 端口。
- 再由电脑代理流量。
- 问题: 电脑需要保持开机状态,关机了,手机也没网了。自动化程度:低。
2. 引入服务器 🖥️
- 为了更稳定地使用,在服务器上部署了 Clash for Linux。
- 所有设备都可以通过系统代理连接到服务器上的 Clash,再由服务器连接到机场。
- 小服务器 24 小时在线~
- 问题:
- 仍然需要手动更新所有设备的 Clash 配置。
- 小服务定时脚本更新 Clash Docker,但无法应对订阅链接的变动。
- 还需要手动重启 Docker。
- 自动化程度 :中(服务器 Clash 更新)。
解决 Token 动态变化:Cloudflare Worker 的尝试与转向 ☁️
-
有了 Cloudflare 能解决本地网络访问不到的问题
-
使用预设的固定 token 替换请求中的 token 参数,
- 不妨碍其他小伙伴使用这个服务。
-
并修改 Clash 配置文件的部分内容。
-
在编写 Cloudflare Worker 脚本的时候就想过包括登录,
- 但是碰到了 ja3 指纹的问题,
- 所以放弃,这个东西用 Python 也很难解决。
Cloudflare Worker 的主要功能:
- 接收客户端发出的订阅请求,避免客户端访问不到机场的问题。
- 如果是特定的 key 请求,则将其替换为预设的 token,减少多端改动。
- 修改从机场获取的 Clash 配置文件内容,例如:
- 设置
interval为180秒,提高更新频率。 - 添加
tolerance: 2000,增强更新的稳定性。
- 设置
- 伪装
User-Agent,避免订阅接口的拦截。 - 将修改后的 Clash 配置文件返回给客户端。
Cloudflare Worker 脚本:
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
var { pathname, search } = url;
if (search === "?token=KEYTOKEN") {
search = "?token=ASpecialToken";
}
const base_url = `https://bbb.aaa.com/api/v1/client/subscribe${search}`;
const modifiedHeaders = new Headers(request.headers);
modifiedHeaders.set('User-Agent', 'ClashForWindows/0.15.10');
const modifiedRequest = new Request(request, { headers: modifiedHeaders });
const image_response = await fetch(base_url, modifiedRequest);
const body = await image_response.text();
const modifiedYaml = body.replace(/(interval:)\s*\d+/g, '$1 180');
const modifiedYamlWithTolerance = body.replace(/(interval: 180)/g, '$1, tolerance: 2000');
return new Response(modifiedYamlWithTolerance, {
status: image_response.status,
statusText: image_response.statusText,
headers: image_response.headers,
});
},
};
优势:
- 无需在客户端设备上直接配置机场订阅链接。