This commit is contained in:
dengqichen 2025-11-17 13:22:38 +08:00
parent 703e41b890
commit 313be582c0

156
TODO.md
View File

@ -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 ### 测试 1: rebrowser + CapSolver