diff --git a/skills/cross-border-ecommerce/ziniao-bridge/SKILL.md b/skills/cross-border-ecommerce/ziniao-bridge/SKILL.md new file mode 100644 index 0000000..0644070 --- /dev/null +++ b/skills/cross-border-ecommerce/ziniao-bridge/SKILL.md @@ -0,0 +1,375 @@ +--- +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`) +- 🔴 版本映射表修正(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。