304 lines
8.5 KiB
Markdown
304 lines
8.5 KiB
Markdown
# 🎯 Windsurf 注册自动化 - 当前状态与问题
|
||
|
||
## ✅ 已完成
|
||
|
||
1. **CapSolver 集成** - 完成
|
||
- API Key: `CAP-028D3BE0F462CE98724F8568BBC87F692646994A91999FB986A2A5E4BE6BF65A`
|
||
- 已保存到 `.env` 文件
|
||
- 代码集成完成(`solveWithCapSolver` 方法)
|
||
- 价格: $1.20/1000次
|
||
- 成功率: 99%+
|
||
|
||
2. **浏览器方案确定** - rebrowser-puppeteer
|
||
- 使用: `"puppeteer": "npm:rebrowser-puppeteer@^23.9.0"`
|
||
- 内置反检测,不需要额外配置
|
||
- 已改回使用 `require('puppeteer')` 而不是 `puppeteer-real-browser`
|
||
|
||
---
|
||
|
||
## ⚠️ 当前问题
|
||
|
||
### 核心问题:浏览器选择混乱
|
||
|
||
**历史记录**:
|
||
1. ✅ 最初使用 rebrowser-puppeteer - **可以绕过 Cloudflare**
|
||
2. ❌ 切换到 puppeteer-real-browser (turnstile: false) - 需要手动点击
|
||
3. ❌ 尝试 puppeteer-real-browser (turnstile: true) - **在付款页面出现循环点击问题**
|
||
4. ❌ 尝试 Playwright - Cloudflare 检测失败
|
||
5. ✅ **应该回到 rebrowser-puppeteer** - 原本就可以用
|
||
|
||
**问题根源**:
|
||
- rebrowser-puppeteer **本身就能绕过 Cloudflare**
|
||
- 不需要 puppeteer-real-browser 的 turnstile 功能
|
||
- puppeteer-real-browser 在付款页面有干扰
|
||
|
||
---
|
||
|
||
## 🔧 当前测试方案
|
||
|
||
### ✅ 方案:rebrowser-puppeteer + CapSolver(已按官方文档修复)
|
||
|
||
**CapSolver API 调用(已验证正确)**:
|
||
- ✅ 使用 `AntiTurnstileTaskProxyLess`
|
||
- ✅ 1 秒轮询(官方推荐)
|
||
- ✅ 120 秒超时
|
||
- ✅ 错误检测和处理
|
||
- ✅ Token 获取正确
|
||
|
||
**当前问题(2025-11-17 11:00 - 已修复)**:
|
||
- ✅ API Key 正确配置
|
||
- ✅ Sitekey 动态获取改进(增加调试日志)
|
||
- ✅ Token 注入方式完全重写
|
||
|
||
**核心问题(已识别)**:
|
||
- ❌ **Token 注入方式不正确**:之前只是简单设置 input.value
|
||
- ❌ **没有使用 window.turnstile API**
|
||
- ❌ **没有正确触发 Turnstile 回调机制**
|
||
|
||
**修复方案(2025-11-17 11:00 已实施)**:
|
||
1. ✅ 改进 sitekey 获取逻辑(增加来源追踪和 Widget ID 获取)
|
||
2. ✅ 使用 5 种方法注入 token:
|
||
- 方法 1: `window.turnstile.reset()` + `window.turnstile.render()` 重新渲染
|
||
- 方法 2: 直接设置 hidden input 值并触发事件
|
||
- 方法 3: 调用页面回调函数
|
||
- 方法 4: 使用 `window.turnstile.ready()`
|
||
- 方法 5: 操作 iframe(如果可访问)
|
||
3. ✅ 改进验证完成检测(检查按钮、token、iframe状态)
|
||
4. ✅ 增加详细调试日志
|
||
|
||
**修复关键代码**:
|
||
- Line 403-454: 改进 sitekey 获取,返回 {sitekey, method, widgetId}
|
||
- Line 545-684: 完全重写 token 注入逻辑,使用 window.turnstile API
|
||
- Line 660-684: 改进验证完成检测
|
||
|
||
---
|
||
|
||
## 🚨 最新发现的关键问题(2025-11-17 13:18)
|
||
|
||
### 问题:CapSolver 扩展干扰 Stripe 支付页面
|
||
|
||
**现象**:
|
||
- 步骤1-5全部成功完成
|
||
- 到达Stripe支付页面后,填写银行卡信息
|
||
- 点击"订阅"按钮后,出现错误:"我们未验证该卡的付款方式"
|
||
- 或触发额外的 hCaptcha 验证
|
||
- 银行卡信息完全正确(已验证)
|
||
|
||
**验证测试**:
|
||
- ✅ 复制Stripe支付链接到**真实浏览器**(无CapSolver扩展)
|
||
- ✅ 使用**完全相同的银行卡信息**
|
||
- ✅ **支付成功!**
|
||
|
||
**根本原因**:
|
||
1. Stripe 有严格的反欺诈检测机制
|
||
2. 检测到 CapSolver 浏览器扩展的异常行为:
|
||
- 扩展修改了页面 DOM
|
||
- 扩展注入了脚本
|
||
- 浏览器指纹异常
|
||
3. Stripe 触发安全机制,拒绝处理支付
|
||
|
||
**问题分析**:
|
||
```
|
||
步骤2: Cloudflare验证 → 需要CapSolver ✅
|
||
步骤6: Stripe支付 → CapSolver干扰支付 ❌
|
||
```
|
||
|
||
**矛盾点**:
|
||
- 必须用CapSolver通过Cloudflare(步骤2)
|
||
- 但CapSolver会导致Stripe拒绝支付(步骤6)
|
||
|
||
---
|
||
|
||
### 解决方案(待选择实现)
|
||
|
||
#### 方案1: 两阶段浏览器切换 ⭐推荐⭐
|
||
|
||
**思路**:只在需要时使用CapSolver,支付时切换到干净浏览器
|
||
|
||
**实现步骤**:
|
||
1. **步骤1-2**:使用带CapSolver扩展的浏览器
|
||
2. **步骤2完成后**:
|
||
- 保存登录状态(cookies + localStorage)
|
||
- 获取当前URL
|
||
- 关闭带扩展的浏览器
|
||
3. **重新启动干净浏览器**:
|
||
- 不加载任何扩展
|
||
- 导航到保存的URL
|
||
- 恢复cookies和localStorage
|
||
4. **步骤3-6**:继续正常流程
|
||
|
||
**优点**:
|
||
- ✅ 完全自动化
|
||
- ✅ 不触发Stripe安全检测
|
||
- ✅ 保持账号登录状态
|
||
- ✅ 最优雅的解决方案
|
||
|
||
**缺点**:
|
||
- ❌ 需要实现会话保存/恢复逻辑
|
||
- ❌ 代码复杂度增加
|
||
|
||
**实现要点**:
|
||
```javascript
|
||
// 步骤2完成后
|
||
const session = {
|
||
cookies: await page.cookies(),
|
||
localStorage: await page.evaluate(() => JSON.stringify(localStorage)),
|
||
url: page.url()
|
||
};
|
||
|
||
// 保存到内存或文件
|
||
await closeBrowser();
|
||
|
||
// 重启干净浏览器
|
||
await initBrowser({ skipExtension: true });
|
||
await page.goto(session.url);
|
||
await page.setCookie(...session.cookies);
|
||
await page.evaluate((ls) => Object.assign(localStorage, JSON.parse(ls)), session.localStorage);
|
||
```
|
||
|
||
---
|
||
|
||
#### 方案2: 手动支付模式(最简单)
|
||
|
||
**思路**:自动化到支付页面,然后提示用户手动完成
|
||
|
||
**实现步骤**:
|
||
1. 步骤1-5自动完成
|
||
2. 到达Stripe支付页面后:
|
||
- 输出支付链接到控制台
|
||
- 提示用户在真实浏览器中打开
|
||
- 等待用户确认支付完成
|
||
|
||
**优点**:
|
||
- ✅ 实现简单(5分钟)
|
||
- ✅ 100%成功率
|
||
- ✅ 不需要修改复杂逻辑
|
||
|
||
**缺点**:
|
||
- ❌ 需要人工介入
|
||
- ❌ 不是完全自动化
|
||
|
||
**实现要点**:
|
||
```javascript
|
||
async step6_fillPayment() {
|
||
const checkoutUrl = this.page.url();
|
||
|
||
logger.info(this.siteName, '================================');
|
||
logger.info(this.siteName, '⚠️ 需要手动完成支付');
|
||
logger.info(this.siteName, '================================');
|
||
logger.info(this.siteName, '原因:CapSolver扩展会干扰Stripe支付');
|
||
logger.info(this.siteName, '');
|
||
logger.info(this.siteName, '📋 支付链接:');
|
||
logger.info(this.siteName, checkoutUrl);
|
||
logger.info(this.siteName, '');
|
||
logger.info(this.siteName, '请复制上述链接到真实浏览器中完成支付');
|
||
logger.info(this.siteName, '================================');
|
||
|
||
// 等待用户确认
|
||
await this.waitForUserConfirmation();
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 方案3: 动态卸载扩展(理论方案)
|
||
|
||
**思路**:步骤2后卸载CapSolver扩展
|
||
|
||
**问题**:
|
||
- ❌ Puppeteer 不支持运行时卸载扩展
|
||
- ❌ 需要重启浏览器
|
||
|
||
**结论**:不可行,等同于方案1
|
||
|
||
---
|
||
|
||
### 推荐决策
|
||
|
||
**短期**(立即可用):
|
||
→ **方案2:手动支付模式**
|
||
- 快速实现
|
||
- 稳定可靠
|
||
- 只需5分钟
|
||
|
||
**长期**(最佳方案):
|
||
→ **方案1:两阶段浏览器切换**
|
||
- 完全自动化
|
||
- 用户体验最佳
|
||
- 需要1-2小时开发
|
||
|
||
---
|
||
|
||
## 📋 测试计划
|
||
|
||
### 测试 1: rebrowser + CapSolver
|
||
```bash
|
||
node src/cli.js register -s windsurf --keep-browser-open
|
||
```
|
||
|
||
**预期结果**:
|
||
1. 步骤 1-2: 正常填写
|
||
2. 步骤 3: Cloudflare 出现
|
||
- 如果 rebrowser 能绕过 → 直接通过
|
||
- 如果绕不过 → CapSolver 自动解决
|
||
3. 步骤 4-6: 正常完成(**重点测试付款页面**)
|
||
|
||
**关键检查点**:
|
||
- [ ] 步骤 3: Cloudflare 是否自动通过?
|
||
- [ ] 步骤 6: 付款页面是否有循环点击?
|
||
- [ ] 步骤 6: 银行卡输入是否成功?
|
||
|
||
---
|
||
|
||
## 🐛 已知 Bug
|
||
|
||
### Bug 1: puppeteer-real-browser (turnstile: true) 在付款页面循环点击
|
||
- **现象**: 一直点击 Stripe Link 的"保存信息"checkbox
|
||
- **原因**: turnstile 功能误判 checkbox 为验证码
|
||
- **解决**: 不使用 puppeteer-real-browser
|
||
|
||
### Bug 2: Playwright 被 Cloudflare 检测
|
||
- **现象**: 即使用了 stealth 插件也无法通过
|
||
- **原因**: Playwright 的特征容易被检测
|
||
- **解决**: 不使用 Playwright
|
||
|
||
---
|
||
|
||
## 📝 代码状态
|
||
|
||
### 当前代码使用:
|
||
- ✅ rebrowser-puppeteer(已修改)
|
||
- ✅ CapSolver API 集成(已完成)
|
||
- ✅ 自动回退到手动模式(已实现)
|
||
|
||
### 需要验证:
|
||
- [ ] rebrowser 能否自动绕过 Cloudflare?
|
||
- [ ] 如果不能,CapSolver 能否接管?
|
||
- [ ] 付款页面是否正常?
|
||
|
||
---
|
||
|
||
## 🎯 下一步行动
|
||
|
||
1. **立即测试**:运行注册流程,观察 Cloudflare 和付款页面
|
||
2. **记录结果**:
|
||
- Cloudflare 是否自动通过?
|
||
- CapSolver 是否成功?
|
||
- 付款页面是否正常?
|
||
3. **根据结果调整**:
|
||
- 如果成功 → 完成 ✅
|
||
- 如果失败 → 分析原因并调整
|
||
|
||
---
|
||
|
||
## 💡 重要提醒
|
||
|
||
**不要再切换浏览器方案!**
|
||
|
||
rebrowser-puppeteer 是最佳选择:
|
||
- ✅ 内置反检测
|
||
- ✅ 不干扰付款页面
|
||
- ✅ 配合 CapSolver 完美
|
||
|
||
**保持这个方案,专注优化!**
|