Skip to content

feat(registrar): Clash 节点轮换 — 单代理下多线程注册走不同出口 IP - #10

Merged
1parado merged 1 commit into
1parado:mainfrom
shiaho777:clash-node-rotation
Aug 13, 2026
Merged

feat(registrar): Clash 节点轮换 — 单代理下多线程注册走不同出口 IP#10
1parado merged 1 commit into
1parado:mainfrom
shiaho777:clash-node-rotation

Conversation

@shiaho777

Copy link
Copy Markdown
Collaborator

问题

注册机在单代理场景下(如 Clash 单端口 127.0.0.1:7890)强制并发 = 1,Workers > 1 完全无效。多账号注册走同一出口 IP,容易触发 Cloudflare 风控(卡挑战页)。

根本原因在 gate.go

if proxies <= 1 {
    return 1  // 锁死并发
}

方案

通过 Clash/mihomo 外部控制器 API,在每个账号注册前自动将 Selector 组切换到不同节点,让连续注册走不同出口 IP。

利用 browserGate 的互斥锁保证切换不冲突:worker 在 gate.Acquire() 后独占切换节点 → 注册全程 IP 稳定 → gate.Release() 后下一个 worker 切到另一个节点。

改动

文件 改动
gate.go 放开 proxies <= 1 的并发锁,改为 return workers
clash_rotator.go (新增) ClashRotator 组件 + AutoDetectClash()
service.go run() 创建 rotator,runOne() 在 Acquire 后切节点
types.go 新增 clash_controller / clash_selector_group 配置
server/ 新增 /api/registrar/clash-autodetect 端点
ui/ 高级选项加输入框 + 「🔍 自动检测 Clash」按钮

ClashRotator 核心 API

// 从 Clash API 动态拉取组内节点(自动过滤流量/到期等伪节点)
rotator.RefreshNodes(ctx)

// round-robin 返回不同节点
node := rotator.NextNode()

// PUT /proxies/{group} 切换节点
rotator.SelectNode(ctx, node)

自动检测(零配置)

AutoDetectClash() 扫描本地 9090 / 9097 / 9091 等常见端口,发现 Clash 控制器后自动:

  1. 读取核心版本
  2. 列出所有 Selector 组
  3. 选节点最多的组(排除 GLOBAL)
  4. 自动填入控制器 URL + 组名

用户只需 Clash 客户端在运行,点一下按钮即可。

兼容性

  • 不填 Clash 字段时完全回退原行为(零影响)
  • 多代理场景行为不变
  • 协议不挑(ss/vmess/vless/anytls/trojan),切换由 Clash 核心完成
  • 支持 FlClash / ClashVerge / ClashX / mihomo 等所有兼容客户端

实测

  • Clash mihomo v1.10.0,47 个节点
  • Workers=2,两个浏览器分别走 🇭🇰 香港 Z01(141.11.146.67)和 🇯🇵 日本 Z01(103.151.173.207
  • 连续注册成功,零 Cloudflare 卡顿

@shiaho777

Copy link
Copy Markdown
Collaborator Author
image

@shiaho777

Copy link
Copy Markdown
Collaborator Author
image 一个机场就能无限代理

@shiaho777
shiaho777 force-pushed the clash-node-rotation branch from b84aab8 to a2f5e11 Compare August 13, 2026 05:12
@shiaho777

Copy link
Copy Markdown
Collaborator Author
image

问题:注册机在单代理(如 Clash 单端口 7890)下强制并发=1,
Workers>1 无效。多账号注册走同一出口 IP 容易触发 Cloudflare 风控。

方案:通过 Clash/mihomo 外部控制器 API,在每个账号注册前自动将
Selector 组切换到不同节点,让连续注册走不同出口 IP。

改动:
- gate.go: 放开 proxies<=1 时强制 return 1 的并发锁,改为 return workers
- clash_rotator.go (新增): ClashRotator 组件
  - RefreshNodes(): 从 Clash API 动态拉取组内节点(自动过滤流量/到期等伪节点)
  - NextNode(): round-robin 返回不同节点
  - SelectNode(): PUT /proxies/{group} 切换节点
  - AutoDetectClash(): 扫描本地 9090/9097/9091 端口自动发现 Clash 控制器
    + Selector 组,零配置使用
- service.go: run() 创建 rotator,runOne() 在 gate.Acquire() 后切节点
  (gate 互斥保证切换不冲突)
- types.go: 新增 clash_controller / clash_selector_group 配置字段
- server: 新增 /api/registrar/clash-autodetect 端点
- UI: 高级选项加 Clash 控制器/组名输入框 + 「自动检测」按钮

不破坏现有功能:多代理场景行为不变;不填 Clash 字段时完全回退原行为。
@shiaho777
shiaho777 force-pushed the clash-node-rotation branch from a2f5e11 to 263f36a Compare August 13, 2026 05:14
@paperwang12

Copy link
Copy Markdown

very cool,This concurrent design was implemented due to the vulnerability of previous registration tools to anti-fraud measures, resulting in a mandatory concurrent registration limit of 1. Now concurrent registrations are possible.

@1parado

1parado commented Aug 13, 2026

Copy link
Copy Markdown
Owner

look good to me

@1parado
1parado merged commit 6dd1b1d into 1parado:main Aug 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants