megamen32/Codex-Chrome-Extension

GitHub: megamen32/Codex-Chrome-Extension

该项目逆向分析了 OpenAI Codex Chrome 扩展,完整还原了 AI Agent 控制浏览器的架构、通信协议及内部工程实现细节。

Stars: 0 | Forks: 0

# 🔍 Codex Chrome 扩展 — 逆向工程 **📖 [英文版本](README.en.md)** ## 这是什么 这是 OpenAI 开发的一款 Chrome 扩展,允许 AI agent (Codex / ChatGPT) 控制您的浏览器:进行点击、输入、滚动、跳转链接、截图以及执行 JavaScript。该扩展在欧洲不可用,但可以手动安装。 ## 架构 ``` ┌─────────────────────────┐ │ OpenAI API │ ← LLM, скриншоты, принятие решений │ (Codex / ChatGPT) │ └───────────┬─────────────┘ │ JSON-RPC 2.0 ▼ ┌─────────────────────────┐ │ Native Host App │ ← com.openai.codexextension │ (десктоп-приложение) │ chrome.runtime.connectNative() │ │ │ Основной "мозг": │ — Обрабатывает 70+ команд │ — Навигация │ — Делает скриншоты │ — DOM-анализ │ — Управляет viewport │ — Клик/ввод/скролл │ — Выполняет CDP-команды └───────────┬─────────────┘ │ Native Messaging ▼ ┌───────────────────────────────────────────────────┐ │ Chrome Extension — Background Service Worker │ │ (background.js, ~229 KB минифицировано) │ │ │ │ Роли: │ │ — Управление сессиями и вкладками │ │ — Подключение chrome.debugger (CDP 1.3) │ │ — Трансляция CDP-событий в native host │ │ — Синхронизация курсора → content script │ │ — Favicon badge manager (active/deliverable/etc) │ │ — Heartbeat (каждые 30с, emergency shutdown) │ │ — Отложенные обновления расширения │ │ — Tab lease система (active/handoff/deliverable) │ │ — Weighted Semaphore (приоритетная очередь задач) │ └───────────┬───────────────────────────────────────┘ │ chrome.tabs.sendMessage ▼ ┌───────────────────────────────────────────────────┐ │ Content Script (codex.js, ~25 KB минифицировано) │ │ │ │ Роли: │ │ — Анимированный курсор агента (Spring Physics) │ │ — Favicon badge (SVG overlay на фавиконку) │ │ — Shadow DOM (closed, z-index: 2147483646) │ │ — MutationObserver (защита от удаления оверлея) │ │ — WXT Content Script Lifecycle Manager │ └───────────────────────────────────────────────────┘ ``` ## 📂 仓库结构 ``` Codex-Chrome-Extension/ ├── extension/ # Оригинальные файлы расширения (как есть) │ ├── manifest.json # Manifest V3 │ ├── background.js # Service Worker (~229 KB, минифицирован) │ ├── popup.html # Popup страница │ ├── content-scripts/ │ │ └── codex.js # Content Script (~25 KB, минифицирован) │ ├── chunks/ │ │ └── popup-CTe__03-.js # Popup JS (React 19 + Tailwind 4) │ ├── assets/ │ │ └── popup-DzS88qVA.css # Popup CSS │ ├── images/ │ │ ├── icon16/32/48/128.png # Иконки расширения │ │ └── cursor-chat.png # Курсор агента │ └── _metadata/ │ └── verified_contents.json # SHA-256 treehash подписи │ └── deobfuscated/ └── codex-readable.js # Content Script (~850 строк, полностью читаемый) ``` ## 🧠 70 多条浏览器控制命令 通过 background.js 中的 Zod schema,我们还原了完整的命令集。大多数命令在 native host 中处理,而不是在扩展中。 ### 导航与标签页 | 命令 | 描述 | |---------|----------| | `tab_navigate` | 跳转至 URL (`wait_until: load\|networkidle\|commit`) | | `tab_wait_for_load` | 等待页面加载 | | `tab_wait` | 等待 N 毫秒 | | `tab_close` | 关闭标签页 | | `tab_get_info` | 标签页的 URL、标题、ID | | `tab_set_title` | 设置标题 | ### 输入 | 命令 | 描述 | |---------|----------| | `tab_click` | 点击坐标 (x, y, button, modifiers) | | `tab_drag` | 沿点路径 `[{x,y}]` 拖拽 | | `tab_hover` | 悬停光标 | | `tab_press_key` | 按下按键 (keys 数组, modifiers) | | `tab_type` | 输入文本 | ### DOM 操作 (Playwright 风格) | 命令 | 描述 | |---------|----------| | `tab_wait_for_selector` | 等待元素 (attached/visible/hidden) | | `tab_get_element_count` | 根据 selector 获取元素数量 | | `tab_select_option` | 在 `