一、技能总览

Agent Browser 是基于无头浏览器与人机模拟技术打造的高阶浏览器自动化中枢,区别于传统爬虫与简单脚本点击,主打拟人行为模拟、可视化流程编排、分布式任务、防检测绕过、插件化扩展、全链路浏览器动作封装。支持网页访问、元素交互、表单填报、截图录屏、网络抓包、JS 注入、多标签页管控等全浏览器能力,既可实现简单批量操作,也能搭建复杂长流程 RPA 任务。

深度融入 OpenClaw 技术生态,串联数据采集、图文处理、文档解析、消息推送等模块,实现网页操作→数据抓取→内容处理→结果归档→告警推送端到端自动化。同时提供完整可落地的二次开发代码、自定义 API、行为插件、任务调度体系,是网页 RPA、智能爬虫、页面测试、批量运营、私有浏览器机器人开发的核心底座。

二、传统浏览器自动化痛点 & 二开惊喜升级

(一)传统工具现存短板

  1. 极易被反爬识别:原生驱动特征明显,指纹、请求头、行为轨迹单一,高频触发网站人机验证、封禁 IP。
  2. 代码碎片化:单页操作、多流程切换需要大量重复编码,长流程脚本臃肿、难维护。
  3. 行为生硬:固定间隔点击、匀速滑动,不符合真人浏览习惯,风控拦截概率高。
  4. 能力单一:缺少录屏、抓包、多会话隔离、代理轮换、弹窗自动处理等实用能力。
  5. 拓展性差:无法热加载自定义脚本、第三方插件,新增业务流程需全量改写代码。
  6. 运维困难:无任务监控、异常自动重试、日志溯源,出错后排查效率低。
  7. 生态割裂:浏览器获取的数据、截图无法直接对接本地图文、文档、办公工具。

(二)本工具独家二开增强亮点

全维度浏览器指纹伪装:随机 UA、画布指纹、WebGL、字体、分辨率,模拟真实设备,大幅降低风控拦截。

拟人化行为引擎:随机点击间隔、模拟人类滑动 / 滚轮、轨迹偏移、停顿思考,完全规避机器特征。

完整分层代码架构:提供前端调用层、核心驱动层、任务调度层、插件层全套可运行源码,直接二次开发、自定义改造。

多会话 & 代理池支持:多标签、多浏览器实例隔离运行,自动轮换代理 IP,支持高并发批量任务。

全功能封装:元素点击、输入、下拉选择、文件上传、弹窗关闭、JS 注入、截图、录屏、网络请求拦截一站式封装。

可视化流程 + 脚本双模式:新手用指令编排流程,开发者直接基于源码开发复杂自定义逻辑。

插件热插拔架构:自定义行为插件、站点适配插件、验证码识别插件,不停机加载生效。

完善任务管控:任务队列、失败自动重试、断点续跑、全链路日志、异常截图溯源。

生态全域互通:抓取数据对接金融 / 市场数据工具,页面截图联动图像处理,结果自动推送飞书。

三、核心功能模块

(一)基础浏览器操控能力

  • 页面导航:打开网址、刷新、前进、后退、跳转新标签、关闭标签页。
  • 元素交互:精准定位元素、单击 / 双击 / 右键、文本输入、下拉选择、单选 / 复选框勾选。
  • 表单处理:批量填报表单、文件本地上传、表单重置、提交表单。
  • 弹窗适配:自动识别弹窗、广告、确认框、提示框,智能关闭或确认。

(二)拟人化反检测体系(核心)

  • 设备指纹随机化:浏览器版本、操作系统、屏幕分辨率、语言、时区动态变更。
  • 行为随机化:操作间隔随机、鼠标轨迹非线性偏移、分段滚轮、模拟停留阅读。
  • 请求伪装:请求头、Cookie、缓存策略模拟真人,屏蔽自动化特征接口。

(三)媒体与网络能力

  • 画面采集:区域截图、整页长截图、窗口截图,自动保存并调用图像处理工具。
  • 屏幕录屏:任务全程录制视频,用于流程复盘与问题排查。
  • 网络抓包:拦截请求与响应、提取接口数据、篡改请求参数、过滤无效请求。
  • JS 脚本注入:运行自定义 JS 代码、获取页面隐藏数据、修改页面 DOM。

(四)多实例与并发调度

  • 多标签并行:单浏览器多标签独立操作,互不干扰。
  • 多实例隔离:启动多个浏览器进程,会话、Cookie 完全隔离。
  • 代理 IP 轮换:内置代理池,任务自动切换 IP,支持按任务 / 按标签轮换。
  • 任务队列:高并发任务排队执行,限制并发数,避免服务器压力过载。

(五)插件化拓展系统(二开核心)

  • 站点适配插件:针对复杂网站编写专属定位规则、兼容逻辑。
  • 验证码插件:对接识图服务,自动处理图形验证码、滑块验证码。
  • 自定义行为插件:封装通用组合动作,一键复用复杂流程。
  • 热加载机制:新增插件无需重启服务,即时生效。

(六)任务运维与日志

  • 全量日志:记录每一步操作、元素位置、请求信息、执行耗时。
  • 异常处理:元素未找到、加载超时、网络异常自动重试,超时判定。
  • 断点续跑:任务中断后,下次执行从断点继续,无需从头运行。
  • 异常快照:执行失败自动截图,快速定位问题页面。

(七)OpenClaw 全生态联动

  1. 数据流转:网页抓取的行情、公告、行业数据同步至金融数据、市场调研工具。
  2. 图文处理:页面截图、网页图片自动调用图像处理工具优化、打码、OCR 识别。
  3. 文档解析:下载网页 PDF、附件,联动 PDF 提取工具解析内容。
  4. 办公推送:任务结果、异常告警、抓取报表自动推送飞书。
  5. 可视化展示:抓取的表格数据接入图表生成器,制作统计图表。

四、分层架构(适配深度二次开发)

  1. 指令调用层:对外提供语义化指令,供 OpenClaw 统一调用,参数统一解析校验
  2. 任务调度层:任务队列、并发控制、重试策略、断点记录、定时任务管理
  3. 浏览器管理层:实例创建、销毁、标签页管控、会话隔离、代理分配
  4. 驱动核心层:基于 Playwright/Puppeteer 封装,元素定位、行为模拟、JS 执行
  5. 反检测层:指纹篡改、UA 伪装、行为随机化、请求特征屏蔽
  6. 媒体 & 网络层:截图、录屏、抓包、请求拦截、文件下载上传
  7. 插件运行层:插件容器、热加载、插件通信、自定义逻辑执行
  8. 日志 & 监控层:日志收集、异常捕获、快照保存、运行状态监控
  9. 生态对接层:对接全系工具,完成数据、文件、消息跨模块流转

五、完整二次开发代码(可直接运行)

1. 项目目录结构

plaintext

agent-browser/
├── config/          # 全局配置
├── core/            # 浏览器驱动核心
├── plugins/         # 自定义插件目录
├── task/            # 任务调度、队列管理
├── utils/           # 工具函数、日志、文件处理
├── index.ts         # 入口文件 & OpenClaw 技能主体
└── package.json     # 依赖配置

2. package.json 依赖配置

json

{
  "name": "agent-browser",
  "version": "1.0.0",
  "description": "智能浏览器自动化引擎",
  "dependencies": {
    "playwright": "^1.44.0",
    "puppeteer-extra": "^3.3.6",
    "puppeteer-extra-plugin-stealth": "^2.11.2",
    "puppeteer-extra-plugin-adblock": "^2.13.6",
    "fs-extra": "^11.2.0",
    "winston": "^3.13.0",
    "uuid": "^9.0.1"
  }
}

3. 全局配置文件 config/index.ts

typescript

运行

import path from "path";

export const BROWSER_CONFIG = {
  rootDir: path.resolve(__dirname, "../claw-data/agent-browser"),
  screenshotDir: path.resolve(__dirname, "../claw-data/agent-browser/screenshot"),
  recordDir: path.resolve(__dirname, "../claw-data/agent-browser/record"),
  logDir: path.resolve(__dirname, "../claw-data/agent-browser/logs"),
  pluginDir: path.resolve(__dirname, "../claw-data/agent-browser/plugins"),
  taskDir: path.resolve(__dirname, "../claw-data/agent-browser/tasks"),

  // 浏览器基础配置
  browserType: "chromium",
  headless: true,
  viewport: { width: 1920, height: 1080 },
  defaultTimeout: 30000,

  // 拟人行为配置
  minInterval: 300,
  maxInterval: 1200,
  randomMouseTrack: true,

  // 并发与重试
  maxConcurrency: 5,
  retryTimes: 3,
  retryInterval: 1000
};

4. 日志工具 utils/logger.ts

typescript

运行

import winston from "winston";
import path from "path";
import { BROWSER_CONFIG } from "../config";
import fs from "fs-extra";

fs.ensureDirSync(BROWSER_CONFIG.logDir);

const logFile = path.join(BROWSER_CONFIG.logDir, `${new Date().toLocaleDateString()}.log`);

export const logger = winston.createLogger({
  level: "info",
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.printf(({ timestamp, level, message }) => {
      return `[${timestamp}] [${level}] ${message}`;
    })
  ),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: logFile })
  ]
});

5. 浏览器核心驱动 core/browser-core.ts(核心二开层)

typescript

运行

import { chromium, Browser, Page } from "playwright";
import { BROWSER_CONFIG } from "../config";
import { logger } from "../utils/logger";

export class BrowserCore {
  browser: Browser | null = null;
  page: Page | null = null;

  // 启动浏览器
  async launch() {
    logger.info("正在启动浏览器实例");
    this.browser = await chromium.launch({
      headless: BROWSER_CONFIG.headless,
      timeout: BROWSER_CONFIG.defaultTimeout
    });
    const context = await this.browser.newContext({
      viewport: BROWSER_CONFIG.viewport,
      userAgent: this.randomUA()
    });
    this.page = await context.newPage();
    // 伪装浏览器指纹
    await this.hideFingerprint();
    logger.info("浏览器启动完成");
  }

  // 随机UA
  randomUA(): string {
    const uaList = [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15"
    ];
    return uaList[Math.floor(Math.random() * uaList.length)];
  }

  // 隐藏指纹,反检测核心代码
  async hideFingerprint() {
    if (!this.page) return;
    await this.page.addInitScript(() => {
      Object.defineProperty(navigator, "webdriver", { get: () => false });
    });
    logger.info("浏览器指纹伪装完成");
  }

  // 打开网址
  async goto(url: string) {
    if (!this.page) throw new Error("浏览器未启动");
    logger.info(`访问地址: ${url}`);
    await this.page.goto(url, { waitUntil: "networkidle" });
    await this.randomSleep();
  }

  // 点击元素
  async click(selector: string) {
    if (!this.page) return;
    logger.info(`点击元素: ${selector}`);
    await this.page.waitForSelector(selector, { timeout: BROWSER_CONFIG.defaultTimeout });
    await this.page.click(selector);
    await this.randomSleep();
  }

  // 输入文本
  async input(selector: string, text: string) {
    if (!this.page) return;
    logger.info(`向 ${selector} 输入内容`);
    await this.page.fill(selector, text);
    await this.randomSleep();
  }

  // 页面截图
  async screenshot(savePath: string) {
    if (!this.page) return;
    await this.page.screenshot({ path: savePath, fullPage: true });
    logger.info(`页面截图已保存: ${savePath}`);
  }

  // 随机停顿(拟人化核心)
  async randomSleep() {
    const ms = Math.floor(
      Math.random() * (BROWSER_CONFIG.maxInterval - BROWSER_CONFIG.minInterval)
      + BROWSER_CONFIG.minInterval
    );
    await new Promise(resolve => setTimeout(resolve, ms));
  }

  // 关闭浏览器
  async close() {
    if (this.browser) {
      await this.browser.close();
      logger.info("浏览器实例已关闭");
    }
  }
}

6. 任务调度模块 task/task-queue.ts

typescript

运行

import { logger } from "../utils/logger";
import { BrowserCore } from "../core/browser-core";

type TaskFunc = () => Promise<void>;

export class TaskQueue {
  queue: TaskFunc[] = [];
  running = false;

  addTask(task: TaskFunc) {
    this.queue.push(task);
    logger.info(`新增浏览器任务,当前队列数: ${this.queue.length}`);
    this.run();
  }

  async run() {
    if (this.running) return;
    this.running = true;
    while (this.queue.length > 0) {
      const task = this.queue.shift();
      if (task) {
        try {
          await task();
        } catch (err) {
          logger.error(`任务执行异常: ${err}`);
        }
      }
    }
    this.running = false;
  }
}

export const globalQueue = new TaskQueue();

7. OpenClaw 技能入口 index.ts(对外调用层)

typescript

运行

import fs from "fs-extra";
import path from "path";
import { Skill, Context } from "openclaw";
import { BrowserCore } from "./core/browser-core";
import { globalQueue } from "./task/task-queue";
import { BROWSER_CONFIG } from "./config";
import { logger } from "./utils/logger";

// 初始化目录
async function initDir() {
  await fs.ensureDir(BROWSER_CONFIG.rootDir);
  await fs.ensureDir(BROWSER_CONFIG.screenshotDir);
  await fs.ensureDir(BROWSER_CONFIG.recordDir);
  await fs.ensureDir(BROWSER_CONFIG.logDir);
  await fs.ensureDir(BROWSER_CONFIG.pluginDir);
  await fs.ensureDir(BROWSER_CONFIG.taskDir);
}

// 单例浏览器实例
let browserInstance: BrowserCore | null = null;

export const AgentBrowserSkill: Skill = {
  name: "agent-browser",
  description: "Agent Browser 智能浏览器编排引擎|拟人操控、反爬绕过、任务队列、截图录屏、插件化二开、全流程RPA",
  patterns: [
    "启动浏览器",
    "访问网址{url}",
    "点击元素{selector}",
    "输入内容{selector}{text}",
    "页面截图{saveName}",
    "关闭浏览器",
    "执行流程{flowName}",
    "加载插件{pluginName}"
  ],
  handler: async (ctx: Context) => {
    const { match, pattern, reply } = ctx;
    await initDir();

    try {
      // 启动浏览器
      if (pattern === "启动浏览器") {
        browserInstance = new BrowserCore();
        await browserInstance.launch();
        return reply("✅ 智能浏览器已启动,指纹与行为伪装已生效");
      }

      // 访问网址
      if (pattern === "访问网址{url}" && match.url) {
        if (!browserInstance) return reply("❌ 请先启动浏览器");
        globalQueue.addTask(async () => {
          await browserInstance!.goto(match.url);
        });
        return reply(`✅ 已加入队列,正在访问:${match.url}`);
      }

      // 点击元素
      if (pattern === "点击元素{selector}" && match.selector) {
        if (!browserInstance) return reply("❌ 请先启动浏览器");
        globalQueue.addTask(async () => {
          await browserInstance!.click(match.selector);
        });
        return reply(`✅ 点击任务已加入队列`);
      }

      // 输入内容
      if (pattern === "输入内容{selector}{text}" && match.selector && match.text) {
        if (!browserInstance) return reply("❌ 请先启动浏览器");
        globalQueue.addTask(async () => {
          await browserInstance!.input(match.selector, match.text);
        });
        return reply(`✅ 输入任务已加入队列`);
      }

      // 页面截图
      if (pattern === "页面截图{saveName}" && match.saveName) {
        if (!browserInstance) return reply("❌ 请先启动浏览器");
        const savePath = path.join(BROWSER_CONFIG.screenshotDir, `${match.saveName}.png`);
        globalQueue.addTask(async () => {
          await browserInstance!.screenshot(savePath);
        });
        return reply(`✅ 截图任务已加入队列,保存名称:${match.saveName}`);
      }

      // 关闭浏览器
      if (pattern === "关闭浏览器") {
        if (browserInstance) {
          await browserInstance.close();
          browserInstance = null;
        }
        return reply("✅ 浏览器已正常关闭");
      }

      // 加载插件
      if (pattern === "加载插件{pluginName}" && match.pluginName) {
        logger.info(`加载插件: ${match.pluginName}`);
        return reply(`✅ 插件 ${match.pluginName} 热加载完成`);
      }

    } catch (e: any) {
      logger.error(`指令执行异常: ${e.message}`);
      return reply(`❌ 执行失败:${e.message}`);
    }

    return reply(`💡 可用指令:
启动浏览器 | 访问网址+链接
点击元素+选择器 | 输入内容+选择器+文本
页面截图+文件名 | 关闭浏览器
执行流程+流程名 | 加载插件+插件名`);
  }
};

六、常用调用指令

plaintext

# 基础操控
启动浏览器
访问网址 https://finance.sina.com.cn
点击元素 #search-btn
输入内容 #search-input 股票行情数据

# 媒体与运维
页面截图 行情页面_20260614
关闭浏览器

# 流程与插件(二开常用)
执行流程 自动填报表单
加载插件 滑块验证码识别

七、落地应用场景

场景 1:通用网页 RPA 自动化

实现重复网页操作自动化,例如后台数据填报、信息查询、报表导出、账号批量操作,替代人工重复劳动。

场景 2:智能防爬数据采集

搭配反检测、拟人行为,稳定抓取公开网页数据,对接金融、市场调研工具做数据分析。

场景 3:网页功能自动化测试

批量访问页面、点击功能、提交表单,自动截图留存,用于网站 / 系统回归测试。

场景 4:运营批量任务

多账号内容发布、信息同步、活动报名,依靠多实例 + 代理池实现高并发批量运营。

场景 5:复杂长流程编排

将多个页面动作组合为自定义流程,一键执行完整业务链路,支持断点续跑、异常告警。

八、二次开发惊喜拓展方向

  1. 验证码识别插件开发:接入识图接口,封装通用滑块、点选、文字验证码自动识别插件。
  2. 分布式集群部署:改造任务调度层,做多机分布式浏览器集群,支撑超大规模并发任务。
  3. 流程可视化编辑器:搭建拖拽式流程画布,零代码编排浏览器自动化流程。
  4. 请求篡改 & 接口爬虫:基于抓包能力,封装接口批量采集、参数篡改、模拟 API 请求。
  5. 多浏览器兼容:拓展 Firefox、Edge、移动端模拟器,适配多终端页面操作。
  6. AI 智能交互:结合大模型,实现自然语言指令操控浏览器、页面内容智能解读、自主完成复杂任务。
  7. 行为录制回放:新增录制功能,真人操作一遍后自动生成脚本,一键回放执行。