Skip to content

jaydenjd/webcli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

webcli — 给 AI Agent 的浏览器操作 Skill

让 AI Agent 直连你的 Chrome,完成搜索、抓数据、自动化操作等一切联网任务。


这是什么

Agent 原生有 WebSearch、WebFetch,但面对需要登录态、动态渲染、页面交互的场景就无能为力了。这个 skill 补上的是:联网决策 + CDP 浏览器操作 + 站点经验积累

  • 联网决策:什么场景用 WebSearch、WebFetch、curl、还是浏览器 CDP,有明确决策规则,Agent 自动选择最优路径
  • CDP 浏览器操作:直连你日常用的 Chrome,天然携带登录态和 Cookie,支持点击、填表、抓包、截图等完整交互
  • 站点经验积累:每次完成任务后自动沉淀经验,下次同类任务直接复用,越用越快

本项目借鉴了 eze-is/web-access 的核心思路,在此基础上做了以下改进:

  • Python 实现,专用 CLI:原项目用 Node.js + HTTP API(curl localhost:3456/new?url=...),本项目改为 Python 实现,提供 webcli 命令行工具,命令更自然、可读性更强
  • 结构化经验管理:原项目经验以 Markdown 文件存储,本项目新增 webcli exp 专用命令,支持按类型(api/login/action/anti-crawl)分类存储和查询,经验复用更精准
  • 更丰富的命令集:新增 open-monitored(一步开启网络监控)、find(按文字/角色定位元素)、wait(等待条件)、scripts-*(JS 源码捕获)等命令,覆盖更多自动化场景
  • 无环境变量依赖:原项目依赖 $CLAUDE_SKILL_DIR 环境变量,本项目通过 pip install -e . 安装后直接使用,环境更简单

安装

# 安装skill 
npx skills add https://github.com/jaydenjd/webcli.git -g -y

# 克隆项目;如果只是开发,可以 clone 到其他目录也可
git clone https://github.com/jaydenjd/webcli ~/.claude/skills/webcli
cd ~/.claude/skills/webcli
pip3 install -e .

注意pip3 install -e . 是必须执行的步骤,否则 webcli 命令不可用。

更新:拉取最新代码后重新安装即可;如果修改了 cdp_proxy.py,需要重启 Proxy:

pkill -f "cdp_proxy"   # kill 后执行任意 webcli 命令会自动重新拉起

让 Agent 加载这个 skill:安装完成后,在对话里告诉 Agent:

请加载 ~/.claude/skills/webcli/SKILL.md 并按照其中的指引完成任务

Chrome 配置

macOS / Windows 用户直连日常 Chrome(携带登录态和 Cookie),一次性配置即可;Linux 服务器需手动启动 headless Chrome,流程更简单。

macOS / Windows 桌面环境

Chrome 需要开启远程调试(一次性配置):

  1. Chrome 地址栏打开 chrome://inspect/#remote-debugging
  2. 勾选 Allow remote debugging for this browser instance(可能需要重启浏览器)

配置完成后,Proxy 自动探测到已有 Chrome(9222),直接使用:

webcli health

需要隔离环境时(操作不同账号、不带登录态),手动启动第二个 Chrome:

# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --remote-debugging-port=9223 \
  --user-data-dir="/tmp/chrome" \
  --no-first-run --no-default-browser-check
  
# Windows
start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--remote-debugging-port=9223 ^
--user-data-dir="%TEMP%\chrome" ^
--no-first-run --no-default-browser-check 

# Linux
google-chrome --headless=new --remote-debugging-port=9223 \
  --user-data-dir=/tmp/chrome-9223 --no-first-run &
# 启动第二个 Proxy 连接隔离 Chrome
python browser_cdp/cdp_proxy.py --port 3457 --chrome-port 9223 &

# 操作隔离 Chrome 时加端口前缀
CDP_PROXY_PORT=3457 webcli new https://example.com
macOS 默认 macOS 隔离实例 Linux
Chrome 端口 9222(已有) 9223(手动启动) 9223(手动启动)
Proxy 端口 3456(默认) 3457(手动启动) 3456(默认)
webcli 使用 直接用 CDP_PROXY_PORT=3457 webcli 直接用

环境检查(Agent 运行时会自动完成前置检查,无需手动执行):

check-deps

webcli 常用命令

Proxy 通过 WebSocket 直连 Chrome,Agent 会自动管理生命周期,无需手动启动。所有操作通过 webcli 执行:

# 查看所有命令
webcli --help

# Tab 管理
webcli tabs                                    # 列出所有 tab
webcli new https://example.com                    # 新建 tab
TARGET=$(webcli new https://example.com --id-only) # 新建并获取 targetId
webcli open-monitored https://example.com         # 新建 tab 并同时开启网络监控
webcli close $TARGET                              # 关闭 tab

# 页面操作
webcli snapshot $TARGET                           # 获取无障碍树(推荐用于 AI 导航)
webcli eval $TARGET "document.title"              # 执行 JS
webcli screenshot $TARGET ./shot.png              # 截图
webcli scroll $TARGET bottom                      # 滚动到底部

# 点击与交互
webcli click $TARGET "button.submit"              # JS 点击
webcli click-at $TARGET ".upload-btn"             # 真实鼠标点击
webcli find $TARGET text "下一页" click           # 按文字内容点击
webcli fill $TARGET "input[name=q]" "搜索词"      # 填写输入框

# 网络请求捕获
webcli network-start $TARGET                      # 开始捕获
webcli network-requests $TARGET --type xhr,fetch  # 查看请求列表
webcli network-request $TARGET <requestId>        # 查看单个请求详情

# 经验管理(跨 session 积累,越用越快)
webcli exp list bilibili.com                      # 查看某站点的所有经验
webcli exp api bilibili.com popular-list          # 读取接口类经验
webcli exp action xiaohongshu.com post            # 读取操作类经验
webcli exp action sls query-log                   # 读取跨站点流程经验
webcli exp edit api yiche.com salesrank           # 读取并编辑经验
webcli exp save api yiche.com rank                # 保存新经验(Agent 自动调用)

开始使用

安装并配置好 Chrome 后,在对话里加载 skill,然后直接说你想做什么:

请加载 ~/.claude/skills/webcli/SKILL.md 并按照其中的指引完成任务:
帮我抓取 B站今天的热门视频榜单

Agent 会自动判断用哪种方式完成任务(搜索、直接请求、还是打开浏览器操作),不需要你指定。

场景全景图

浏览器操作 → 命令对照

操作 命令 样例
打开链接 webcli new <url> webcli new https://www.bilibili.com/v/popular/all
点击元素 webcli click <id> <selector> webcli click $T "#login-btn"
真实鼠标点击 webcli click-at <id> <selector> 滑块验证码、Canvas 元素
按文字点击 webcli find <id> --by text "下一页" --action click 不需要知道选择器
填写表单 webcli fill <id> <selector> <value> webcli fill $T "#search" "iPhone 16"
截图 webcli screenshot <id> /tmp/out.png 截图展示二维码、采集视频帧
抓包 webcli open-monitored <url> + network-requests 找到页面背后的数据接口
执行 JS webcli eval <id> "<js>" 提取 DOM 数据、操控 video 元素
滚动 webcli scroll <id> bottom 触发懒加载,加载更多内容
等待 webcli wait <id> --text "加载完成" 等待异步内容渲染完毕
获取 Cookie webcli cookies <id> 登录后导出 Cookie 供后续使用

使用场景 → 完整流程样例

📊 数据抓取(B站热门榜)

用户说:「帮我抓取 B站今天的热门视频榜单」

1. 查询经验:webcli exp action bilibili.com popular-list
   → 有经验!直接按经验执行,跳过探索步骤

2. 打开页面,滚动到底部触发懒加载
   webcli new https://www.bilibili.com/v/popular/all
   webcli scroll $T bottom && sleep 1.5

3. 用 eval 提取数据(经验提供了选择器)
   webcli eval $T "Array.from(document.querySelectorAll('.video-card')).map(c => ({
     rank: ..., title: ..., up: ..., link: ...
   }))"

结果:60 条热门视频数据,含排名、标题、UP主、链接


🔍 数据收集(发现并复用接口)

用户说:「帮我查一下易车最新的汽车销量排行」

1. 查询经验:webcli exp api yiche.com rank → 无经验,开始探索

2. 打开页面并开启网络监控
   webcli open-monitored https://www.yiche.com/rank/

3. 查找数据接口
   webcli network-requests $T --type xhr,fetch
   → 发现:GET https://api.yiche.com/rank/sales?ps=20&pn=1

4. 验证接口直接可用,curl 直接拿数据 ✅

5. 自动沉淀经验(无需用户指令)
   webcli exp save api yiche.com rank << EOF
   # 易车销量榜接口
   ## 接口信息
   - URL: https://api.yiche.com/rank/sales?ps={size}&pn={page}
   ...
   EOF

下次:直接读经验,秒级完成,无需重新探索


🤖 自动化操作(自动发帖)

用户说:「帮我在小红书发一篇笔记,标题是 xxx,内容是 yyy」

1. 查询经验:webcli exp action xiaohongshu.com post → 有经验,含关键选择器

2. 打开发布页
   webcli new https://creator.xiaohongshu.com/publish/publish

3. 按经验填写内容并发布
   webcli fill $T ".title-input" "xxx"
   webcli fill $T ".content-editor" "yyy"
   webcli click $T ".publish-btn"
   webcli wait $T --text "发布成功"

🔄 流程操作(查询 SLS 日志)

用户说:「帮我查一下今天 order-service 的 ERROR 日志」

1. 查询经验:webcli exp action sls query-log → 有经验,含完整操作步骤

2. 打开 SLS 控制台,选择 Logstore,填写查询条件
   webcli new https://sls.console.aliyun.com/...
   webcli find $T --by text "order-service" --action click
   webcli fill $T ".query-input" "level: ERROR"
   webcli click $T ".search-btn"

3. 等待结果,提取并分析日志
   webcli wait $T --text "查询完成"
   webcli eval $T "提取日志列表..."

🔐 登录态操作(内部系统)

用户说:「帮我在 Aone 上查一下我今天的 CR 列表」

直连用户日常 Chrome(天然携带登录态,无需任何登录步骤)
webcli new https://aone.alibaba-inc.com/...
webcli eval $T "提取 CR 列表..."

经验场景 → 沉淀什么、怎么用

经验类型 沉淀时机 存储内容 下次使用效果
api 发现并验证了数据接口 URL 模板、参数说明、响应字段 直接 curl 调接口,跳过页面操作
login 完成了自动化登录 选择器、操作步骤、Cookie 字段 自动重新登录,无需用户介入
action 完成了复杂页面操作或跨站点流程 选择器、操作序列、步骤流程、已知陷阱 直接执行,跳过探索和试错
anti-crawl 突破了反爬机制 识别特征、对抗方案、成功率 遇到同类反爬直接套用方案

经验带来的核心价值

第一次执行某任务:探索 → 试错 → 成功 → 自动沉淀经验   耗时:5-15 分钟
第二次执行同类任务:查询经验 → 直接执行               耗时:30 秒 - 2 分钟

积累效应:经验越多 → 执行越快 → 覆盖场景越广

附录

手动启动 CDP Proxy

通常无需手动启动,webcli 会自动管理 Proxy 生命周期。仅在需要精确控制端口(如双实例并存)时使用:

# 基本启动(默认端口 3456,自动探测 Chrome)
python browser_cdp/cdp_proxy.py &

# 指定 Proxy 端口和 Chrome 端口
python browser_cdp/cdp_proxy.py --port 3456 --chrome-port 9222 &

# 启动第二个 Proxy 连接另一个 Chrome 实例(后台运行)
python browser_cdp/cdp_proxy.py --port 3457 --chrome-port 9223 &
参数 说明 默认值
--port Proxy HTTP 监听端口 CDP_PROXY_PORT 环境变量,或 3456
--chrome-port Chrome 远程调试端口 CDP_CHROME_PORT 环境变量,或自动探测

命令行参数优先级高于环境变量。

webcli 命令大全

分类 命令 说明
🌐 浏览器与标签页管理 browser 检查 Chrome 状态,如果未运行则显示启动说明
health 健康检查 — 显示 Proxy 状态和 Chrome 连接情况
tabs / targets 列出所有浏览器标签页
new <url> 新建标签页并等待加载完成
open-monitored <url> 新建标签页并从第一个请求起开启网络监控
close <target_id> 关闭标签页
🧭 页面导航 navigate <target_id> <url> 在当前标签页导航到指定 URL
back <target_id> 后退到上一页
forward <target_id> 前进到下一页
reload <target_id> 刷新标签页并等待加载完成
📸 页面信息获取 info <target_id> 获取页面基本信息(标题、URL、尺寸)
get <target_id> <property> 获取页面或元素属性(title, url, text, html, count, box, value)
snapshot <target_id> 获取无障碍树(含元素引用),AI 导航首选
screenshot <target_id> [path] 截图。指定路径则保存到文件,否则输出二进制到 stdout
console <target_id> 获取页面拦截到的 console 日志
page-errors <target_id> 获取页面错误信息(JavaScript 错误、未处理的 Promise 拒绝、console.error)
🖱️ 元素交互 click <target_id> <selector> 点击元素(JS el.click() 方式)
click-at <target_id> <selector> 点击元素(CDP 真实鼠标事件,适用于滑块、Canvas 等)
hover <target_id> <selector> 悬停到指定元素上
focus <target_id> <selector> 聚焦到指定元素
drag <target_id> <from> <to> 拖拽元素。from 和 to 可以是 CSS 选择器或坐标(如 "100,200")
scroll <target_id> [direction] 滚动页面。参数:top | bottom | up | down | <像素数>
press <target_id> <key> 按下按键或组合键(如 Enter、Tab、Control+a、Shift+ArrowDown)
📝 表单操作 fill <target_id> <selector> <value> 清空并填写输入框(直接设置 value,触发 input/change 事件)
type <target_id> <selector> <text> 逐字符输入文本(模拟真实键盘事件)
select <target_id> <selector> <value> 按值或可见文本选择下拉框选项
check <target_id> <selector> 勾选复选框
uncheck <target_id> <selector> 取消勾选复选框
set-files <target_id> <selector> <files...> 为文件输入框设置文件(绕过系统文件选择对话框)
🔍 元素查找与状态检查 find <target_id> <locator> [action] 按语义定位器查找元素并执行操作(无需知道 CSS 选择器)
is <target_id> <state> <selector> 检查元素状态:visible(可见)、enabled(可用)、checked(已勾选)
⏱️ 等待 wait <target_id> [options] 等待元素、毫秒数、文本出现或 JS 条件成立
📊 网络请求捕获 network-start <target_id> 开始捕获标签页的网络请求
network-stop <target_id> 停止捕获网络请求
network-requests <target_id> [options] 列出捕获的网络请求,支持多种过滤条件
network-request <target_id> <request_id> 获取单个请求的完整详情(含响应体)
network-clear <target_id> 清空已捕获的请求记录(保持捕获继续运行)
📜 脚本捕获 scripts-enable <target_id> 启用 Debugger 域,开始捕获标签页加载的所有脚本
scripts-list <target_id> 列出标签页已捕获的脚本(默认排除 chrome-extension 脚本)
scripts-source <target_id> <script_id> 获取指定脚本的源码
💾 数据存储 cookies <target_id> 获取当前页面的 Cookie
cookies-set <target_id> <name> <value> 设置 Cookie
cookies-clear <target_id> 清除浏览器中所有 Cookie
storage <target_id> <type> <key> 获取 localStorage 或 sessionStorage 的值
storage-set <target_id> <type> <key> <value> 设置 localStorage 或 sessionStorage 的值
storage-clear <target_id> <type> 清空 localStorage 或 sessionStorage
🪟 对话框处理 dialog-status <target_id> 检查当前是否有 JavaScript 对话框(alert/confirm/prompt)弹出
dialog-accept <target_id> [text] 确认(接受)JavaScript 对话框。prompt 对话框可传入文本
dialog-dismiss <target_id> 取消(关闭)JavaScript 对话框
💻 JavaScript 执行 eval <target_id> <expression> 执行 JavaScript。可直接传表达式、用 -f 指定文件,或通过 stdin 管道输入
📚 经验库管理 exp list [site] 列出所有经验,或指定站点的经验
exp api <site> <name> 查看接口类经验
exp login <site> <name> 查看登录类经验
exp action <site> <name> 查看操作类经验
exp anti-crawl <type> 查看反爬对抗经验
exp save <category> <site> <name> 从 stdin 保存经验
exp edit <category> <site> <name> 用编辑器打开经验文件
exp del <category> <site> <name> 删除经验(有确认提示)
exp update <category> <site> <name> [options] 更新经验的使用记录或追加内容
ℹ️ 帮助 show-help 显示所有可用命令的使用摘要
--help 显示帮助信息

webcli exp 命令

webcli exp      
Usage: webcli exp [OPTIONS] COMMAND [ARGS]...

  经验库管理(纯本地文件操作,不依赖 Proxy)。

  分类说明(站点级):
    api        接口数据获取经验(URL、参数、响应字段、加密破解)
    login      自动化登录经验(登录流程、Cookie 获取、验证码处理)
    action     自动化操作经验(页面交互流程、表单提交、上传、跨站点流程等)

  分类说明(全局级,不绑定站点):
    anti-crawl 反爬对抗经验(跨站点通用,按反爬类型组织)

  示例:
    webcli exp list                          # 列出所有经验
    webcli exp list yiche.com                # 列出某站点经验
    webcli exp api yiche.com rank            # 查看易车销量榜接口经验
    webcli exp login taobao.com              # 查看淘宝登录经验
    webcli exp action xiaohongshu.com post   # 查看小红书发帖操作经验
    webcli exp action sls query-log          # 查看查询 SLS 日志的流程经验
    webcli exp anti-crawl cloudflare         # 查看 Cloudflare 对抗经验
    webcli exp save api yiche.com rank       # 从 stdin 保存/更新站点级经验
    webcli exp save action sls query-log     # 从 stdin 保存/更新流程经验
    webcli exp edit api yiche.com rank       # 用编辑器打开经验文件
    webcli exp del api yiche.com rank         # 删除经验(有确认提示)
    webcli exp del api yiche.com rank --yes   # 跳过确认直接删除

Options:
  --help  Show this message and exit.

Commands:
  action      快捷方式:查看操作类经验(省略 show 子命令)。
  anti-crawl  快捷方式:查看全局分类经验(不绑定站点,省略 show 子命令)。
  api         快捷方式:查看接口类经验(省略 show 子命令)。
  del         删除一条经验记录(默认有确认提示)。
  edit        用系统编辑器打开经验文件(文件不存在时自动创建模板)。
  list        列出所有经验,或指定站点的经验。
  login       快捷方式:查看登录类经验(省略 show 子命令)。
  save        从 stdin 保存经验(Agent 写入时使用)。
  show        查看某条经验的完整内容。
  update      更新经验的使用记录(last_used_at 和 last_used_status)或追加内容。

使用样例

> webcli exp list       
分类           站点                        名称
------------------------------------------------------------
api          ithome.com                rank

> webcli exp show api ithome.com rank
---
site: ithome.com
category: api
status: verified
created_at: 2026-04-06
updated_at: 2026-04-06
tags: [rank, news, daily, weekly, monthly, hot-comment]
---

# IT之家排行榜数据(DOM 提取)

## 接口信息
- **页面 URL**: `https://m.ithome.com/rankm/`
- **数据源**: SSR 直出
- **渲染方式**: 服务端渲染,数据直接在 HTML 中
- **数据结构**: 页面包含四个榜单(日榜、周榜、热评、月榜),每个榜单 12 条新闻

About

agent操作浏览器的最佳工具

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages