diff --git a/TODO.md b/TODO.md index 5608375..16086f0 100644 --- a/TODO.md +++ b/TODO.md @@ -73,6 +73,162 @@ --- +## 🚨 最新发现的关键问题(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