auto-account-machine/docs/browser-architecture.md
2025-11-21 14:14:55 +08:00

8.5 KiB
Raw Permalink Blame History

多浏览器架构文档

概述

本项目采用策略模式 + 工厂模式实现多浏览器支持可以轻松切换不同的浏览器提供商AdsPower、Playwright、Puppeteer等


架构图

┌─────────────────────────────────────────────────────┐
│             BrowserManager (统一接口)                │
│         保持向后兼容,支持多种提供商                   │
└──────────────────────┬──────────────────────────────┘
                       │
                       ├── 使用工厂创建
                       ↓
         ┌─────────────────────────────┐
         │      BrowserFactory         │
         │        (工厂类)              │
         └─────────────┬───────────────┘
                       │
         ┌─────────────┴───────────────┐
         │                             │
         ↓                             ↓
┌──────────────────┐          ┌──────────────────┐
│  BaseBrowserProvider │       │  更多提供商...    │
│   (抽象基类)          │       │                  │
└────────┬─────────┘          └──────────────────┘
         │
         ├── 实现
         ↓
┌──────────────────────┐
│  AdsPowerProvider    │  付费 ✅ 指纹 ✅ Cloudflare绕过
│  (AdsPower集成)      │
└──────────────────────┘

未来扩展:
├── PlaywrightStealthProvider  免费 ✅ 隐身模式
├── PuppeteerStealthProvider   免费 ✅ 隐身模式
├── SeleniumUndetectedProvider 免费 ✅ 反检测
└── NoDriverProvider           免费 ✅ 反检测

目录结构

src/shared/libs/browser/
├── browser-manager.js           # 统一管理器(向后兼容)
├── providers/                   # 提供商实现
│   ├── base-provider.js        # 抽象基类
│   ├── adspower-provider.js    # AdsPower实现
│   └── ... (未来添加更多)
└── factory/
    └── browser-factory.js      # 工厂类

使用方式

1. 默认使用AdsPower向后兼容

const BrowserManager = require('./src/shared/libs/browser/browser-manager');

// 从环境变量读取配置
const browser = new BrowserManager({
  siteName: 'MyApp'
});

await browser.launch();
const page = browser.getPage();
// ... 使用 page
await browser.close();

2. 显式指定提供商

// 使用 AdsPower
const browser = new BrowserManager({
  provider: 'adspower',
  profileId: 'k1728p8l',
  siteName: 'MyApp'
});

// 未来:使用 Playwright Stealth
const browser = new BrowserManager({
  provider: 'playwright-stealth',
  headless: false,
  siteName: 'MyApp'
});

3. 通过环境变量切换

# .env 文件
BROWSER_PROVIDER=adspower
ADSPOWER_USER_ID=k1728p8l
ADSPOWER_API=http://local.adspower.net:50325
ADSPOWER_API_KEY=your_api_key
// 自动从环境变量读取 BROWSER_PROVIDER
const browser = new BrowserManager();
await browser.launch();

4. 使用工厂直接创建

const { BrowserFactory } = require('./src/shared/libs/browser/factory/browser-factory');

// 创建提供商实例
const provider = BrowserFactory.create('adspower', {
  profileId: 'k1728p8l'
});

await provider.launch();

API 参考

BrowserManager

方法 说明 返回值
constructor(options) 创建管理器 -
launch(options) 启动浏览器 Promise<{browser, page}>
getPage() 获取页面 Page
getBrowser() 获取浏览器 Browser
clearData() 清除缓存 Promise<void>
close() 关闭浏览器 Promise<void>
newPage() 创建新页面 Promise<Page>
getProviderName() 获取提供商名称 string
getProviderMetadata() 获取提供商元数据 Object

BrowserFactory

方法 说明 返回值
create(name, config) 创建提供商 BaseBrowserProvider
getAvailableProviders() 列出所有提供商 string[]
getFreeProviders() 列出免费提供商 string[]
getPaidProviders() 列出付费提供商 string[]
findProvidersByCapability(cap) 按能力查找 string[]
getRecommendedProvider(req) 获取推荐提供商 string

提供商对比

提供商 类型 指纹伪装 Cloudflare Stripe 代理 配置文件
AdsPower 付费
Playwright Stealth 免费 ⚠️ ⚠️
Puppeteer Stealth 免费 ⚠️ ⚠️
Selenium Undetected 免费 ⚠️ ⚠️

说明:

  • = 完全支持
  • ⚠️ = 部分支持
  • = 不支持

扩展新提供商

1. 创建提供商类

// src/shared/libs/browser/providers/my-provider.js
const BaseBrowserProvider = require('./base-provider');

class MyProvider extends BaseBrowserProvider {
  getName() {
    return 'MyProvider';
  }

  isFree() {
    return true; // 或 false
  }

  getCapabilities() {
    return {
      stealth: true,
      fingerprint: false,
      // ...
    };
  }

  async launch(options = {}) {
    // 实现启动逻辑
  }

  async close() {
    // 实现关闭逻辑
  }

  // ... 实现其他抽象方法
}

module.exports = MyProvider;

2. 注册到工厂

// src/shared/libs/browser/factory/browser-factory.js
const MyProvider = require('../providers/my-provider');

class BrowserFactory {
  static _providers = {
    'adspower': AdsPowerProvider,
    'my-provider': MyProvider,  // 添加这里
  };
  // ...
}

3. 使用新提供商

const browser = new BrowserManager({
  provider: 'my-provider',
  // ... 配置
});

配置示例

AdsPower

{
  provider: 'adspower',
  profileId: 'k1728p8l',
  apiBase: 'http://local.adspower.net:50325',
  apiKey: 'your_api_key',
  incognitoMode: true
}

Playwright Stealth (未来)

{
  provider: 'playwright-stealth',
  headless: false,
  viewport: { width: 1920, height: 1080 },
  userAgent: 'custom user agent',
  proxy: {
    server: 'http://proxy.com:8080',
    username: 'user',
    password: 'pass'
  }
}

工具命令(未来)

# 列出所有提供商
npm run browser -- list

# 测试提供商
npm run browser -- test adspower

# 切换默认提供商
npm run browser -- switch playwright-stealth

# 比较提供商
npm run browser -- compare

迁移指南

从旧版本迁移

旧代码:

const BrowserManager = require('./browser-manager');
const browser = new BrowserManager({
  profileId: 'k1728p8l'
});

新代码(完全兼容):

const BrowserManager = require('./browser-manager');
const browser = new BrowserManager({
  profileId: 'k1728p8l'  // 无需改变!
});

或显式指定:

const browser = new BrowserManager({
  provider: 'adspower',  // 新增:显式指定
  profileId: 'k1728p8l'
});

常见问题

Q: 如何切换到免费浏览器?

A: 等待 Phase 2 完成后,只需修改配置:

provider: 'playwright-stealth'

Q: 可以混用多个提供商吗?

A: 可以!每个实例独立:

const browser1 = new BrowserManager({ provider: 'adspower' });
const browser2 = new BrowserManager({ provider: 'playwright-stealth' });

Q: 如何知道当前使用的是哪个提供商?

A:

console.log(browser.getProviderName()); // 'adspower'
console.log(browser.getProviderMetadata());

开发路线图

  • Phase 1: 抽象接口 + AdsPower迁移
  • Phase 2: 添加 Playwright Stealth
  • Phase 3: 添加 Puppeteer Stealth
  • Phase 4: CLI工具
  • Phase 5: 文档和测试

版本: 1.0.0
更新时间: 2025-11-21
作者: AI Assistant