一、技能总览
Agent Browser 是基于无头浏览器与人机模拟技术打造的高阶浏览器自动化中枢,区别于传统爬虫与简单脚本点击,主打拟人行为模拟、可视化流程编排、分布式任务、防检测绕过、插件化扩展、全链路浏览器动作封装。支持网页访问、元素交互、表单填报、截图录屏、网络抓包、JS 注入、多标签页管控等全浏览器能力,既可实现简单批量操作,也能搭建复杂长流程 RPA 任务。
深度融入 OpenClaw 技术生态,串联数据采集、图文处理、文档解析、消息推送等模块,实现网页操作→数据抓取→内容处理→结果归档→告警推送端到端自动化。同时提供完整可落地的二次开发代码、自定义 API、行为插件、任务调度体系,是网页 RPA、智能爬虫、页面测试、批量运营、私有浏览器机器人开发的核心底座。
二、传统浏览器自动化痛点 & 二开惊喜升级
(一)传统工具现存短板
- 极易被反爬识别:原生驱动特征明显,指纹、请求头、行为轨迹单一,高频触发网站人机验证、封禁 IP。
- 代码碎片化:单页操作、多流程切换需要大量重复编码,长流程脚本臃肿、难维护。
- 行为生硬:固定间隔点击、匀速滑动,不符合真人浏览习惯,风控拦截概率高。
- 能力单一:缺少录屏、抓包、多会话隔离、代理轮换、弹窗自动处理等实用能力。
- 拓展性差:无法热加载自定义脚本、第三方插件,新增业务流程需全量改写代码。
- 运维困难:无任务监控、异常自动重试、日志溯源,出错后排查效率低。
- 生态割裂:浏览器获取的数据、截图无法直接对接本地图文、文档、办公工具。
(二)本工具独家二开增强亮点
✅ 全维度浏览器指纹伪装:随机 UA、画布指纹、WebGL、字体、分辨率,模拟真实设备,大幅降低风控拦截。
✅ 拟人化行为引擎:随机点击间隔、模拟人类滑动 / 滚轮、轨迹偏移、停顿思考,完全规避机器特征。
✅ 完整分层代码架构:提供前端调用层、核心驱动层、任务调度层、插件层全套可运行源码,直接二次开发、自定义改造。
✅ 多会话 & 代理池支持:多标签、多浏览器实例隔离运行,自动轮换代理 IP,支持高并发批量任务。
✅ 全功能封装:元素点击、输入、下拉选择、文件上传、弹窗关闭、JS 注入、截图、录屏、网络请求拦截一站式封装。
✅ 可视化流程 + 脚本双模式:新手用指令编排流程,开发者直接基于源码开发复杂自定义逻辑。
✅ 插件热插拔架构:自定义行为插件、站点适配插件、验证码识别插件,不停机加载生效。
✅ 完善任务管控:任务队列、失败自动重试、断点续跑、全链路日志、异常截图溯源。
✅ 生态全域互通:抓取数据对接金融 / 市场数据工具,页面截图联动图像处理,结果自动推送飞书。
三、核心功能模块
(一)基础浏览器操控能力
- 页面导航:打开网址、刷新、前进、后退、跳转新标签、关闭标签页。
- 元素交互:精准定位元素、单击 / 双击 / 右键、文本输入、下拉选择、单选 / 复选框勾选。
- 表单处理:批量填报表单、文件本地上传、表单重置、提交表单。
- 弹窗适配:自动识别弹窗、广告、确认框、提示框,智能关闭或确认。
(二)拟人化反检测体系(核心)
- 设备指纹随机化:浏览器版本、操作系统、屏幕分辨率、语言、时区动态变更。
- 行为随机化:操作间隔随机、鼠标轨迹非线性偏移、分段滚轮、模拟停留阅读。
- 请求伪装:请求头、Cookie、缓存策略模拟真人,屏蔽自动化特征接口。
(三)媒体与网络能力
- 画面采集:区域截图、整页长截图、窗口截图,自动保存并调用图像处理工具。
- 屏幕录屏:任务全程录制视频,用于流程复盘与问题排查。
- 网络抓包:拦截请求与响应、提取接口数据、篡改请求参数、过滤无效请求。
- JS 脚本注入:运行自定义 JS 代码、获取页面隐藏数据、修改页面 DOM。
(四)多实例与并发调度
- 多标签并行:单浏览器多标签独立操作,互不干扰。
- 多实例隔离:启动多个浏览器进程,会话、Cookie 完全隔离。
- 代理 IP 轮换:内置代理池,任务自动切换 IP,支持按任务 / 按标签轮换。
- 任务队列:高并发任务排队执行,限制并发数,避免服务器压力过载。
(五)插件化拓展系统(二开核心)
- 站点适配插件:针对复杂网站编写专属定位规则、兼容逻辑。
- 验证码插件:对接识图服务,自动处理图形验证码、滑块验证码。
- 自定义行为插件:封装通用组合动作,一键复用复杂流程。
- 热加载机制:新增插件无需重启服务,即时生效。
(六)任务运维与日志
- 全量日志:记录每一步操作、元素位置、请求信息、执行耗时。
- 异常处理:元素未找到、加载超时、网络异常自动重试,超时判定。
- 断点续跑:任务中断后,下次执行从断点继续,无需从头运行。
- 异常快照:执行失败自动截图,快速定位问题页面。
(七)OpenClaw 全生态联动
- 数据流转:网页抓取的行情、公告、行业数据同步至金融数据、市场调研工具。
- 图文处理:页面截图、网页图片自动调用图像处理工具优化、打码、OCR 识别。
- 文档解析:下载网页 PDF、附件,联动 PDF 提取工具解析内容。
- 办公推送:任务结果、异常告警、抓取报表自动推送飞书。
- 可视化展示:抓取的表格数据接入图表生成器,制作统计图表。
四、分层架构(适配深度二次开发)
- 指令调用层:对外提供语义化指令,供 OpenClaw 统一调用,参数统一解析校验
- 任务调度层:任务队列、并发控制、重试策略、断点记录、定时任务管理
- 浏览器管理层:实例创建、销毁、标签页管控、会话隔离、代理分配
- 驱动核心层:基于 Playwright/Puppeteer 封装,元素定位、行为模拟、JS 执行
- 反检测层:指纹篡改、UA 伪装、行为随机化、请求特征屏蔽
- 媒体 & 网络层:截图、录屏、抓包、请求拦截、文件下载上传
- 插件运行层:插件容器、热加载、插件通信、自定义逻辑执行
- 日志 & 监控层:日志收集、异常捕获、快照保存、运行状态监控
- 生态对接层:对接全系工具,完成数据、文件、消息跨模块流转
五、完整二次开发代码(可直接运行)
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:复杂长流程编排
将多个页面动作组合为自定义流程,一键执行完整业务链路,支持断点续跑、异常告警。
八、二次开发惊喜拓展方向
- 验证码识别插件开发:接入识图接口,封装通用滑块、点选、文字验证码自动识别插件。
- 分布式集群部署:改造任务调度层,做多机分布式浏览器集群,支撑超大规模并发任务。
- 流程可视化编辑器:搭建拖拽式流程画布,零代码编排浏览器自动化流程。
- 请求篡改 & 接口爬虫:基于抓包能力,封装接口批量采集、参数篡改、模拟 API 请求。
- 多浏览器兼容:拓展 Firefox、Edge、移动端模拟器,适配多终端页面操作。
- AI 智能交互:结合大模型,实现自然语言指令操控浏览器、页面内容智能解读、自主完成复杂任务。
- 行为录制回放:新增录制功能,真人操作一遍后自动生成脚本,一键回放执行。