dasdasd
This commit is contained in:
parent
703e41b890
commit
313be582c0
156
TODO.md
156
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user