# CapSolver 验证失败问题分析

## 问题现象
使用 CapSolver API Key 配置后，无法自动绕过 Cloudflare Turnstile 验证。

## 系统架构分析

### 当前配置状态
- ✅ API Key 已配置: `CAP-0FCDDA4906E87D9F4FF68EAECD34E320876FBA70E4F30EA1ADCD264EDB15E4BF`
- ✅ 扩展路径存在: `extensions/capsolver/`
- ✅ 配置文件正确: `extensions/capsolver/assets/config.js`
- ✅ 扩展关键文件完整:
  - manifest.json ✓
  - config.js ✓
  - cloudflare-content.js ✓
  - inject-turnstile.js ✓
  - background.js ✓

### 扩展工作机制

#### 1. 扩展注入流程
```
manifest.json (content_scripts)
  ↓
cloudflare-content.js (run_at: document_start)
  ↓
inject-turnstile.js (注入到页面)
  ↓
拦截 window.turnstile.render()
  ↓
发送消息给 background.js
  ↓
调用 CapSolver API
  ↓
返回 token 并触发回调
```

#### 2. inject-turnstile.js 的关键逻辑
- 创建 `window.turnstile` Proxy
- 拦截 `render()` 方法
- 提取 sitekey 和 callback
- 发送 `registerTurnstile` 消息
- 监听 `turnstileSolved` 消息
- 调用原始回调函数

#### 3. windsurf.js 的等待逻辑
```javascript
// 步骤2: 507-542行
if (this.capsolverKey) {
  // 等待按钮激活（检测扩展是否完成）
  while (elapsed < 60000) {
    const buttonEnabled = await this.page.evaluate(() => {
      const button = document.querySelector('button');
      return button && !button.disabled && button.textContent.trim() === 'Continue';
    });
    
    if (buttonEnabled) {
      // 成功
      break;
    }
    
    await new Promise(resolve => setTimeout(resolve, 2000));
    elapsed = Date.now() - startTime;
  }
}
```

## 可能的问题原因

### 问题1: 扩展未正确加载 ⭐最可能⭐
**症状**:
- 扩展文件存在但未被浏览器激活
- 控制台没有扩展日志
- inject-turnstile.js 未注入到页面

**原因**:
1. Windows 路径问题（已修复：第241-246行）
2. Manifest V3 的 service worker 限制
3. Chrome 扩展权限问题

**验证方法**:
```javascript
// 在页面执行
console.log(window.turnstile); // 应该是Proxy对象
console.log(window.registerTurnstileData); // 应该有sitekey
```

### 问题2: Turnstile API未加载完成
**症状**:
- 第495行报错: "Turnstile API 未加载"
- scripts数组为空

**原因**:
1. Cloudflare CDN 被墙（中国大陆网络）
2. 扩展阻止了 Turnstile 脚本加载
3. 页面导航过快，脚本未加载完

**当前处理**:
- 第502-503行: 等待30秒重试

### 问题3: 扩展脚本执行时机问题
**症状**:
- inject-turnstile.js 注入太晚
- window.turnstile 已经被原始脚本创建
- Proxy 拦截失败

**原因**:
- cloudflare-content.js 的 run_at: "document_start" 可能不够早
- React 应用的 Turnstile 组件可能动态加载

### 问题4: API Key 或余额问题
**症状**:
- 扩展调用 API 失败
- 60秒超时

**验证**:
- 检查 CapSolver 控制台余额
- 检查 API Key 是否有效
- 检查网络能否访问 api.capsolver.com

### 问题5: Content Script与页面隔离
**症状**:
- Content script 无法访问页面的 window 对象
- inject-turnstile.js 需要通过 injected script 运行

**可能问题**:
- 扩展的 web_accessible_resources 配置
- script 注入方式不对

## 调试建议

### 步骤1: 验证扩展是否加载
```bash
# 运行注册流程
node src/cli.js register -s windsurf --keep-browser-open

# 在浏览器控制台检查:
chrome://extensions/
# 查看 "Captcha Solver" 是否已启用
# 查看是否有错误
```

### 步骤2: 检查页面注入
在 Turnstile 页面打开控制台:
```javascript
// 检查扩展是否注入
console.log(window.turnstile); 
// 应该输出: Proxy {render: ƒ, reset: ƒ, ...}

// 检查注册数据
console.log(window.registerTurnstileData);
// 应该输出: {sitekey: "0x4AAA..."}

// 检查回调
console.log(window.turnstileCallback);
// 应该是一个函数
```

### 步骤3: 检查扩展日志
```javascript
// 监听消息
window.addEventListener('message', (event) => {
  if (event.data?.type === 'registerTurnstile') {
    console.log('扩展已注册Turnstile:', event.data);
  }
  if (event.data?.type === 'turnstileSolved') {
    console.log('扩展已解决:', event.data);
  }
});
```

### 步骤4: 网络检查
```bash
# 检查能否访问 Cloudflare
curl https://challenges.cloudflare.com/turnstile/v0/api.js

# 检查能否访问 CapSolver
curl https://api.capsolver.com/

# 如果被墙，需要代理
```

## 推荐修复方案

### 方案A: 添加详细日志 ⭐推荐⭐
在 windsurf.js 中添加调试输出:

```javascript
// 步骤2: 设置密码后
// 检查扩展注入状态
const extensionStatus = await this.page.evaluate(() => {
  return {
    hasTurnstileProxy: window.turnstile && window.turnstile.toString().includes('Proxy'),
    hasRegisterData: !!window.registerTurnstileData,
    hasCallback: !!window.turnstileCallback,
    sitekey: window.registerTurnstileData?.sitekey
  };
});

logger.info(this.siteName, '扩展状态:', JSON.stringify(extensionStatus, null, 2));
```

### 方案B: 强制等待 Turnstile API
```javascript
// 在步骤2中，点击Continue之前
await this.page.waitForFunction(
  () => typeof window.turnstile !== 'undefined',
  { timeout: 30000 }
);
```

### 方案C: 手动注入 inject-turnstile.js
如果扩展未正确加载，可以手动注入:

```javascript
const fs = require('fs');
const injectScript = fs.readFileSync(
  path.join(projectRoot, 'extensions/capsolver/assets/inject/inject-turnstile.js'),
  'utf8'
);

await this.page.evaluateOnNewDocument(injectScript);
```

### 方案D: 使用 Chrome DevTools Protocol
```javascript
const client = await this.page.target().createCDPSession();
await client.send('Page.addScriptToEvaluateOnNewDocument', {
  source: injectScript
});
```

## 下一步行动

1. **立即执行**: 添加详细调试日志（方案A）
2. **验证扩展**: 运行测试并检查浏览器扩展状态
3. **收集信息**: 
   - 扩展是否加载？
   - window.turnstile 是否是 Proxy？
   - 控制台有什么错误？
4. **根据结果**: 选择对应的修复方案
