unbrowse-ai/unbrowse

GitHub: unbrowse-ai/unbrowse

将网站流量自动逆向为可复用 API 技能,让 AI Agent 直接调用底层接口而非模拟浏览器操作。

Stars: 460 | Forks: 34

# Unbrowse 本包用于安装 `unbrowse` CLI。 将任意网站转换为可供 Agent 使用的可复用 API 接口。Unbrowse 捕获网络流量,逆向工程隐藏在 UI 之下的真实端点,并将所学内容存储在共享市场中,以便下一个 Agent 立即复用。 一个 Agent 学习一次。后续所有 Agent 即可走快速通道。 ## 快速开始 ``` # 最快完整设置 npx unbrowse setup ``` `npx unbrowse setup` 会按需下载 CLI,安装浏览器资源,在检测到 Open Code 时注册 Open Code `/unbrowse` 命令,并启动本地服务器。 日常使用: ``` npm install -g unbrowse unbrowse setup ``` 如果你的 Agent 主机使用 skills: ``` npx skills add unbrowse-ai/unbrowse ``` 默认情况下,每个 CLI 命令都会在 `http://localhost:6969` 上自动启动本地服务器。可以通过 `UNBROWSE_URL`、`PORT` 或 `HOST` 进行覆盖。首次启动时,它会自动作为 Agent 注册到市场,并将凭证缓存在 `~/.unbrowse/config.json` 中。 兼容 Claude Code、Open Code、Cursor、Codex、Windsurf 以及任何可以调用本地 CLI 或 skill 的 Agent 主机。 ## setup 做了什么 - 检查 npm/npx 流程的本地前置条件。 - 安装实时捕获所需的浏览器资源。 - 当存在 Open Code 时,注册 Open Code `/unbrowse` 命令。 - 除非传递了 `--no-start`,否则启动本地 Unbrowse 服务器。 ## 常用命令 ``` unbrowse health unbrowse resolve --intent "get trending searches" --url "https://google.com" --pretty unbrowse login --url "https://calendar.google.com" unbrowse skills unbrowse search --intent "get stock prices" ``` ## 演示说明 - 在网站上首次捕获/索引可能需要 20-80 秒。这是慢速路径;重复操作应该会快得多。 - 对于网站任务,让 Agent 保持在 Unbrowse 上,而不是让它 drifting 到通用网页搜索或临时的 `curl`。 - 由于反机器人保护,Reddit 仍然比大多数网站更难处理。如果可用,优先使用规范的 `.json` 路由。 ## 工作原理 当 Agent 请求某项内容时,Unbrowse 首先在市场中搜索现有的 skill。如果存在置信度足够高的 skill,则立即执行。如果不存在,Unbrowse 会捕获该网站,学习其背后的 API,发布可复用的 skill,然后执行该 skill。 每个学习到的 skill 都可以被未来的每个 Agent 发现。可靠性评分、反馈、schema 漂移和验证机制让好的路径保持热度,并将损坏的路径排除在外。 ### 意图解析管道 当你调用 `POST /v1/intent/resolve` 时,编排器遵循此优先级链: 1. **路由缓存**(5 分钟 TTL)——如果最近解析过相同的意图,则立即命中 2. **市场搜索**——语义向量搜索,按综合得分排名:40% embedding 相似度 + 30% 可靠性 + 15% 新鲜度 + 15% 验证状态 3. **实时捕获**——headless 浏览器记录网络流量,逆向工程 API 端点,发布新的 skill 4. **DOM 回退**——如果未找到 API 端点(静态/SSR 站点),则从渲染的 HTML 中提取结构化数据 通过实时捕获发布的 skill 可供网络上的所有 Agent 使用。 ## 市场飞轮 每个新用户都会让平台对下一个用户更有价值——就像 Waze 一样,只不过是为网络的 API 服务。 ``` More Users → More Skills → More Domains → More Value ↑ | └──────────────────────────────────────────┘ ``` Skills 存储在 `beta-api.unbrowse.ai` 的共享市场中。首次启动时,服务器会自动注册为 Agent 并将凭证缓存在 `~/.unbrowse/config.json` 中。任何 Agent 发布的 skill 都可以通过语义搜索被所有 Agent 发现。 ### Skill 生命周期 - **active** —— 已发布、可查询、可执行 - **deprecated** —— 可靠性低(连续失败后自动触发) - **disabled** —— 端点关闭(验证失败) 后台验证循环每 6 小时运行一次,执行安全(GET)端点以检测故障和 schema 漂移。连续失败 3 次以上的 skill 会自动弃用。 ## 门控站点的身份验证 对于大多数站点,身份验证是自动的。如果你在 Chrome 或 Firefox 中登录了某个站点,Unbrowse 会直接从浏览器的 SQLite 数据库中读取你的 cookie——无需额外步骤。Cookie 在每次调用时都会重新解析,因此会话保持最新。 | 策略 | 工作原理 | 使用场景 | | ------------------- | -------------------------------------------------- | ---------------------------------------------------- | | Auto cookie resolve | 自动从 Chrome/Firefox 读取 cookie DB | 默认——如果你通过浏览器登录,则有效 | | Yolo mode | 使用你的真实配置文件打开 Chrome | 具有复杂身份验证的站点(OAuth 弹窗、2FA) | | Interactive login | 打开有头浏览器进行手动登录 | 自动解析没有 cookie 时的回退方案 | 身份验证头(CSRF token、API key、authorization header)在浏览过程中被捕获并存储在加密的 vault(`~/.unbrowse/vault/`)中。服务器端 fetch 会自动重放这些 header——无需启动浏览器。跨域身份验证(例如 lu.ma 的 cookie 在 api2.luma.com 上有效)被透明处理。过期的凭证(401/403 响应)会被自动删除。 ## 变更安全性 非 GET 端点(POST、PUT、DELETE)需要明确确认: - `dry_run: true` —— 预览将要执行的内容,无副作用 - `confirm_unsafe: true` —— 明确用户同意继续 GET 端点自动执行。变更操作在未选择加入的情况下绝不会触发。 ## API 参考 查看 [SKILL.md](./SKILL.md) 获取完整的 API 参考,包括所有端点、搜索、反馈、身份验证和问题报告。 | Method | Endpoint | 描述 | | ------ | ------------------------ | ---------------------------------------------- | | POST | `/v1/intent/resolve` | 搜索市场,如需要则捕获,执行 | | POST | `/v1/skills/:id/execute` | 执行特定 skill | | POST | `/v1/auth/login` | 交互式浏览器登录 | | POST | `/v1/search` | 跨所有域的语义搜索 | | POST | `/v1/search/domain` | 限定于某个域的语义搜索 | | POST | `/v1/feedback` | 提交反馈(影响可靠性分数) | | POST | `/v1/skills/:id/verify` | 健康检查 skill 端点 | | POST | `/v1/skills/:id/issues` | 报告损坏的 skill | | GET | `/v1/skills` | 列出所有市场 skill | | GET | `/v1/stats/summary` | 平台统计 | | GET | `/health` | 健康检查 | ## 配置 ### 运行时目录 ``` ~/.unbrowse/config.json # API key, agent ID, registration ~/.unbrowse/vault/credentials.enc # Encrypted credential store ~/.unbrowse/vault/.key # Encryption key (mode 0o600) ~/.unbrowse/skill-cache/ # Local skill manifest cache ~/.unbrowse/profiles// # Per-domain Chrome profiles ~/.unbrowse/logs/unbrowse-YYYY-MM-DD.log # Daily logs ``` ### 环境变量 | Variable | Default | 描述 | | -------------------------- | ----------------------- | ---------------------------- | | `PORT` | `6969` | 服务器端口 | | `HOST` | `127.0.0.1` | 服务器绑定地址 | | `UNBROWSE_URL` | `http://localhost:6969` | API 调用的 Base URL | | `UNBROWSE_API_KEY` | auto-generated | API key 覆盖 | | `UNBROWSE_TOS_ACCEPTED` | — | 非交互式接受服务条款 | | `UNBROWSE_NON_INTERACTIVE` | — | 跳过 readline 提示 | ## 系统布局 ``` src/ ├── index.ts # Fastify server entrypoint (port 6969) ├── api/routes.ts # HTTP route definitions ├── orchestrator/ # Intent resolution pipeline ├── execution/ # Skill/endpoint execution + retry logic ├── capture/ # Headless browser traffic recording ├── reverse-engineer/ # HAR parsing → endpoint extraction ├── extraction/ # DOM structured data extraction ├── marketplace/ # Backend API client (beta-api.unbrowse.ai) ├── client/ # Agent registration & config management ├── auth/ # Interactive login + cookie extraction ├── vault/ # Encrypted credential storage (AES-256-CBC) ├── transform/ # Field projection + schema drift detection ├── verification/ # Periodic endpoint health checks ├── ratelimit/ # Request throttling ├── types/ # TypeScript type definitions ├── domain.ts # Domain utilities └── logger.ts # Logging ``` ## 许可证 AGPL-3.0 —— 详见 [LICENSE](LICENSE)。
标签:AI 编程, API 逆向工程, CLI 工具, Headless Browser, IP 地址批量处理, MITM代理, PE 加载器, RPA, 威胁情报, 开发者工具, 技能市场, 接口生成, 效率工具, 数据提取, 暗色界面, 本地部署, 流量抓包, 浏览器自动化, 系统分析, 网络分析, 网络协议分析, 网络请求拦截, 自动化攻击