扫码
40.67M · 2026-04-17
作为开发者,你可能经常遇到这样的场景:
传统方案的痛点:
| 方案 | 问题 |
|---|---|
| 手动爬虫 | 每个网站一套代码、反爬虫升级就失效、维护成本高 |
| 付费 API | 昂贵、功能受限、小网站根本没有 API |
| Puppeteer | 重量级、启动慢(3-5 秒)、无法复用登录态 |
OpenCLI 的核心洞察:既然你的浏览器已经登录了这些网站,为什么不直接复用它?
# 一条命令,结构化数据
opencli bilibili hot --limit 5 -f json
# 管道组合,Unix 哲学
opencli xiaohongshu search --query "AI" | jq '.[] | .title'
# 甚至支持桌面应用
opencli cursor ch@t "Fix the auth bug"
这是理解 OpenCLI 的关键 —— 它避开了 HTML 解析的复杂性。
用户请求 → 加载 HTML → 解析 DOM → 提取数据
(页面结构易变、反爬虫检测、维护困难)
问题在于:
.title → .title-text → [data-title])用户请求 → 网络流量 → 拦截 JSON API → 提取数据
(API 结构稳定、版本化、无需解析 HTML)
实际案例:获取 Bilibili 热门视频
传统方式(HTML 解析):
// 容易失败
await page.goto('https://www.bilibili.com/ranking');
const titles = await page.$$eval('.video-title', els =>
els.map(e => e.textContent)
);
// 问题:CSS 选择器可能随时改变
OpenCLI 方式(JSON 拦截):
// 稳定可靠
await page.goto('https://www.bilibili.com');
page.on('network', (req) => {
if (req.url.includes('/x/web-interface/popular')) {
const data = JSON.parse(req.response);
return data.data.list; // 明确的路径
}
});
// 优势:API 路径稳定(很少变更)
| 维度 | HTML 结构 | JSON API |
|---|---|---|
| 变更频率 | 高(UI 改版就变) | 低(有版本控制) |
| 数据位置 | 模糊(需要猜测选择器) | 明确(data.list.items) |
| 向后兼容 | 无保证 | 通常有兼容策略 |
| 反爬虫 | 检测 DOM 操作 | 复用登录态,不被检测 |
关键数据:OpenCLI 的 87+ 个适配器中,95% 基于 JSON API,失效率远低于传统 HTML 爬虫。
OpenCLI 如何在不启动独立浏览器的情况下,复用你已登录的 Chrome?
| 方案 | 问题 |
|---|---|
| Puppeteer | 启动独立浏览器、无法复用登录态、每次冷启动 3-5 秒 |
| CDP 直连 | 需要 Chrome 启动时加 --remote-debugging-port、安全风险 |
┌──────────────────────────────────────┐
│ CLI 进程 (Node.js) │
│ opencli bilibili hot │
└────────────┬─────────────────────────┘
│ HTTP POST
↓
┌──────────────────────────────────────┐
│ 本地守护进程 (localhost:19825) │
│ • 自动启动 │
│ • 安全验证(Origin + 自定义头) │
└────────────┬─────────────────────────┘
│ WebSocket
↓
┌──────────────────────────────────────┐
│ Chrome 扩展后台脚本 │
│ • 命令 │
│ • 调用 DevTools Protocol │
└────────────┬─────────────────────────┘
│ CDP
↓
┌──────────────────────────────────────┐
│ Chrome 页面实例 │
│ • 执行 JavaScript │
│ • 复用 Cookie(已登录) │
└──────────────────────────────────────┘
想象你同时运行多个任务:
opencli xiaohongshu search "旅游" & # 后台任务 1
opencli bilibili hot & # 后台任务 2
opencli zhihu hot # 前台任务
传统方案需要启动 3 个浏览器实例(~600MB 内存、3×3 秒启动时间)。
OpenCLI 的方案:单个浏览器,多个独立标签页
┌────────────────────────┐
│ Chrome 窗口 │
│ │
│ [标签1: 用户正常浏览] │
│ [标签2: workspace="xiaohongshu"] ← 后台任务 1
│ [标签3: workspace="bilibili"] ← 后台任务 2
│ [标签4: workspace="zhihu"] ← 前台任务
└────────────────────────┘
性能对比:
传统方案:
3 个独立 Chrome → 启动 9 秒 → 600MB 内存
OpenCLI:
1 个 Chrome + 守护进程 → 启动 0.5 秒 → 200MB 内存
加速 18 倍
类比说明: 就像图书馆的阅览室 —— 传统方案是每个人占一整层楼(浏览器实例),OpenCLI 是每个人占一个独立阅览室(标签页)—— 共享基础设施(电力、网络、门禁卡),但各自独立工作。
你可能会问:OpenCLI 如何处理不同网站的登录和 token?
OpenCLI 的核心理念:不存储任何凭证,而是复用浏览器的认证状态。
OpenCLI 根据网站的认证复杂度,自动选择最合适的策略:
Tier 1: PUBLIC(无需认证)
→ 示例:HackerNews、arXiv
→ 方式:直接 HTTP 请求
→ Token:无
Tier 2: COOKIE(复用浏览器 Cookie)
→ 示例:Bilibili、小红书、T@witter
→ 方式:页面内 fetch() 自动携带 Cookie
→ Token:浏览器管理,OpenCLI 不存储
Tier 2.5: LOCALSTORAGE(从浏览器提取 Bearer Token)
→ 示例:Notion、Linear、现代 SaaS
→ 方式:从 localStorage 读取 access_token
→ Token:临时提取,不持久化
Tier 3: HEADER(提取 CSRF Token)
→ 示例:T@witter(需要 x-csrf-token)
→ 方式:从 meta 标签或 localStorage 提取
→ Token:每次请求时动态获取
Tier 4: INTERCEPT(拦截并注入头)
→ 示例:企业微信、加密 API
→ 方式:劫持 fetch/XHR,自动注入认证头
→ Token:由网站自己的 JS 生成
Tier 5: UI(最后手段)
→ 示例:强反爬虫网站
→ 方式:直接操作 UI,不涉及 API
→ Token:无(纯 UI 自动化)
// 用户已在 Chrome 中登录 Bilibili
// OpenCLI 执行时:
pipeline: [
{ navigate: 'https://www.bilibili.com' }, // 加载页面(Cookie 自动携带)
{ evaluate: `
(async () => {
const res = await fetch('https://api.bilibili.com/x/web-interface/popular', {
credentials: 'include' // ← 关键:复用 Cookie
});
return res.json();
})()
`}
]
// OpenCLI 不知道也不存储 Cookie
// 完全由浏览器管理
// 现代 SaaS 应用通常将 token 存在 localStorage
pipeline: [
{ navigate: 'https://www.notion.so' },
{ evaluate: `
(async () => {
// 从 localStorage 提取 token
const token = localStorage.getItem('access_token');
const res = await fetch('https://api.notion.com/v1/pages', {
headers: {
'Authorization': 'Bearer ' + token // ← 临时提取
}
});
return res.json();
})()
}
]
// token 不会被 OpenCLI 存储
// 只在执行时临时读取
// T@witter 需要 CSRF token
pipeline: [
{ navigate: 'https://twitter.com' },
{ evaluate: `
(async () => {
// 动态提取 CSRF token
const csrf = document.querySelector('[name="csrf-token"]')?.content;
const res = await fetch('https://api.twitter.com/graphql/...', {
headers: {
'x-csrf-token': csrf, // ← 每次动态获取
},
credentials: 'include'
});
return res.json();
})()
}
]
你可能担心:这样安全吗?
OpenCLI 的安全设计:
| 层面 | 防护措施 |
|---|---|
| 凭证存储 | 不存储任何 Cookie、Token、密码 |
| 通信隔离 | Origin 检查 + 自定义头验证(防 CSRF) |
| 日志脱敏 | 自动过滤 Authorization、Cookie 等敏感头 |
| 会话隔离 | 每个工作区独立(不会相互污染) |
| 权限最小化 | 只在浏览器上下文中读取,不跨域传输 |
关键原则:
OpenCLI 的角色 = 代码执行者
认证的管理者 = 浏览器本身
OpenCLI 从不:
存储密码
导出 Cookie
持久化 Token
跨域传输凭证
OpenCLI 只是:
在浏览器环境内执行 JavaScript
利用浏览器自动携带 Cookie 的机制
临时读取页面可访问的数据(和网页 JS 权限相同)
类比:
OpenCLI 就像浏览器的开发者工具(DevTools Console)—— 你在 Console 里执行 fetch() 也会自动携带 Cookie,但这不意味着 Console "管理"了你的 Token。OpenCLI 的权限范围和 DevTools 完全相同。
OpenCLI 最强大的功能:让 AI 自动将网站转化为 CLI。
$ opencli generate --goal "hot movies"
背后发生了什么:
[1/4] 探索 API (10s)
→ 浏览器打开 douban.com
→ 网络流量
→ 捕获 3 个 JSON 请求
→ 过滤噪音(日志、埋点、心跳)
保留 1 个有价值 API
[2/4] 分析结构 (5s)
→ API: /api/movie/hot
→ 响应: { data: { items: [...] } }
→ 字段匹配:title, director, rating
→ 参数推断:limit (从 ?count=20)
推断完成
[3/4] 生成代码 (5s)
→ 认证策略:cookie
→ 生成管线:navigate → evaluate → map → limit
→ 保存到:~/.opencli/clis/douban/hot.js
代码已生成
[4/4] 验证输出 (10s)
→ 执行管线
→ 返回 25 条数据
验证通过
────────────────────────────────
新命令已就绪!
opencli douban hot
opencli douban hot --limit 10 -f json
────────────────────────────────
你可能会问:这是用 GPT 生成的吗?
答案:不是!OpenCLI 使用 100% 规则引擎,零 LLM 调用。
字段角色检测(模式匹配):
const FIELD_ROLES = {
title: ['title', 'name', 'text', 'subject'],
author: ['author', 'username', 'owner', 'up_name'],
score: ['score', 'likes', 'view_count', 'play'],
time: ['time', 'created_at', 'publish_time']
};
// 自动匹配
detectFieldRoles(['title', 'owner.name', 'stat.view'])
// → { title: 'title', author: 'owner.name', score: 'stat.view' }
能力名称推断(URL 规则):
const url = "https://api.example.com/popular";
if (url.includes('hot') || url.includes('popular')) return 'hot';
if (url.includes('search')) return 'search';
// → 推断为 'hot'
为什么不用 LLM?
| 维度 | 规则引擎 | LLM |
|---|---|---|
| 成本 | 免费 | $0.01-0.1/次 |
| 速度 | 毫秒级 | 秒级 |
| 确定性 | 100% | 有随机性 |
| 可调试 | 可追踪 | 黑盒 |
README 的承诺:"Zero LLM cost — Run 10,000 times and pay nothing."
你可能担心:外部 API 会变更,适配器岂不是会失效?
OpenCLI 设计了 5 层防御机制:
$ opencli bilibili hot
[第一次尝试]
→ 提取路径: data.list
返回: null (API 改为 data.result.items)
[自动修复]
→ 重新探测 API 响应
→ 发现新路径: data.result.items
→ 更新适配器
[第二次尝试]
成功!
成功率:80% 的 API 变更可自动修复(主要是路径变化)。
自动修复失败时,生成详细诊断报告:
$ OPENCLI_DIAGNOSTIC=1 opencli xiaohongshu search --query "旅游" 2> diag.json
诊断报告包含:
AI Agent 可基于诊断报告自动修复,或人工快速定位问题。
最简单粗暴的方法:
rm ~/.opencli/clis/xiaohongshu/search.js
opencli generate --goal "search"
完全基于最新 API,自动适应结构变化。
当 API 完全加密或失效:
// 从 API 方式降级到 UI 方式
pipeline: [
{ navigate: 'https://www.bilibili.com/ranking' },
{ wait: 2000 },
{ select: '.rank-item .title' }, // CSS 选择器
{ map: { title: '${{ item.textContent }}' } }
]
虽然慢且不稳定,但作为最后手段仍可用。
CHANGELOG 显示活跃维护:
v1.7.3 (2026-04-15) - 2 天前
• 修复:小红书签名 URL (#996)
• 修复:douban ask 响应解析 (#933)
v1.7.0 (2026-04-11) - 大版本
• 87+ 适配器更新
• 自动修复协议
维护频率:大版本 2-3 个月,小修复 1-2 周,Issue 响应 1-3 天。
OpenCLI 不是为了替代人工,而是为了让 AI Agent 能自动化操作网站。
OpenCLI 提供 4 个 Skills,覆盖不同场景:
opencli-usage(基础使用)
↓ 命令不存在
opencli-oneshot(快速生成单个命令)
↓ 失败
opencli-explorer(完整探索式开发)
↓ 适配器失效
opencli-autofix(自动修复)
你可能好奇:Agent 是靠运行 opencli list 知道有哪些命令的吗?
答案:不是!主要靠 Skills 文档中的静态命令列表。
skills/opencli-usage/commands.md(829 行)包含所有命令的详细参考:
## Bilibili
```bash
opencli bilibili hot --limit 10 # B站热门视频
opencli bilibili search "rust" # 搜索视频 (query positional)
opencli bilibili me # 当前用户信息
Arguments:
--limit - Number of items (default: 20)-f, --format - Output format: json, yaml, csv, table
**优势**:
| 维度 | Skills 文档 | `opencli list` |
|------|------------|----------------|
| **加载速度** | 一次性(加载 Skill 时) | 每次运行(200-500ms) |
| **信息丰富度** | 包含示例、参数说明 | 只有命令名 |
| **离线能力** | 已在上下文中 | 需要执行 |
| **搜索能力** | 语义搜索(按能力、场景) | 精确匹配 |
### 自主决策边界
Agent **可以且应该**自动使用 `opencli generate`,但有明确规则:
** 自动执行**:
- 用户明确要求:"帮我生成 xxx.com 的 CLI"
- 适配器失效:自动修复(透明,用户无感知)
**️ 询问用户**:
- 间接需求:"给我 newsite.com 的数据"(该网站无适配器)
** 不自动执行**:
- 用户只是问问题:"OpenCLI 支持哪些网站?"
- 风险场景:银彳、支付等敏感网站
**设计原则**:
自动化(优先尝试)
---
## 实战案例:从网页到 CLI
让我们通过真实案例理解完整流程。
### 场景:用户想获取小红书搜索结果
**传统方案**:
```python
# 需要编写 100+ 行代码
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.xiaohongshu.com')
# 处理登录、反爬虫、懒加载...
# 3 小时后放弃
OpenCLI 方案:
# 方式 1:使用现成命令(已内置)
opencli xiaohongshu search --query "旅游" -f json
# 方式 2:如果没有,30 秒生成
opencli generate --goal "search"
当执行 opencli xiaohongshu search --query "旅游" 时:
1. 浏览器打开 xiaohongshu.com
2. 所有网络请求
3. 捕获到 15 个 JSON 请求:
/api/sns/web/v1/search/notes?keyword=旅游
/api/sns/web/v1/user/info (单条,过滤)
/fe_api/burdock/weixin/v2/shield (噪音,过滤)
...
4. 分析有价值请求:
URL: /api/sns/web/v1/search/notes
响应: { data: { items: [...] } }
字段: id, title, user.nickname, cover.url
5. 执行管线:
navigate → evaluate (fetch API) → map (字段映射) → limit
6. 返回结构化数据(JSON/CSV/YAML/Table)
关键点:
data.items[].title)| 维度 | 手动爬虫 | Puppeteer | 付费 API | OpenCLI |
|---|---|---|---|---|
| 开发成本 | 30-60 分钟/网站 | 20-40 分钟 | 注册+集成 | 30 秒(自动生成) |
| 运行成本 | 免费 | 免费 | $100+/月 | 免费 |
| 登录态 | 需手动管理 | 独立会话 | API Key | 复用浏览器 |
| 维护成本 | 高(页面改版就失效) | 高 | 低(官方维护) | 中(自动修复 + 社区) |
| 启动速度 | 快 | 慢(3-5 秒) | 快 | 快(0.5 秒) |
| 确定性 | 低 | 低 | 高 | 高(基于 API) |
| AI 友好 | ️ | (Skills 系统) |
适用场景:
推荐使用 OpenCLI:
不推荐使用 OpenCLI:
OpenCLI 的核心价值可以用三个关键词概括:
传统方案:
开发时间 30 分钟 × $50/小时 = $25
T@witter API: $100/月
年成本 = $1225
OpenCLI:
开发时间 30 秒
运行成本 $0
年成本 = $0
节省 100%
传统爬虫:
网站改版 → 代码失效 → 人工修复(2 小时)
发生频率:每季度 1 次
年维护成本:8 小时
OpenCLI:
API 变更 → 自动修复(80%)→ 人工介入(20%)
年维护成本:1.6 小时
节省 80% 时间
OpenCLI 从设计之初就是为 AI Agent 准备的:
随着 AI Agent 的普及,OpenCLI 这样的工具将不再是可选项,而是基础设施:
# 1. 安装
npm install -g @jackwener/opencli
# 2. 安装浏览器扩展
# 下载
# 在 chrome://extensions 加载解压后的文件夹
# 3. 验证
opencli doctor
# 4. 使用
opencli bilibili hot --limit 5
opencli twitter trending
opencli xiaohongshu search --query "AI"
# 5. 生成新命令
opencli generate --goal "hot posts"
OpenCLI 代表了 Web 自动化的新范式 —— 从"手动编写爬虫"到"自动生成 CLI",从"付费 API"到"零成本运行"。通过巧妙的架构设计和规则引擎,它在成本、性能和易用性之间找到了最佳平衡点。
更重要的是,作为 AI 原生工具,OpenCLI 正在成为连接 Web 和 AI Agent 的桥梁 —— 让任何网站都能成为 Agent 的工具箱。