OpenCLI:让任何网站成为你的命令行工具

OpenCLI:让任何网站成为你的命令行工具

GitHub : github.com/jackwener/o...


引言:Web 数据访问的困境

作为开发者,你可能经常遇到这样的场景:

  • 想快速获取 Bilibili 热门视频,但不想打开浏览器滚动页面
  • 需要在 CI/CD 中自动抓取 Twitter 数据,但 API 每月 $100 起步
  • 想让 AI 助手帮你搜索小红书,但它无法直接访问需要登录的网站

传统方案的痛点

方案 问题
手动爬虫 每个网站一套代码、反爬虫升级就失效、维护成本高
付费 API 昂贵、功能受限、小网站根本没有 API
Puppeteer 重量级、启动慢(3-5 秒)、无法复用登录态

OpenCLI 的核心洞察:既然你的浏览器已经登录了这些网站,为什么不直接复用它?

bash 复制代码
# 一条命令,结构化数据
opencli bilibili hot --limit 5 -f json

# 管道组合,Unix 哲学
opencli xiaohongshu search --query "AI" | jq '.[] | .title'

# 甚至支持桌面应用
opencli cursor chat "Fix the auth bug"

核心创新:不解析 HTML,而是拦截 JSON API

这是理解 OpenCLI 的关键 ------ 它避开了 HTML 解析的复杂性

传统爬虫的困境

css 复制代码
用户请求 → 加载 HTML → 解析 DOM → 提取数据
          (页面结构易变、反爬虫检测、维护困难)

问题在于:

  • HTML 结构随时会改(.title.title-text[data-title]
  • 需要等待 JS 渲染(何时完成?懒加载如何处理?)
  • 反爬虫容易检测(Puppeteer、Selenium 的特征)

OpenCLI 的巧妙设计

css 复制代码
用户请求 → 监听网络流量 → 拦截 JSON API → 提取数据
          (API 结构稳定、版本化、无需解析 HTML)

实际案例:获取 Bilibili 热门视频

传统方式(HTML 解析):

javascript 复制代码
// ❌ 容易失败
await page.goto('https://www.bilibili.com/ranking');
const titles = await page.$$eval('.video-title', els =>
  els.map(e => e.textContent)
);
// 问题:CSS 选择器可能随时改变

OpenCLI 方式(JSON 拦截):

javascript 复制代码
// ✅ 稳定可靠
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 路径稳定(很少变更)

为什么 JSON 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、安全风险

OpenCLI 的三层架构

scss 复制代码
┌──────────────────────────────────────┐
│  CLI 进程 (Node.js)                  │
│  opencli bilibili hot                │
└────────────┬─────────────────────────┘
             │ HTTP POST
             ↓
┌──────────────────────────────────────┐
│  本地守护进程 (localhost:19825)      │
│  • 自动启动                          │
│  • 安全验证(Origin + 自定义头)     │
└────────────┬─────────────────────────┘
             │ WebSocket
             ↓
┌──────────────────────────────────────┐
│  Chrome 扩展后台脚本                 │
│  • 监听命令                          │
│  • 调用 DevTools Protocol            │
└────────────┬─────────────────────────┘
             │ CDP
             ↓
┌──────────────────────────────────────┐
│  Chrome 页面实例                     │
│  • 执行 JavaScript                   │
│  • 复用 Cookie(已登录)             │
└──────────────────────────────────────┘

关键创新:工作区隔离

想象你同时运行多个任务:

bash 复制代码
opencli xiaohongshu search "旅游" &  # 后台任务 1
opencli bilibili hot &               # 后台任务 2
opencli zhihu hot                    # 前台任务

传统方案需要启动 3 个浏览器实例(~600MB 内存、3×3 秒启动时间)。

OpenCLI 的方案:单个浏览器,多个独立标签页

css 复制代码
┌────────────────────────┐
│  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 根据网站的认证复杂度,自动选择最合适的策略:

yaml 复制代码
Tier 1: PUBLIC(无需认证)
  → 示例:HackerNews、arXiv
  → 方式:直接 HTTP 请求
  → Token:无

Tier 2: COOKIE(复用浏览器 Cookie)
  → 示例:Bilibili、小红书、Twitter
  → 方式:页面内 fetch() 自动携带 Cookie
  → Token:浏览器管理,OpenCLI 不存储

Tier 2.5: LOCALSTORAGE(从浏览器提取 Bearer Token)
  → 示例:Notion、Linear、现代 SaaS
  → 方式:从 localStorage 读取 access_token
  → Token:临时提取,不持久化

Tier 3: HEADER(提取 CSRF Token)
  → 示例:Twitter(需要 x-csrf-token)
  → 方式:从 meta 标签或 localStorage 提取
  → Token:每次请求时动态获取

Tier 4: INTERCEPT(拦截并注入头)
  → 示例:企业微信、加密 API
  → 方式:劫持 fetch/XHR,自动注入认证头
  → Token:由网站自己的 JS 生成

Tier 5: UI(最后手段)
  → 示例:强反爬虫网站
  → 方式:直接操作 UI,不涉及 API
  → Token:无(纯 UI 自动化)

实际案例演示

案例 1:Bilibili(COOKIE 策略)
javascript 复制代码
// 用户已在 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
// 完全由浏览器管理
案例 2:Notion(LOCALSTORAGE 策略)
javascript 复制代码
// 现代 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 存储
// 只在执行时临时读取
案例 3:Twitter(HEADER 策略)
javascript 复制代码
// Twitter 需要 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 完全相同。


自动适配器生成:30 秒完成

OpenCLI 最强大的功能:让 AI 自动将网站转化为 CLI

完整流程演示

bash 复制代码
$ opencli generate https://www.douban.com --goal "hot movies"

背后发生了什么

scss 复制代码
[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
────────────────────────────────

关键技术:规则引擎而非 LLM

你可能会问:这是用 GPT 生成的吗?

答案:不是 !OpenCLI 使用 100% 规则引擎,零 LLM 调用。

字段角色检测(模式匹配):

typescript 复制代码
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 规则):

typescript 复制代码
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 变更应对:多层防御

你可能担心:外部 API 会变更,适配器岂不是会失效?

OpenCLI 设计了 5 层防御机制

第 1 层:自动修复(v1.7.0 新特性)

bash 复制代码
$ opencli bilibili hot

[第一次尝试]
  → 提取路径: data.list
  ✗ 返回: null (API 改为 data.result.items)

[自动修复]
  → 重新探测 API 响应
  → 发现新路径: data.result.items
  → 更新适配器

[第二次尝试]
  ✓ 成功!

成功率:80% 的 API 变更可自动修复(主要是路径变化)。

第 2 层:结构化诊断

自动修复失败时,生成详细诊断报告:

bash 复制代码
$ OPENCLI_DIAGNOSTIC=1 opencli xiaohongshu search --query "旅游" 2> diag.json

诊断报告包含:

  • 错误详情(代码、消息、堆栈)
  • 适配器源码(含行号)
  • 浏览器状态(DOM 快照、网络请求、控制台错误)

AI Agent 可基于诊断报告自动修复,或人工快速定位问题。

第 3 层:重新生成

最简单粗暴的方法:

bash 复制代码
rm ~/.opencli/clis/xiaohongshu/search.js
opencli generate https://www.xiaohongshu.com --goal "search"

完全基于最新 API,自动适应结构变化。

第 4 层:降级到 UI 自动化

当 API 完全加密或失效:

javascript 复制代码
// 从 API 方式降级到 UI 方式
pipeline: [
  { navigate: 'https://www.bilibili.com/ranking' },
  { wait: 2000 },
  { select: '.rank-item .title' },  // CSS 选择器
  { map: { title: '${{ item.textContent }}' } }
]

虽然慢且不稳定,但作为最后手段仍可用。

第 5 层:社区维护

CHANGELOG 显示活跃维护:

scss 复制代码
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 天。


AI Agent 集成:Skills 系统

OpenCLI 不是为了替代人工,而是为了让 AI Agent 能自动化操作网站

Skills 设计哲学

OpenCLI 提供 4 个 Skills,覆盖不同场景:

markdown 复制代码
opencli-usage(基础使用)
    ↓ 命令不存在
opencli-oneshot(快速生成单个命令)
    ↓ 失败
opencli-explorer(完整探索式开发)
    ↓ 适配器失效
opencli-autofix(自动修复)

Agent 的命令发现机制

你可能好奇 :Agent 是靠运行 opencli list 知道有哪些命令的吗?

答案:不是 !主要靠 Skills 文档中的静态命令列表

skills/opencli-usage/commands.md(829 行)包含所有命令的详细参考:

markdown 复制代码
## 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
markdown 复制代码
**优势**:

| 维度 | Skills 文档 | `opencli list` |
|------|------------|----------------|
| **加载速度** | 一次性(加载 Skill 时) | 每次运行(200-500ms) |
| **信息丰富度** | 包含示例、参数说明 | 只有命令名 |
| **离线能力** | ✅ 已在上下文中 | ❌ 需要执行 |
| **搜索能力** | ✅ 语义搜索(按能力、场景) | ❌ 精确匹配 |

### 自主决策边界

Agent **可以且应该**自动使用 `opencli generate`,但有明确规则:

**✅ 自动执行**:
- 用户明确要求:"帮我生成 xxx.com 的 CLI"
- 适配器失效:自动修复(透明,用户无感知)

**⚠️ 询问用户**:
- 间接需求:"给我 newsite.com 的数据"(该网站无适配器)

**❌ 不自动执行**:
- 用户只是问问题:"OpenCLI 支持哪些网站?"
- 风险场景:银行、支付等敏感网站

**设计原则**:

自动化(优先尝试)

  • 人机协作(必要时询问)
  • 透明修复(用户无感知)
  • 明确边界(不越权)
yaml 复制代码
---

## 实战案例:从网页到 CLI

让我们通过真实案例理解完整流程。

### 场景:用户想获取小红书搜索结果

**传统方案**:
```python
# 需要编写 100+ 行代码
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.xiaohongshu.com')
# 处理登录、反爬虫、懒加载...
# 3 小时后放弃

OpenCLI 方案

bash 复制代码
# 方式 1:使用现成命令(已内置)
opencli xiaohongshu search --query "旅游" -f json

# 方式 2:如果没有,30 秒生成
opencli generate https://www.xiaohongshu.com --goal "search"

拦截过程解析

当执行 opencli xiaohongshu search --query "旅游" 时:

bash 复制代码
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)

关键点

  • 不需要解析 HTML
  • 直接拿 JSON 数据
  • 字段路径明确(data.items[].title
  • 复用登录态(Cookie 自动携带)

对比分析:OpenCLI vs 传统方案

维度 手动爬虫 Puppeteer 付费 API OpenCLI
开发成本 30-60 分钟/网站 20-40 分钟 注册+集成 30 秒(自动生成)
运行成本 免费 免费 $100+/月 免费
登录态 需手动管理 独立会话 API Key 复用浏览器
维护成本 高(页面改版就失效) 低(官方维护) 中(自动修复 + 社区)
启动速度 慢(3-5 秒) 快(0.5 秒)
确定性 高(基于 API)
AI 友好 ⚠️ ✅(Skills 系统)

适用场景

推荐使用 OpenCLI

  • ✅ 需要快速访问多个网站数据
  • ✅ CI/CD 中的自动化采集
  • ✅ AI Agent 集成网站能力
  • ✅ 需要统一的 CLI 接口

不推荐使用 OpenCLI

  • ❌ 需要极高性能(毫秒级响应)
  • ❌ 深度定制反爬虫逻辑
  • ❌ 纯静态网站(无 JSON API)

总结与展望

OpenCLI 的核心价值可以用三个关键词概括:

1. 零成本

bash 复制代码
传统方案:
  开发时间 30 分钟 × $50/小时 = $25
  Twitter API: $100/月
  年成本 = $1225

OpenCLI:
  开发时间 30 秒
  运行成本 $0
  年成本 = $0

节省 100% 💰

2. 零维护

erlang 复制代码
传统爬虫:
  网站改版 → 代码失效 → 人工修复(2 小时)
  发生频率:每季度 1 次
  年维护成本:8 小时

OpenCLI:
  API 变更 → 自动修复(80%)→ 人工介入(20%)
  年维护成本:1.6 小时

节省 80% 时间 ⚡

3. AI 原生

OpenCLI 从设计之初就是为 AI Agent 准备的:

  • 确定性输出:JSON/YAML/CSV,AI 直接解析
  • 统一接口:87+ 网站,同一套命令规范
  • Skills 系统:Agent 可自动发现、使用、生成命令
  • 自动修复:适配器失效时 AI 自动诊断修复

未来方向

随着 AI Agent 的普及,OpenCLI 这样的工具将不再是可选项,而是基础设施:

  1. 适配器生态:社区贡献的适配器市场
  2. 自动回归测试:每日验证所有适配器可用性
  3. 跨平台支持:Firefox、Safari、云端浏览器
  4. 可视化调试器:图形化管线编辑和实时预览

快速开始

bash 复制代码
# 1. 安装
npm install -g @jackwener/opencli

# 2. 安装浏览器扩展
# 下载 https://github.com/jackwener/opencli/releases
# 在 chrome://extensions 加载解压后的文件夹

# 3. 验证
opencli doctor

# 4. 使用
opencli bilibili hot --limit 5
opencli twitter trending
opencli xiaohongshu search --query "AI"

# 5. 生成新命令
opencli generate https://yoursite.com --goal "hot posts"

OpenCLI 代表了 Web 自动化的新范式 ------ 从"手动编写爬虫"到"自动生成 CLI",从"付费 API"到"零成本运行"。通过巧妙的架构设计和规则引擎,它在成本、性能和易用性之间找到了最佳平衡点。

更重要的是,作为 AI 原生工具,OpenCLI 正在成为连接 Web 和 AI Agent 的桥梁 ------ 让任何网站都能成为 Agent 的工具箱。

相关推荐
峥嵘life2 小时前
Android + Kiro AI软件开发实战教程
android·后端·学习
日光明媚2 小时前
SoulX-FlashTalk 技术报告解读:从“严格因果”到“双向流式蒸馏”,实时数字人为什么能做到 0.87s 延迟、32FPS 和长时稳定?
人工智能·python·深度学习·ai作画·aigc·音视频
石榴树下的七彩鱼3 小时前
Python OCR 文字识别 API 接入完整教程
开发语言·人工智能·后端·python·ocr·api·图片识别
机器之心3 小时前
从「片段生成」到「长视频漫游」:OmniRoam探索轨迹可控的长视频生成新范式
人工智能·openai
Memory_荒年3 小时前
别让用户“剁手”把你搞破产:接口幂等性与防重的终极防线
后端
掘金者阿豪3 小时前
程序员必踩的一个坑:Codex 报错 Missing environment variable `OPENAI_API_KEY`,完整解决指南(附架构图)
后端
神奇小汤圆3 小时前
从分析 Claude Code 源码到自己写一个:AnyCoder,支持 DeepSeek/Qwen 等任意大模型的开源 AI 编程 Agent
后端
fanstuck3 小时前
当 openClaw 遇上 EdgeOne Pages:不只智能问数,更能直接获取BI 数据大屏(附工程落地实战)
人工智能·ai·aigc·openclaw
悟空码字3 小时前
别再重复造轮子了!SpringBoot对接第三方系统模板,拿来即用
java·spring boot·后端