内容
<div align="center">
# 帕利
**一款轻量级CDP浏览器自动化框架,支持一流的AI工作流。**
驱动您已经登录的任意网站 — 读取DOM、填写表单、点击、提取数据、运行JS — 通过Chrome DevTools协议。纯文本,无截图,无视觉代币。内置工作流让AI聊天在您的浏览器中相互对话,也能与您的编码代理对话。
[](LICENSE)
[](https://www.python.org/downloads/)
[](https://modelcontextprotocol.io)
[](CONTRIBUTING.md)
</div>
---
## 为什么选择帕利?
大多数“浏览器AI”工具会截取页面截图并将像素馈送到视觉模型。这很慢并且会消耗代币。 **帕利直接通过Chrome DevTools协议(CDP)读取DOM文本**,因此它速度快、成本低,并且适用于您 **已经登录** 的会话 — 无需API密钥,无需按代币计费的聊天模型。
它也正确地完成了枯燥但重要的部分:**等待流式响应真正完成**,然后再将文本交给您,使用`MutationObserver`而不是简单的轮询。不再有半成品答案。
> 名称来自法语 *parler*,意为“说话” — *parley* 是双方之间的对话。 这正是它所做的:它让两个AI(或一个AI和您的代理)进行对话。
在内部,核心CDP引擎是完全通用的 — AI聊天自动化只是构建在其上的一个工作流。您可以将相同的基元指向新闻站点、仪表板、文档或内部Web应用程序。
## 功能
- **通用CDP引擎** — `read-dom`、`extract`、`click`、`type`、`navigate`、`wait-for`、`eval`和cookie访问适用于 **任何** 网站。
- **高效使用代币** — 仅文本提取,从不截图。
- **通用DOM发现** — 查找输入框和最新响应,无需脆弱的站点特定CSS选择器,并为ChatGPT、Gemini、Claude和Grok提供快速通道。
- **可靠的流式检测** — `MutationObserver`仅在响应停止更改时返回,因此您永远不会获取部分答案。
- **AI到AI桥接** — 在两个选项卡之间中继对话(例如ChatGPT ↔ Gemini)进行N轮。
- **自我修复** — 自动重新连接断开的CDP套接字,并通过有针对性的重新加载恢复Gemini的“卡住的发送按钮”状态,同时保留历史记录。
- **三种使用方式** — 一个简单的CLI,一个 [MCP](https://modelcontextprotocol.io) 服务器(Claude Desktop / Cursor / opencode / 任意MCP客户端),以及一个原生opencode插件。
- **零重依赖** — 一个小依赖(`websocket-client`)。 无Playwright,无Puppeteer,无无头Chrome下载。
## 工作原理
```
┌──────────────┐ CDP (ws://localhost:9222) ┌──────────────────────────┐
│ 您的浏览器 │ <────────────────────────────> │ parley.py │
│ (Brave/Chrome│ │ • Runtime.evaluate (DOM)│
│ 已登录到 │ │ • Input.insertText │
│ ChatGPT, │ │ • MutationObserver wait │
│ Gemini, ...)│ └────────────┬─────────────┘
└──────────────┘ │
┌───────────────┼───────────────┐
│ │ │
CLI用法 MCP服务器 opencode插件
(parley_mcp.py) (opencode/parley.ts)
```
## 架构
帕利分为三层,以便通用引擎保持独立于任何站点特定的知识:
```
parley/
├── core.py 核心CDP引擎 — 连接、DOM、JS评估、输入、
│ 导航、等待、cookie。 不了解AI站点。
├── adapters/ 站点特定知识(选择器、特性)
│ ├── base.py SiteAdapter基类 + URL匹配
│ ├── chatgpt.py Gemini / Claude / Grok / 通用适配器
│ ├── gemini.py …
│ ├── generic.py 任意网站的备用适配器
│ └── js.py 注入的JS(通用DOM发现、MutationObserver)
└── workflows.py 顶层AI工作流:发送、发送并等待、等待流、
轮询、桥接、健壮发送(Gemini卡住状态恢复)
```
`parley.py`(根)、`parley_mcp.py`和`opencode/parley.ts`都是这三个模块上的薄层。
## 安装
**要求:** Python 3.8+,以及Brave或Chrome/Chromium。
```bash
git clone https://github.com/Satyajeet-04/parley.git
cd parley
pip install -r requirements.txt
```
### 1. 启动带有CDP功能的浏览器
帕利与启用了远程调试的浏览器通信。使用辅助脚本:
```bash
./scripts/start-browser.sh
```
或自行启动(重用您的正常配置文件,以便您保持登录状态):
```bash
brave-browser --remote-debugging-port=9222 --remote-allow-origins=*
# 或:google-chrome --remote-debugging-port=9222 --remote-allow-origins=*
```
打开您要使用的AI的选项卡(ChatGPT、Gemini、...)并登录。
### 2. 试用
```bash
python3 parley.py list
```
您应该看到已打开的选项卡及其ID。
## 用法(CLI)
```bash
# 列出选项卡并获取您要的ID
python3 parley.py list
# 发送消息并等待完整回复(推荐)
python3 parley.py send-wait <TAB_ID> "用一句话解释CDP。"
# 从选项卡中读取最新响应
python3 parley.py read <TAB_ID>
# 使两个AI相互对话3轮
python3 parley.py bridge <CHATGPT_TAB_ID> <GEMINI_TAB_ID> 3
```
| 命令 | 描述 |
| --- | --- |
| `list` | 列出所有带有ID、标题、URL的浏览器选项卡 |
| `read <tab>` | 读取最新的AI响应(自动检测) |
| `send <tab> <text>` | 输入并提交消息 |
| `send-wait <tab> <text> [--timeout ms]` | 发送 **并等待** 完整响应 |
| `wait-stream <tab> [timeout_ms]` | 等待正在进行的响应完成 |
| `type <tab> <text>` | 输入而不提交 |
| `click <tab> <selector>` | 通过CSS选择器点击元素 |
| `navigate <tab> <url>` | 导航选项卡到URL |
| `eval <tab> <js>` | 运行JavaScript并返回结果 |
| `bridge <from> <to> [rounds]` | 在两个选项卡之间中继对话 |
| `read-dom <tab> [selector]` | 读取页面/元素文本 — 适用于 **任何** 站点 |
| `extract <tab> <selector> [attr]` | 从所有匹配项中提取文本/属性(爬取) |
| `wait-for <tab> <selector> [timeout_ms]` | 等待元素出现 |
| `cookies <tab> [domain]` | 通过CDP列出cookie(包括HttpOnly) |
| `set-cookie <tab> <name> <value> <domain> [path]` | 设置cookie |
### 通用自动化示例
```bash
# 爬取页面上的所有链接
python3 parley.py extract <TAB_ID> "a" href
# 读取文章的正文
python3 parley.py read-dom <TAB_ID> "article"
# 在其他地方重用已登录的会话(将cookie视为秘密!)
python3 parley.py cookies <TAB_ID> github.com
```
**配置** (环境变量):
| 变量 | 默认值 | 目的 |
| --- | --- | --- |
| `PARLEY_CDP_HOST` | `localhost` | CDP主机 |
| `PARLEY_CDP_PORT` | `9222` | CDP端口 |
## 用法(MCP服务器)
帕利附带了一个MCP服务器,以便任何MCP客户端都可以驱动您的浏览器。将其添加到您的客户端配置中:
```json
{
"mcpServers": {
"parley": {
"command": "python3",
"args": ["/absolute/path/to/parley/parley_mcp.py"]
}
}
}
```
- **Claude Desktop:** `claude_desktop_config.json`
- **Cursor:** `.cursor/mcp.json`
- **opencode:** 在`opencode.json`的`mcp`下添加(或使用下面的原生插件)
暴露的工具:`list_tabs`、`read`、`send`、`send_wait`、`wait_stream`、`type`、`click`、`navigate`、`eval`、`bridge`、`read_dom`、`extract`、`wait_for`、`cookies`。
## 用法(opencode插件)
适用于原生opencode集成(无需MCP):
```bash
cp parley.py ~/.opencode/scripts/parley.py
cp opencode/parley.ts ~/.opencode/plugins/parley.ts
```
重启opencode。您将获得`browser_list_tabs`、`browser_read`、`browser_send`、`browser_send_wait`、`browser_bridge`等工具。如果需要,可以通过`PARLEY_SCRIPT`环境变量指向不同的脚本位置。
## 示例:让ChatGPT和Gemini辩论
```bash
# 1. 在您的浏览器中打开一个ChatGPT选项卡和一个Gemini选项卡,登录到两者。
python3 parley.py list
# -> 记下两个选项卡ID
# 2. 播种一侧
python3 parley.py send-wait <CHATGPT_ID> "争论标签比空格好。一段话。"
# 3. 中继辩论4轮
python3 parley.py bridge <CHATGPT_ID> <GEMINI_ID> 4
```
## 故障排除
- **`list`返回错误/空** — 浏览器未运行 `--remote-debugging-port=9222`,或该端口上运行着不同的应用程序。 通过 `scripts/start-browser.sh` 重新启动。
- **连接时出现403** — 确保您已启动 `--remote-allow-origins=*`。
- **响应看起来为空或截断** — 模型可能仍在生成;优先使用 `send-wait` / `wait-stream`,它们会等待完成。
- **Gemini在一段时间后停止响应** — 帕利通过重新加载选项卡来自动恢复(保留历史记录)。如果持续存在,请手动重新加载Gemini选项卡。
- **在一个服务上只有第一个消息有效** — 您可能正在使用匿名/未登录(限制速率)。请登录以充分使用。
## 路线图
- [ ] Firefox(通过远程协议)支持
- [ ] 代码块和表格的结构化提取
- [ ] 多选项卡分发(并行向N个模型提出相同的问题)
- [ ] 可选的无WebSocket HTTP回退
## 贡献
非常欢迎贡献 — 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。添加对新AI站点的支持通常只需要几个选择器。
## 责任使用
帕利是一款通用的自动化工具。拥有伟大的DOM访问权限就意味着肩负起真正的责任:
- **尊重服务条款和机器人策略。** 自动化一个站点 — 尤其是私有API或批量爬取 — 可能会违反其条款,即使这是您自己的已登录会话。
- **限制自己。** 不要轰炸站点;添加延迟并限制请求量。
- **Cookie是凭证。** `cookies` 可以读取HttpOnly会话令牌。拥有它们的任何人都可以冒充您的登录。 永远不要登录,打印到共享的转录本中,或提交它们。 仅在内存中或权限锁定的、git忽略的 文件中存储。
- **注意隐私和数据法律。** 仅收集您被允许收集的数据,并依法处理个人数据。
您负责如何使用它。
## 免责声明
帕利自动化 *您自己的* 已登录浏览器会话本地。 本项目与OpenAI、Google、Anthropic或xAI无关。
## 许可证
[MIT](LICENSE) 2026 Satyajeet
---
<div align="center">
如果帕利为您节省了一些代币,请考虑留下⭐ — 它帮助其他人找到它。
</div>