376 lines
13 KiB
Markdown
376 lines
13 KiB
Markdown
---
|
||
name: ziniao-bridge
|
||
description: "紫鸟浏览器 AI 自动化 — 通过 Desktop 桥接紫鸟 WebDriver,自然语言驱动店铺运营:打开店铺、导航后台、拉取订单、下载报表、巡检评论、截图存档。"
|
||
version: 1.2.0
|
||
author: Hermes Agent
|
||
license: MIT
|
||
metadata:
|
||
hermes:
|
||
tags: [ziniao, 紫鸟, webdriver, browser-automation, cross-border, store-operations, bridge-cdp]
|
||
related_skills:
|
||
- bridge-cdp-agent
|
||
- drissionpage-toolkit
|
||
- competitor-price-monitor
|
||
- 1688-cross-border-sourcing
|
||
- ozon-operations
|
||
target_platforms: [amazon, ebay, shopee, shopify, lazada, ozon, temu-seller]
|
||
cron_compatible: true
|
||
---
|
||
|
||
# 紫鸟桥接 (Ziniao Bridge)
|
||
|
||
通过 AtomK Desktop + Bridge CDP 连接紫鸟浏览器 WebDriver,用自然语言操控店铺后台。
|
||
|
||
**触发词:** "紫鸟" / "ziniao" / "店铺" / "后台" / "订单截图" / "下载报表" / "巡检评论"
|
||
|
||
---
|
||
|
||
## 架构总览
|
||
|
||
```
|
||
钉钉自然语言指令
|
||
↓
|
||
Hermes Agent (解析意图)
|
||
↓
|
||
AtomK Bridge (CDP relay, 9228/9229)
|
||
↓
|
||
AtomK Desktop (Electron, 与紫鸟同机)
|
||
↓
|
||
Playwright → 紫鸟 WebDriver 端口 (127.0.0.1:{port})
|
||
↓
|
||
紫鸟浏览器内核 (Chromium) → 店铺后台页面
|
||
```
|
||
|
||
**前提条件:**
|
||
- 紫鸟浏览器与 AtomK Desktop 在同一台 Windows/Mac 机器
|
||
- 紫鸟开放平台已为自动化账号开通 WebDriver 权限
|
||
- 紫鸟以 WebDriver 模式启动(`--run_type=web_driver --ipc_type=http`)
|
||
- **API 凭证输入**:Desktop Chrome Bridge 页面 → 「紫鸟 & Hubstudio API」→ 输入 API Key + Base URL → 保存(safeStorage 加密存储到 `~/.atomk/ziniao.json`)
|
||
|
||
---
|
||
|
||
## 紫鸟 WebDriver API(核心)
|
||
|
||
紫鸟提供本地 HTTP API 管理店铺浏览器生命周期。Desktop 直接调这些接口。
|
||
|
||
### 基础 URL
|
||
|
||
```
|
||
http://127.0.0.1:{紫鸟服务端口}
|
||
```
|
||
|
||
默认端口由紫鸟启动参数 `--port` 指定(通常 19481 或自定义)。
|
||
|
||
### 核心接口
|
||
|
||
#### 1. 获取店铺列表
|
||
|
||
```
|
||
GET /api/store/list
|
||
```
|
||
|
||
返回:
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": [
|
||
{
|
||
"storeId": "xxx",
|
||
"storeName": "店铺A-亚马逊美国站",
|
||
"platform": "amazon",
|
||
"status": "idle"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### 2. 启动店铺浏览器
|
||
|
||
```
|
||
POST /api/browser/start
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"storeId": "xxx",
|
||
"runType": "web_driver"
|
||
}
|
||
```
|
||
|
||
返回:
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"debuggingPort": 9222,
|
||
"coreVersion": "120.0.6099.109",
|
||
"wsEndpoint": "ws://127.0.0.1:9222/devtools/browser/xxx"
|
||
}
|
||
}
|
||
```
|
||
|
||
> **关键:** `debuggingPort` 就是 Playwright/Selenium 的连接端口。
|
||
|
||
#### 3. 关闭店铺浏览器
|
||
|
||
```
|
||
POST /api/browser/stop
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"storeId": "xxx"
|
||
}
|
||
```
|
||
|
||
#### 4. 获取店铺浏览器状态
|
||
|
||
```
|
||
GET /api/browser/status?storeId=xxx
|
||
```
|
||
|
||
---
|
||
|
||
## Playwright 连接紫鸟浏览器
|
||
|
||
拿到 `debuggingPort` 后,Desktop 内用 Playwright 直连:
|
||
|
||
```javascript
|
||
const { chromium } = require('playwright');
|
||
|
||
// 连接紫鸟 WebDriver 端口
|
||
const browser = await chromium.connectOverCDP(
|
||
`http://127.0.0.1:${debuggingPort}`
|
||
);
|
||
|
||
// 获取已有页面或创建新页面
|
||
const pages = browser.contexts()[0].pages();
|
||
const page = pages[0] || await browser.contexts()[0].newPage();
|
||
|
||
// 导航到店铺后台
|
||
await page.goto('https://sellercentral.amazon.com/orders-v3');
|
||
```
|
||
|
||
> **注意:** `coreVersion` 必须与 Playwright 的 Chromium 大版本匹配,否则 `connectOverCDP` 会失败。
|
||
|
||
---
|
||
|
||
## 典型操作场景
|
||
|
||
### 场景 1:打开店铺 + 截图订单
|
||
|
||
**自然语言:** 「打开店铺A,去亚马逊后台看最近订单,截图发我」
|
||
|
||
**执行链:**
|
||
1. `GET /api/store/list` → 找到「店铺A」
|
||
2. `POST /api/browser/start` → 启动浏览器 → 拿到 `debuggingPort`
|
||
3. Playwright `connectOverCDP(port)` → 连接
|
||
4. `page.goto('https://sellercentral.amazon.com/orders-v3')`
|
||
5. `page.screenshot()` → 截图
|
||
6. Bridge → Hermes → 钉钉 → 图片回传
|
||
|
||
### 场景 2:下载业务报表
|
||
|
||
**自然语言:** 「下载店铺B最近7天的销售报表和广告报表」
|
||
|
||
**执行链:**
|
||
1. 获取店铺 → 启动浏览器 → 连接
|
||
2. 导航到 Reports 页面
|
||
3. 设置日期范围(最近7天)
|
||
4. 点击「下载 CSV」
|
||
5. 监听下载事件 → 获取文件
|
||
6. 回传文件到钉钉
|
||
|
||
### 场景 3:巡检评论
|
||
|
||
**自然语言:** 「巡检所有店铺今天的差评,有新的标红提醒我」
|
||
|
||
**执行链:**
|
||
1. 遍历店铺列表
|
||
2. 逐个打开 → 导航到评论页
|
||
3. 筛选 1-2 星评论
|
||
4. 提取评论文本 + 日期
|
||
5. AI 分析差评内容
|
||
6. 汇总报告 → 标红新差评 → 钉钉推送
|
||
|
||
### 场景 4:多店铺批量截图
|
||
|
||
**自然语言:** 「把所有店铺的首页截个图存档」
|
||
|
||
**执行链:**
|
||
1. 获取所有店铺列表
|
||
2. 串行处理(避免资源冲突):
|
||
- 启动 → 截图 → 关闭 → 下一个
|
||
3. 所有截图打包 → 回传
|
||
|
||
### 场景 5:定时自动巡检(Cron)
|
||
|
||
**自然语言:** 「每天早上9点自动巡检所有店铺订单和差评」
|
||
|
||
**执行链:**
|
||
```
|
||
cronjob create --name "每日店铺巡检" \
|
||
--schedule "0 9 * * *" \
|
||
--prompt "加载 ziniao-bridge skill,巡检所有紫鸟店铺:拉取昨日订单数、检查新增差评、截图汇总" \
|
||
--deliver "dingtalk"
|
||
```
|
||
|
||
---
|
||
|
||
## 店铺后台 URL 速查表
|
||
|
||
| 平台 | 订单页 | 报表页 | 评论页 |
|
||
|------|--------|--------|--------|
|
||
| Amazon Seller Central | `/orders-v3` | `/reporting` | `/customer-reviews/ref=xxx` |
|
||
| Amazon 日本站 | `/orders-v3` | `/reporting` | 同上 |
|
||
| eBay | `https://www.ebay.com/sh/ord` | `https://www.ebay.com/sh/prf` | — |
|
||
| Shopee | `https://seller.shopee.sg/portal/sale/order` | — | `https://seller.shopee.sg/portal/sale/comment` |
|
||
| Lazada | `https://sellercenter.lazada.sg/order/` | — | — |
|
||
| Shopify | `/admin/orders` | `/admin/analytics` | — |
|
||
| Ozon Seller | `/app/orders` | — | — |
|
||
| Temu Seller | `https://seller.kuajingbao.com/order` | — | — |
|
||
|
||
---
|
||
|
||
## 架构:relay vs 本地 Playwright 速度对比
|
||
|
||
紫鸟的 Playwright 封装在本机,不走网络 relay,速度差异显著:
|
||
|
||
| 操作 | Bridge CDP relay(跨网) | 本地 Playwright(同机) | 倍差 |
|
||
|------|------------------------|------------------------|------|
|
||
| 单次 CDP 往返 | 10-100ms | <1ms | **10-100x** |
|
||
| 页面导航+截图 | 2-5 秒 | 0.5-1.5 秒 | **2-5x** |
|
||
| 大图截图回传 | 0.5-2 秒(Base64跨网) | ~100ms(内存直读) | **5-20x** |
|
||
| 多步复合操作 | 5-15 秒 | 1-3 秒 | **3-5x** |
|
||
|
||
Desktop 同时担任两个角色:
|
||
- **被控端**:Bridge relay → CDP → 内置 Chromium(爬虫/反爬场景)
|
||
- **控制端**:本地 Playwright → 紫鸟 WebDriver(店铺运营场景)
|
||
|
||
同进程内切换通道,零额外开销。
|
||
|
||
---
|
||
|
||
## 错误处理规范
|
||
|
||
| 错误 | 原因 | 处理 |
|
||
|------|------|------|
|
||
| `debuggingPort` 连不上 | 紫鸟进程残留 / 端口被占 | 调 `POST /api/browser/stop` 强制关闭 → 重试 |
|
||
| **端口 9222 冲突** | **Desktop 内置 Chromium 也用 9222(chrome-bridge.ts:373 `CDP_PORT=9222`),与紫鸟 WebDriver 默认端口撞车** | **改 Desktop `CDP_PORT` 为 9322,同时修复 line 2256 硬编码的 `ws://127.0.0.1:9222/...` 改为 `${CDP_PORT}`** |
|
||
| `connectOverCDP` 版本不匹配 | `coreVersion` 与 Playwright Chromium 版本不一致 | 检查版本号 → 必要时 `npx playwright install chromium` |
|
||
| 页面元素找不到 | 后台改版 / 国际站差异 | 用 `page.content()` 查看实际 DOM → 调整选择器 |
|
||
| 登录态过期 | 店铺 Cookie 失效 | 需手动在紫鸟重新登录一次 |
|
||
| 下载文件无响应 | 浏览器下载弹窗未处理 | 用 Playwright `page.on('download')` 监听 |
|
||
|
||
---
|
||
|
||
## Desktop 端口冲突修复清单(✅ 已在 v4.0.0 实现)
|
||
|
||
`AtomK-Desktop/src/main/chrome-bridge.ts` 修改(commit ac4f645,main 分支):
|
||
|
||
| 行号 | 原代码 | 改为 | 说明 |
|
||
|------|--------|------|------|
|
||
| 373 | `const CDP_PORT = 9222;` | `const CDP_PORT = 9322;` | 端口常量,所有引用自动跟随 |
|
||
| 2256 | `` `ws://127.0.0.1:9222/devtools/${kind}/${target_id}` `` | `` `ws://127.0.0.1:${CDP_PORT}/devtools/${kind}/${target_id}` `` | 消除硬编码 |
|
||
|
||
UI 文件(ChromeBridge.tsx / BridgeConnection.tsx)中的 "9222" 是纯展示文本,不影响功能。
|
||
|
||
---
|
||
|
||
## 操作纪律
|
||
|
||
1. **串行优先**:多店铺操作默认串行,避免紫鸟资源冲突和 IP 风控
|
||
2. **操作间隔**:页面间导航至少间隔 2-3 秒,模拟人类节奏
|
||
3. **失败隔离**:单店铺失败不影响后续店铺
|
||
4. **截图留痕**:关键操作(下单、改价、删评)必须截图存档
|
||
5. **频率控制**:同一店铺 1 小时内自动化操作不超过 10 次
|
||
6. **进程清理**:每次操作完成后调 `POST /api/browser/stop` 释放资源
|
||
7. **版本锁定**:紫鸟 `coreVersion` 和 Playwright Chromium 版本必须对齐
|
||
|
||
---
|
||
|
||
## 与 AtomK Bridge 的集成点
|
||
|
||
Desktop 端需新增 `ziniao` 指令处理器:
|
||
|
||
```
|
||
Bridge CDP 指令格式:
|
||
{
|
||
"method": "ziniao.operate",
|
||
"params": {
|
||
"action": "screenshot_orders", // 操作类型
|
||
"storeId": "xxx", // 店铺ID(或 storeName 模糊匹配)
|
||
"targetUrl": "/orders-v3", // 目标页面路径
|
||
"options": {
|
||
"screenshot": true,
|
||
"fullPage": false
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Desktop 收到后执行:
|
||
1. 调紫鸟 API 获取 `debuggingPort`
|
||
2. Playwright 连接 → 导航 → 操作 → 截图
|
||
3. 结果通过 Bridge 回传 Hermes
|
||
|
||
---
|
||
|
||
## Desktop 实施 Spec 与实现
|
||
|
||
**Spec 文件:** `/home/ubuntu/docs/desktop-playwright-ziniao-spec.md`(**v2.1**,2025-06-14 GLM-5.1 Review 后修订)
|
||
**实现版本:** **4.0.0**(已提交 Gitea main 分支,PR #25-#31 全部合入,**已 build** → `dist/atomk-desktop-4.0.0-setup.exe`,已上传 COS `desktop/`)
|
||
|
||
**v2.1 关键变更**(GLM-5.1 审查 7 个问题全部修复):
|
||
- 🔴 端口 9222→9322(避免紫鸟 WebDriver 默认 9222 冲突)
|
||
- 🔴 BrowserContext 多 slot 隔离(`Map<slotId, BrowserContext>`)
|
||
- 🔴 版本映射表修正(Electron 39→Chromium 142→playwright-core ~1.56)
|
||
- 🟡 通道互斥锁、僵尸浏览器 TTL、下载超时、请求队列、safeStorage 加密
|
||
|
||
**Desktop 4.0.0 新增文件:**
|
||
- `src/main/playwright-controller.ts` — Playwright 控制器(BrowserContext 隔离 + 通道锁 + 操作队列)
|
||
- `src/main/ziniao-client.ts` — 紫鸟 HTTP API 客户端(safeStorage 加密存储)
|
||
- `src/main/bridge-message-router.ts` — 路由注册(`playwright.*` / `ziniao.*`)
|
||
|
||
**Bridge 指令协议(实现后):**
|
||
```
|
||
playwright.navigate / .screenshot / .click / .type / .extract / .download / .execute / .status
|
||
ziniao.status / .list_stores / .screenshot / .get_reviews / .download_report
|
||
```
|
||
|
||
关键变更:使用 `playwright-core ~1.56.0`(锁定匹配 Electron 39 Chromium 142)。
|
||
|
||
## 依赖
|
||
|
||
- **Desktop 侧:** Node.js + `playwright-core ~1.56.0`(锁定匹配 Electron 39 Chromium 142,已在 Desktop v4.0.0 的 package.json 中)
|
||
- **紫鸟侧:** WebDriver 权限已开通 + API Key
|
||
- **Hermes 侧:** `bridge-cdp-agent` skill(已就绪)
|
||
- **网络:** Desktop 与紫鸟同机 → `127.0.0.1` 本地通信
|
||
- **技术规格:** 详见 `/home/ubuntu/docs/desktop-playwright-ziniao-spec.md`(v2.1)
|
||
- **实现细节与开发流程:** 详见 `atomk-desktop-development` skill(Gitea PR 工作流、review pipeline、构建规则)
|
||
- **Review 记录:** 详见 `references/review-pipeline-4.0.0.md`(六轮 review 总计 ~50 个问题及修复)
|
||
- **已知 Bug:** 详见 `references/review-pipeline-4.0.0.md`(六轮 review 全部修复,仅剩 Server 侧 4 个端点问题待修)
|
||
|
||
## API 凭证配置
|
||
|
||
### 紫鸟 (Ziniao)
|
||
|
||
| 项目 | 说明 |
|
||
|------|------|
|
||
| **凭证来源** | Bridge/atomlisting 服务端配置下发 |
|
||
| **本地存储** | `~/.atomk/ziniao.json`(Electron `safeStorage` 加密) |
|
||
| **Desktop UI** | 暂无手动输入入口 |
|
||
| **代码** | `src/main/ziniao-client.ts`(Desktop v4.0.0) |
|
||
|
||
API Key 由 `ziniao-client.ts` 首次启动时从 Bridge 配置同步。Desktop 的 Accounts 页面(账号管理 → 添加店铺)支持 `apiKey` + `apiSecret` 字段,但目前没有"紫鸟" platform 选项。
|
||
|
||
### Hubstudio
|
||
|
||
| 项目 | 说明 |
|
||
|------|------|
|
||
| **集成状态** | ✅ 已有 `hubstudio-bridge` skill(Hermes v1.0.0) |
|
||
| **API 方式** | Local API `127.0.0.1:6873`,认证 `app_id` + `app_secret` |
|
||
| **Skill 位置** | `~/.hermes/skills/cross-border-ecommerce/hubstudio-bridge/` |
|
||
| **Gitea 注册表** | `admin9webs/atomk-hermes-skills/skills/cross-border-ecommerce/hubstudio-bridge/` |
|
||
| **Desktop client** | `src/main/hubstudio-client.ts`(v4.0.1+),UI 在 Chrome Bridge 页面底部 |
|
||
|
||
Hubstudio 是紫鸟同公司产品,提供浏览器环境 + 云手机管理。调用路径:Hermes → Bridge → Desktop → HubStudio Local API。
|