OpenCLI:从GUI到API的浏览器自动化新思路

OpenCLI主张绕开UI点击,直接抓取并复现网页API,把浏览器操作转成更稳定的CLI。

原文标题:浏览器自动化:从GUI到OpenCLI

原文作者:阿里云开发者

冷月清谈:

文章围绕“浏览器自动化为什么总是不稳定”展开,提出一种更偏底层的替代思路:与其依赖点击页面元素,不如通过浏览器抓包定位真实调用的 API,再把这些请求复现为可执行的 CLI 命令。

核心观点有三点:1)传统前端 UI 自动化容易受页面结构、按钮位置、加载时机影响,维护成本高;2)网页展示的数据本质上多来自接口,请求一旦被识别和复现,自动化会更稳定、更高效;3)Agent 做浏览器探索时不能只看静态页面,必须真实打开网页、触发交互、观察懒加载请求,才能发现评论、字幕、关注列表等深层接口。

文章介绍了 OpenCLI 的基本能力,包括命令发现、公共 API 调用、浏览器相关命令,以及 YAML 和 TypeScript 两种适配器形式。它还设计了五级认证策略,从公开接口、Cookie、Header,到状态管理拦截和最终不得已的 UI 自动化,形成一套逐级降级的执行路径。

在自动生成 CLI 方面,OpenCLI 支持 explore、synthesize、generate、record 等流程,用于探索网页、合成适配器、验证命令与录制操作。文章也坦承目前录制能力对写操作支持不足,尤其是无法完整提取 POST/PUT 的请求体,因此更适合只读类场景。

作者最后把话题提升到软件形态演进:未来软件竞争的不只是界面体验,还包括是否足够“可调用”,能否被 Agent 稳定理解、接入和验证。

怜星夜思:

1、问题1:如果 API 抓取和复现比点页面稳定得多,那为什么很多团队现在还在坚持做 UI 自动化?
2、问题2:文章强调“未来软件竞争可调用性”,你觉得这会不会真的成为 SaaS 或内部系统的重要评估指标?
3、问题3:OpenCLI 这种“抓网页真实接口生成命令”的方式,在哪些场景最有价值,哪些场景又可能踩坑?
4、问题4:五级认证策略里把 UI 自动化放在最后手段,你认同这种优先级吗?有没有例外?

原文内容

阿里妹导读


文章讲述放弃不稳定的前端UI自动化操作,采用解析并复现底层API请求的方式,来解决浏览器自动化的效率与稳定性难题。(文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。)

为什么我们需要浏览器自动化

如今大量业务系统都跑在浏览器里——运营配置后台、工单处理系统、发布运维平台。如果能让这些系统自动运转,对提效和智能化运营的价值不言而喻。

但现实是,Agent 想操控浏览器,路并不好走。

现有方案的困境

OpenCLI 的思路

核心想法很简单:不跟网页界面较劲,直接抓它背后的 API。

浏览器里看到的数据,本质上都是前端从某个接口拿回来的。把这个接口找出来、把请求复现出来,比点按钮靠谱得多。

快速上手

npm install -g @jackwener/opencli

直接使用:

opencli list                              
# 查看所有命令
opencli list -f yaml                      
# 以 YAML 列出所有命令
opencli hackernews top --limit 
5
# 公共 API,无需浏览器
opencli bilibili hot --limit 
5
# 浏览器命令
opencli zhihu hot -f json                 
# JSON 输出
opencli zhihu hot -f yaml                 
# YAML 输出

原理分析

AI Agent 探索工作流

步骤

工具

做什么

0. 打开浏览器

browser_navigate

导航到目标页面

1. 观察页面

browser_snapshot

观察可交互元素(按钮/标签/链接)

2. 首次抓包

browser_network_requests

筛选 JSON API 端点,记录 URL pattern

3. 模拟交互

browser_click + browser_wait_for

点击"字幕""评论""关注"等按钮

4. 二次抓包

browser_network_requests

对比步骤 2,找出新触发的 API

5. 验证 API

browser_evaluate

fetch(url, {credentials:'include'}) 测试返回结构

6. 写代码

基于确认的 API 写适配器

懒加载机制
> [!CAUTION]
> **你(AI Agent)必须通过浏览器打开目标网站去探索!**  
> 不要只靠 `opencli explore` 命令或静态分析来发现 API。  
> 你拥有浏览器工具,必须主动用它们浏览网页、观察网络请求、模拟用户交互。

为什么?

很多 API 是懒加载的(用户必须点击某个按钮/标签才会触发网络请求)。字幕、评论、关注列表等深层数据不会在页面首次加载时出现在 Network 面板中。如果你不主动去浏览和交互页面,你永远发现不了这些 API。

五级认证策略

OpenCLI 提供 5 级认证策略。使用 cascade 命令自动探测:

opencli cascade https://api.example.com/hot

策略决策树:

直接 fetch(url) 能拿到数据?
  → ✅ Tier 1: public(公开 API,不需要浏览器)
  → ❌ fetch(url, {credentials:'include'}) 带 Cookie 能拿到?
       → ✅ Tier 2: cookie(最常见,evaluate 步骤内 fetch)
       → ❌ → 加上 Bearer / CSRF header 后能拿到?
              → ✅ Tier 3: header(如 Twitter ct0 + Bearer)
              → ❌ → 网站有 Pinia/Vuex Store?
                     → ✅ Tier 4: intercept(Store Action + XHR 拦截)
                     → ❌ Tier 5: ui(UI 自动化,最后手段)
适配器
你的 pipeline 里有 evaluate 步骤(内嵌 JS 代码)?
  → ✅ 用 TypeScript (src/clis/<site>/<name>.ts),保存即自动动态注册
  → ❌ 纯声明式(navigate + tap + map + limit)?
       → ✅ 用 YAML (src/clis/<site>/<name>.yaml),保存即自动注册
外部CLI集成

也支持现有CLI直接集成到OpenCLI

CLI执行流程

下图展示从启动到执行的关键路径:入口加载命令清单,构建注册表;执行阶段根据策略与浏览器需求选择适配器或管道步骤,完成数据采集与输出。

自动生成CLI

AI 原生生成CLI流程

1.探索与分析:explore 深度抓取页面、自动滚动、拦截网络请求、识别框架与状态管理、推断能力与推荐参数。

2.策略选择:根据鉴权头/签名等特征自动选择策略(public/cookie/header/intercept/store-action)。

3.适配器合成:synthesize 基于探索产物生成候选 YAML,自动模板化 URL、字段映射与参数默认值。

4.测试与验证:generate 串联探索→合成→注册→验证,支持目标化选择与回退策略。

Record操作录制
opencli record 采用“浏览器录制 - 智能回放”模式:启动浏览器后,捕获用户在目标 URL 上的交互行为及产生的网络请求。系统通过对请求序列进行评分排序与语义分析,自动生成可复用的 CLI 命令。
执行流程如下图所示:
当前局限性:
  • 请求体(Payload)缺失:目前的录制引擎仅捕获请求元数据(url, method, body: responseBody),未能完整提取 POST/PUT 等写操作中的 Request Body。
  • 生成能力受限:由于缺乏关键参数载荷,自动化脚本生成逻辑目前仅能覆盖只读类接口(如列表查询、详情获取并输出 YAML),无法有效支撑写操作类接口(如创建、更新、删除)的命令生成,导致自动化闭环在“写入场景”中断。
QoderWork自动生成CLI

为了方便自动生成CLI命令,我整理了如下的Skill,其中CLI-ONESHOT.md和CLI-EXPLORER.md可在开源项目中自行下载。

SKILL.md

---
name: opencli
description: "Generate CLI adapter files (YAML/TypeScript) for the opencli framework. Use when the user wants to create CLI commands, build adapters for websites or APIs, or interact with the opencli tool. Covers browser-based API discovery, authentication strategy selection, and adapter generation workflows."
---

OpenCLI Adapter Generator

Overview

OpenCLI is a CLI framework that wraps website APIs into local command-line tools. This skill guides the agent through discovering APIs via browser exploration, selecting authentication strategies, and generating adapter files (YAML or TypeScript) placed in ~/.opencli/clis/{site}/{command}.yaml|.ts.

Workflow Modes

Quick mode (single command): Follow CLI-ONESHOT.md — just a URL + description, 4 steps.

Full mode (complex adapters): Read CLI-EXPLORER.md before writing any code. It covers: browser exploration workflow, auth strategy decision tree, platform SDKs (e.g. Bilibili apiGet/fetchJson), YAML vs TS selection, tap step debugging, cascading request patterns, and common pitfalls.

Output Specification

All adapter files must be written to ~/.opencli/clis/{site}/{command}.yaml or .ts. No other output locations or file formats (.js.json.md.txt) are permitted.

Correct examples:
~/.opencli/clis/aem/page-views.ts
~/.opencli/clis/twitter/lists.yaml
~/.opencli/clis/bilibili/favorites.ts

Supported Formats

Format Extension When to use
YAML  .yaml  Simple scenarios (Cookie/Public auth, straightforward flows)
TypeScript  .ts  Complex scenarios (Intercept capture, Header auth, multi-step logic)

Standard Workflow

1. Create directorymkdir -p ~/.opencli/clis/{site}
2. Generate adapter file at the correct path (YAML or TS)
3. Verifyopencli list | grep {site} then opencli {site} {command} {option}

Naming Conventions

Element Rule Good Bad
site Lowercase, hyphens allowed  aemmy-site   AEMmy_site 
command Lowercase, hyphen-separated  page-viewsproject-info   pageViewsproject_info 

Pre-Generation Checklist

Output path is ~/.opencli/clis/{site}/{command}.yaml or .ts
Site name is lowercase (no uppercase, no underscores)
Command name uses hyphens (no spaces, no underscores)
File extension is .yaml or .ts only
Directory ~/.opencli/clis/{site}/ has been created

使用case:

内部会画平台CLI化

BOSS招聘自动化案例展示

1.帮我和候选人沟通

2.统计招聘数据

未来软件竞争维度:从界面到可调用性

未来的软件,不会只服务人,也会服务 Agent。

以前我们评价一个 SaaS,看的是界面顺不顺、按钮好不好点。但 Agent 不会欣赏你的按钮做得多圆。它只在乎一件事:能不能稳定调用你。

GUI 是给人用的。API 是能力底座。而 Agent 最喜欢的,其实是更清晰的执行面:命令、参数、返回值、失败原因。

未来软件可能会多一个新竞争维度:不是谁页面更好看。而是谁更容易被 Agent 理解、调用、验证,再接进工作流。唯有如此,才更有机会成为下一代工作流里的基础节点。

过去的软件竞争界面,未来的软件竞争可调用性。

从安全角度考虑,GUI自动化模拟的是用户的真实操作,权限控制相对完善。而直接操作API,如果API设计不当,可能会存在越权风险。比如,通过修改API请求参数,访问到不应该访问的数据。所以,API自动化的安全性也是一个需要重点关注的问题。

楼上正解!Tier 2确实很常见。对于验证码,除了打码平台,还可以考虑使用一些OCR技术,识别验证码图片。另外,有些网站可能会提供开发者API,允许通过API绕过验证码。总之,要根据具体情况选择合适的解决方案。实在不行,只能人工介入了。

问题:OpenCLI通过抓包API实现自动化,但如果目标网站采用了反爬虫技术,例如参数加密、IP限制等,OpenCLI该如何应对?

遇到反爬虫,是个持久战啊!参数加密就得分析加密算法,看看能不能逆向或者模拟,OpenCLI可能需要集成一些JS引擎或者提供自定义JS代码执行的能力。IP限制的话,就得上代理IP,搞IP池,OpenCLI可以考虑支持代理IP配置,甚至集成一些付费的代理IP服务。

更高级的反爬虫,比如验证码、行为验证,那就比较麻烦了,可能需要接入验证码识别服务,或者模拟用户的真实行为,比如鼠标移动轨迹、键盘输入等等,这些都属于UI自动化的范畴了,但可以和API结合起来,先用API获取数据,再用UI自动化模拟用户交互。

总而言之,反爬虫和反反爬虫是个永无止境的对抗,需要不断学习新的技术。

这是一个很实际的问题!我的理解是,任何自动化方案都有维护成本。GUI自动化依赖页面元素,页面改版就得重写脚本。API自动化依赖接口,接口变动也需要调整。OpenCLI的优势在于,API相对GUI更稳定,而且OpenCLI提供了一些自动生成和适配工具,可以降低维护成本。当然,如果API变动过于频繁,那确实是个挑战。我们需要在稳定性、效率和维护成本之间做权衡。

除了等待OpenCLI的Record功能完善,还可以考虑以下方案:

1. 分析已有API: 有些网站会提供专门的API用于数据创建、更新和删除。可以尝试找到这些API,并使用OpenCLI调用。
2. 模拟表单提交: 如果网站没有提供API,可以分析表单提交的过程,手动构造请求,模拟表单提交。
3. 结合其他工具: 可以将OpenCLI与其他自动化工具结合使用,例如使用Selenium进行UI交互,然后使用OpenCLI调用API。

OpenCLI的五级认证策略确实看起来有点复杂,但实际上可以简化理解。最简单的思路是,先尝试Tier 1 (public),不行就Tier 2 (cookie),再不行就Tier 3 (header),以此类推。opencli cascade 命令实际上就是在帮你自动做这个尝试。如果实在搞不定,可以抓包分析,看看浏览器请求头里带了哪些信息,然后手动添加到OpenCLI的配置里。

我理解的五级认证策略,本质上是在模拟浏览器的行为。浏览器能访问的,OpenCLI原则上也能访问。所以,可以先用浏览器正常访问目标网站,看看需要哪些认证信息 (Cookie, Header 等)。然后,将这些信息配置到OpenCLI里。另外,OpenCLI的文档里应该有更详细的认证策略说明,可以参考一下。

除了文章提到的,我还想到一些:
* API Key: 某些API会要求在请求头或者URL参数中携带API Key。适用于开放API,方便追踪和限制用量。
* 双因素认证(2FA): 需要用户通过手机验证码等方式进行二次验证。安全性较高,常用于涉及敏感数据的场景。
* mTLS (Mutual TLS): 客户端和服务端都需要提供证书进行身份验证。安全性最高,但配置也最复杂,通常用于企业内部或者安全性要求极高的API。
具体选择哪种,还得看实际的应用场景和安全需求。

确实,Tier 4 拦截 Store Action 相对复杂,需要深入了解前端状态管理框架的内部机制。不过,可以考虑一些更简单的方法:

1. Hook API 请求: 很多 Store Action 最终会触发 API 请求。我们可以直接 Hook 这些 API 请求,修改请求参数或响应数据,从而达到控制应用行为的目的。
2. 修改 Store 状态: 直接修改 Store 中的状态数据,从而影响应用的渲染结果。这种方法需要了解 Store 的数据结构,但通常比拦截 Action 更简单。
3. 模拟用户行为: 如果以上方法都不可行,可以退而求其次,使用 UI 自动化工具模拟用户行为,触发相应的 Store Action。虽然效率较低,但胜在简单易行。

需要注意的是,以上方法都可能受到前端代码的限制,需要根据具体情况选择合适的方案。

除了技术层面的改进,提升软件的可调用性还需要考虑以下几个非技术因素:

1. 商业模式: 考虑是否提供免费的 API 接口,或者采用按量付费的模式,吸引更多的开发者使用。
2. 社区支持: 建立开发者社区,提供技术支持和交流平台,帮助开发者解决问题。
3. 推广: 积极推广 API 接口,吸引更多的开发者关注和使用。

只有将技术和商业结合起来,才能真正提升软件的可调用性,扩大用户群体。

写入场景最大的挑战是状态管理。读取数据是无状态的,但写入数据会改变服务器 Zustand。需要考虑如何处理并发写入、数据一致性等问题。可以采用一些常见的并发控制策略,例如悲观锁、乐观锁等。另外,可以考虑使用事件溯源模式,将所有的写入操作都记录下来,方便回溯和恢复。

我觉得API变动是无法避免的,关键在于如何快速响应。除了监控告警,还可以考虑采用一些更健壮的适配器设计模式,例如使用策略模式或者适配器模式,将API的差异性封装起来,减少对核心逻辑的影响。另外,可以考虑与目标网站的开发者建立联系,提前获取API变更信息,做到防患于未然。不过,这可能需要一定的商务合作。

我的经验是,看网站的登录方式。如果网站使用传统的用户名密码登录,并且通过cookie来维持会话,那大概率是cookie认证。如果网站使用OAuth 2.0之类的授权方式,那很可能是header认证。对于一些内部系统,可能需要抓包分析一下请求头,看看有没有特殊的认证字段。总之,具体问题具体分析,不要死记硬背策略决策树。

写入操作的核心是安全性。除了数据校验和权限控制,还需要考虑CSRF攻击、XSS攻击等安全问题。可以采用一些常见的安全措施,例如使用CSRF token、对用户输入进行转义等。另外,需要定期进行安全审计,及时发现和修复安全漏洞。

这个问题问到了点子上!API的频繁变动确实是维护成本的大头。个人觉得可以考虑以下几个策略:1. 建立完善的监控机制,一旦API返回结构发生变化,立即告警。2. 尽量使用声明式的YAML配置,减少代码侵入,方便快速修改。3. 拥抱AI,利用AI自动分析API变更,并给出适配建议,就像文章里提到的QoderWork那样。4. 建立一个可维护的适配器版本控制系统,方便回滚。

别想那么复杂,直接抓包!打开浏览器的开发者工具,看看请求头里有什么东西,cookie、Authorization、X-CSRF-TOKEN… 一目了然。然后根据这些信息,选择对应的认证策略。如果实在搞不定,就用最简单的UI自动化,虽然效率低,但至少能跑起来。记住,先解决问题,再优化方案。

我觉得除了完善请求体捕获,还需要考虑以下几个方面:1. 数据校验:对于写入操作,必须对用户输入的数据进行校验,防止恶意注入。2. 错误处理:写入操作更容易出错,需要提供更完善的错误处理机制,例如重试、回滚等。3. 权限控制:不同的用户可能具有不同的写入权限,需要进行更精细的权限控制。4. 幂等性:对于某些写入操作,需要保证幂等性,即多次执行的结果与一次执行的结果相同。

【回复问题1】我觉得主要不是大家不知道 API 方案更稳,而是现实里“门槛转换”没那么低。很多测试团队原本就是按页面流程搭起来的,用例、人员技能、平台建设都围绕 Selenium、Playwright 这些展开,切到 API 复现其实是另一套方法论,短期看未必省事。