完善模板,加入RPA标准
This commit is contained in:
115
references/ADAPTER.md
Normal file
115
references/ADAPTER.md
Normal file
@@ -0,0 +1,115 @@
|
||||
# 适配器标准:真实/仿真 × API/RPA 四档模式
|
||||
|
||||
> 凡是"连接三方系统"(ERP、CRM、SaaS、银行等)的 skill,都应采用本文的 **adapter 四档模式**。这样同一套业务逻辑可以在不同档位间切换:开发用仿真、CI 用 mock、上线用真实,互不影响。
|
||||
|
||||
## 为什么要分档
|
||||
|
||||
对接一个外部系统,工程上无非四种方式的组合:
|
||||
|
||||
| | API(有接口) | RPA(操作界面) |
|
||||
|---|---|---|
|
||||
| **真实系统** | `real_api` 真实 API | `real_rpa` 真实界面 |
|
||||
| **仿真系统** | `mock` 离线仿真 | `sim_rpa` 仿真平台界面 |
|
||||
|
||||
- **mock**:纯离线、不联网,给单测 / CI / 开发自测,**保证可重复**。
|
||||
- **sim_rpa**:操作仿真平台(如 `sandbox.jc2009.com`),跑真实端到端流程但不碰生产,**默认开发档位**。
|
||||
- **real_api**:有官方接口时**首选**(最稳、最快、最易维护)。
|
||||
- **real_rpa**:没有 API 只能操作生产界面,**风险最高、放最后**。
|
||||
|
||||
> 推荐优先级:**real_api > sim_rpa > real_rpa**,mock 永远保留做 CI。
|
||||
|
||||
## 目录骨架
|
||||
|
||||
业务逻辑只依赖 `base` 里定义的接口与数据契约,具体档位实现各自一个文件:
|
||||
|
||||
```
|
||||
scripts/service/<domain>_adapter/
|
||||
__init__.py # dispatch:按档位返回对应 adapter 实例
|
||||
base.py # 数据契约(dataclass)+ AdapterBase 接口(NotImplementedError)
|
||||
mock.py # 离线仿真,给 CI/单测
|
||||
real_api.py # 真实系统 API
|
||||
sim_rpa.py # 仿真平台 RPA(Playwright/pywinauto/uiautomator2)
|
||||
real_rpa.py # 真实系统 RPA(占位,谨慎实现)
|
||||
```
|
||||
|
||||
> 参考实现:`disburse-payroll-icbc/scripts/service/disburse_adapter/`(已有 `base.py` / `mock.py` / `icbc_simulator_rpa.py`)。
|
||||
> 模板示例:`scripts/service/example_adapter/`(复制改名即用)。
|
||||
|
||||
### 引用方式
|
||||
|
||||
```python
|
||||
from service.example_adapter import get_adapter
|
||||
from service.example_adapter.base import ExampleItem
|
||||
|
||||
adapter = get_adapter() # 由 OPENCLAW_TEST_TARGET 决定档位
|
||||
result = adapter.do_batch(
|
||||
target="https://sandbox.jc2009.com",
|
||||
items=[ExampleItem(id="1", label="demo")],
|
||||
)
|
||||
```
|
||||
|
||||
mock 档位纯离线验证:
|
||||
|
||||
```bash
|
||||
set OPENCLAW_TEST_TARGET=mock
|
||||
python -c "import sys; sys.path.insert(0,'scripts'); from service.example_adapter import get_adapter; from service.example_adapter.base import ExampleItem; r=get_adapter().do_batch('x',[ExampleItem('1','a')]); print(r.ok, r.serial_no)"
|
||||
```
|
||||
|
||||
## base.py 写法(要点)
|
||||
|
||||
1. **数据契约用 `@dataclass`**:输入项(如 `PayrollItem`)、批量结果(如 `BatchResult{ok, serial_no, error_msg, artifacts}`)。
|
||||
2. **接口方法抛 `NotImplementedError`**:所有档位实现同一签名。
|
||||
3. **以"批"为单位返回**:真实 RPA 往往是整批提交,结果按批次返回,不要假设逐条。
|
||||
4. **结果里带 `artifacts`**:截图/录屏/日志路径,便于排查。
|
||||
|
||||
```python
|
||||
@dataclass
|
||||
class XxxResult:
|
||||
ok: bool
|
||||
serial_no: Optional[str]
|
||||
error_msg: Optional[str]
|
||||
artifacts: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
class AdapterBase:
|
||||
name = "base"
|
||||
def do_batch(self, target: str, items: list) -> XxxResult:
|
||||
raise NotImplementedError
|
||||
```
|
||||
|
||||
## 档位 dispatch
|
||||
|
||||
由 `OPENCLAW_TEST_TARGET` 统一决定用哪个 adapter(与现有测试体系一致):
|
||||
|
||||
| `OPENCLAW_TEST_TARGET` | adapter | 用途 |
|
||||
|---|---|---|
|
||||
| `unit` / `mock` | `MockAdapter` | 单测 / CI,离线 |
|
||||
| `simulator_rpa`(默认) | `SimRpaAdapter` | 开发/演示,操作仿真平台 |
|
||||
| `real_api` | `RealApiAdapter` | 生产,走官方接口 |
|
||||
| `real_rpa` | `RealRpaAdapter` | 生产,操作真实界面(最后手段) |
|
||||
|
||||
```python
|
||||
# __init__.py
|
||||
def get_adapter():
|
||||
target = (os.environ.get("OPENCLAW_TEST_TARGET") or "simulator_rpa").lower()
|
||||
if target in ("unit", "mock"):
|
||||
return MockAdapter()
|
||||
if target == "real_api":
|
||||
return RealApiAdapter()
|
||||
if target == "real_rpa":
|
||||
return RealRpaAdapter()
|
||||
return SimRpaAdapter() # 默认
|
||||
```
|
||||
|
||||
> 实际可改为读 `.env` 里的运行模式(见 `CONFIG.md`),`OPENCLAW_TEST_TARGET` 作为进程级覆盖优先。
|
||||
|
||||
## 测试要求
|
||||
|
||||
- **mock 档必须能纯离线跑通**,进 CI。
|
||||
- **每个 adapter 单测同一组用例**(契约测试),保证档位间行为一致。
|
||||
- RPA 档的真实联网测试单独标记,不进默认 CI(参考 `tests/desktop/`)。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- `RPA.md` — 三端 RPA 技术选型与拟人/反反爬范式
|
||||
- `CONFIG.md` — `.env` 里如何配置运行模式与目标地址
|
||||
- `TESTING.md` — 测试 target 与隔离体系
|
||||
99
references/CONFIG.md
Normal file
99
references/CONFIG.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# 配置标准:`.env` 规范与首次落盘机制
|
||||
|
||||
> 解决"每个 skill 每次都要手动搞一堆环境变量、账号、地址"的痛点。统一约定:**模板内置 `.env.example`,skill 首次运行自动落盘到用户数据目录,之后从那里读。**
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. **`.env.example` 进仓库**:带注释的全量默认配置,是配置项的"单一事实来源"。
|
||||
2. **首次运行自动 copy**:`setup` / `doctor` / 首次 `run` 时,把 `.env.example` 复制到
|
||||
`{CLAW_DATA_ROOT}/{user}/{slug}/.env`(**已存在则不覆盖**,保护用户改过的值)。
|
||||
3. **三级优先级读取**:`进程环境变量` > `数据目录/.env` > `.env.example 默认值`。
|
||||
4. **敏感信息绝不进 `.env`**:密码/密钥/口令走 account-manager 的 `secret-ref`(见下"红线")。
|
||||
|
||||
## 标准配置项
|
||||
|
||||
每个 skill 的 `.env.example` 至少包含这些(按需增减):
|
||||
|
||||
```ini
|
||||
# ── 运行模式(对应 adapter 四档,见 ADAPTER.md)──
|
||||
OPENCLAW_TEST_TARGET=simulator_rpa # mock | simulator_rpa | real_api | real_rpa
|
||||
|
||||
# ── 目标系统 ──
|
||||
TARGET_BASE_URL=https://sandbox.jc2009.com # 仿真/生产地址,可被进程环境变量覆盖
|
||||
|
||||
# ── 默认账号(仅非敏感标识;密码走 account-manager)──
|
||||
DEFAULT_LOGIN_ID=04110001
|
||||
|
||||
# ── 浏览器 / RPA ──
|
||||
OPENCLAW_BROWSER_HEADLESS=0 # 0=有头(默认) 1=无头(CI)
|
||||
OPENCLAW_PLAYWRIGHT_STEALTH=1 # 1=开启反检测指纹(默认)
|
||||
|
||||
# ── 存证 ──
|
||||
OPENCLAW_RECORD_VIDEO=0 # 1=全程录屏(合规场景建议开)
|
||||
OPENCLAW_ARTIFACTS_ON_FAILURE=1 # 1=失败截图(默认)
|
||||
|
||||
# ── 节流 / 超时 ──
|
||||
STEP_DELAY_MIN=1.0 # 步骤间随机等待下限(秒)
|
||||
STEP_DELAY_MAX=5.0 # 步骤间随机等待上限(秒)
|
||||
HUMAN_WAIT_TIMEOUT=180 # 滑块/验证码/2FA 等人工超时(秒)
|
||||
```
|
||||
|
||||
## 🚫 红线:敏感信息不进 `.env`
|
||||
|
||||
`.env` 只放**非敏感运行参数**(模式、地址、开关、超时)。密码、密钥、动态口令、token——
|
||||
|
||||
- 走 **account-manager** 注册凭据,用 `--secret-storage env --secret-ref XXX` 引用;
|
||||
- 真实值由宿主/用户通过环境变量注入,**不落任何文件、不进 git**。
|
||||
- 参考 `disburse-payroll-icbc/scripts/cli/cmd_setup.py`:账号写入 account-manager,密码只登记 `secret-ref`(如 `ICBC_SIM_PASSWORD`)。
|
||||
|
||||
`.gitignore` 必须包含:
|
||||
|
||||
```gitignore
|
||||
.env
|
||||
*.env.local
|
||||
```
|
||||
|
||||
## 配置读取层(模板提供)
|
||||
|
||||
模板会提供一个统一 `config.py`,约定行为:
|
||||
|
||||
```python
|
||||
config.get("TARGET_BASE_URL") # 三级优先级解析
|
||||
config.get_bool("OPENCLAW_BROWSER_HEADLESS")
|
||||
config.get_float("STEP_DELAY_MIN", 1.0)
|
||||
config.ensure_env_file() # 首次把 .env.example copy 到数据目录
|
||||
```
|
||||
|
||||
- 启动时调一次 `ensure_env_file()` 完成落盘。
|
||||
- 所有业务代码**只通过 `config.get*` 读配置**,不直接 `os.environ`,便于统一管理与测试覆盖。
|
||||
|
||||
### 引用方式
|
||||
|
||||
实现位于 `jiangchang-platform-kit` 的 `jiangchang_skill_core.config`;模板 vendor 拷贝在 `scripts/jiangchang_skill_core/config.py`:
|
||||
|
||||
```python
|
||||
from jiangchang_skill_core import config
|
||||
from util.constants import SKILL_SLUG
|
||||
from util.runtime_paths import get_skill_root
|
||||
import os
|
||||
|
||||
example = os.path.join(get_skill_root(), ".env.example")
|
||||
config.ensure_env_file(SKILL_SLUG, example)
|
||||
|
||||
headless = config.get_bool("OPENCLAW_BROWSER_HEADLESS")
|
||||
target = config.get("TARGET_BASE_URL")
|
||||
timeout = config.get_int("HUMAN_WAIT_TIMEOUT", 180)
|
||||
```
|
||||
|
||||
## doctor / setup 命令
|
||||
|
||||
每个 skill 应提供自检命令(参考 `disburse` 的 `test_doctor`):
|
||||
|
||||
- `python scripts/main.py doctor`:检查浏览器是否安装、Profile/账号是否就绪、`.env` 是否已落盘、设备(手机)是否连接。
|
||||
- `python scripts/main.py setup`:初始化演示账号、首次落盘 `.env`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- `RPA.md` — 三端 RPA 标准与各开关含义
|
||||
- `ADAPTER.md` — `OPENCLAW_TEST_TARGET` 四档模式
|
||||
- `RUNTIME.md` — `CLAW_*` 环境变量与数据目录约定
|
||||
@@ -152,9 +152,28 @@ scripts/
|
||||
作用:常量、日志、路径、时间工具、通用帮助函数
|
||||
|
||||
- `jiangchang_skill_core/`
|
||||
作用:运行时环境与统一日志副本
|
||||
作用:运行时环境、统一日志、配置读取、RPA 共享库(vendor 自 platform-kit)
|
||||
一般按现有规范技能复制,不要自己乱改结构
|
||||
|
||||
## 3.2 开发 RPA 类 skill
|
||||
|
||||
若 skill 需要浏览器/桌面/手机自动化,按以下顺序落地:
|
||||
|
||||
1. **先读三份标准**:`references/RPA.md`(三端范式与反反爬)、`references/CONFIG.md`(`.env` 落盘与读取)、`references/ADAPTER.md`(四档 adapter)。
|
||||
2. **从模板复制骨架**:
|
||||
- `scripts/service/example_adapter/` → 改名为 `scripts/service/<domain>_adapter/`
|
||||
- 参考 `scripts/service/example_browser_rpa.py` 写浏览器会话逻辑
|
||||
3. **只用共享库,不在 skill 里重写反反爬**:
|
||||
```python
|
||||
from jiangchang_skill_core import config
|
||||
from jiangchang_skill_core.rpa import launch_persistent_browser, anti_detect, wait_for_captcha_pass
|
||||
```
|
||||
vendor 源码在 `scripts/jiangchang_skill_core/rpa/`(与 `jiangchang-platform-kit` 保持同步拷贝)。
|
||||
4. **mock 档必须离线可跑**(`OPENCLAW_TEST_TARGET=mock`);sim_rpa / real_* 按需单独测。
|
||||
5. **桌面/手机**:本期标准见 RPA.md 第 2/3 节,复用 `jiangchang_desktop_sdk` / `screencast`,**不要在新 skill 里重复造包**(尚待实战验证)。
|
||||
|
||||
---
|
||||
|
||||
### 3.1 `requirements.txt` 依赖规范
|
||||
|
||||
技能根目录的 `requirements.txt` 是**标准文件**,用于声明本技能特有的 Python 三方依赖。
|
||||
|
||||
@@ -46,3 +46,19 @@ description: "规范化的新技能模板说明;复制后替换名称、CLI
|
||||
- 旧入口 `scripts/skill_main.py`
|
||||
|
||||
新模板统一使用 `scripts/main.py` 作为入口。
|
||||
|
||||
## 参考文档索引
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| `DEVELOPMENT.md` | 从复制模板到开发出新 skill 的完整教程 |
|
||||
| `RUNTIME.md` | 运行时目录结构与 `CLAW_*` 环境变量约定 |
|
||||
| `CLI.md` | CLI 命令与参数示例 |
|
||||
| `SCHEMA.md` | task_logs 与字段映射说明 |
|
||||
| `TESTING.md` | 测试 target 与隔离体系 |
|
||||
| **`RPA.md`** | **三端 RPA 标准(浏览器/桌面/手机):选型、拟人操作、反反爬、人工兜底、存证** |
|
||||
| **`ADAPTER.md`** | **真实/仿真 × API/RPA 四档适配器模式** |
|
||||
| **`CONFIG.md`** | **`.env` 配置规范与首次自动落盘机制** |
|
||||
| `REQUIREMENTS.md` | 依赖与运行要求 |
|
||||
|
||||
> 开发"操作浏览器/桌面/手机"或"对接 ERP/CRM/SaaS/银行"类 skill 前,**务必先读 `RPA.md` + `ADAPTER.md` + `CONFIG.md`** 这三份标准,避免重复踩坑。
|
||||
|
||||
171
references/RPA.md
Normal file
171
references/RPA.md
Normal file
@@ -0,0 +1,171 @@
|
||||
# RPA 操作标准(浏览器 / 桌面 / 手机)
|
||||
|
||||
> 本文是团队 RPA 开发的**统一标准**。任何需要"自动操作软件界面"的 skill,都应先读这份文档,按这里的选型和范式落地,不要每个项目重新踩坑。
|
||||
|
||||
我们开发的各类 skill,本质上都是在替人操作三类界面:**浏览器、桌面软件、手机软件**。三类的底层技术不同,但**工程范式相同**:保持登录态、有头运行、拟人操作、失败存证、人工兜底。
|
||||
|
||||
---
|
||||
|
||||
## 0. 三端通用范式(先看这个)
|
||||
|
||||
无论操作哪类界面,都遵循同一套约定:
|
||||
|
||||
| 约定 | 说明 |
|
||||
|------|------|
|
||||
| **保持登录态** | 复用持久化 Profile / session,避免每次重新登录触发风控;账号由 account-manager 下发,不硬编码 |
|
||||
| **有头运行** | 默认有头(headless 易被识别 / 难人工介入);`OPENCLAW_BROWSER_HEADLESS=1` 仅给 CI |
|
||||
| **拟人操作** | 真实事件(isTrusted=true),逐字输入、随机延迟、贝塞尔鼠标轨迹;严禁 JS 直接设值/JS 点击/JS 跳转 |
|
||||
| **步骤间随机等待** | 每两步操作之间 `random_delay(min,max)`,区间由 `.env` 配置(默认 1~5s) |
|
||||
| **人工兜底(HITL)** | 滑块 / 短信验证码 / 人脸 / U盾 / 动态口令 → **停下来轮询等人工**,超时报 `ERROR:XXX_NEED_HUMAN`,绝不自动硬闯 |
|
||||
| **失败存证** | 失败必截图,合规场景全程录屏,统一存 `{数据目录}/rpa-artifacts/{batch_id}/{tag}_{ts}.png` |
|
||||
| **选择器纪律** | 语义选择器优先(id/name/text/aria);**F12 确认后再写,严禁凭记忆猜 DOM** |
|
||||
| **统一错误码** | `ERROR:REQUIRE_LOGIN` / `ERROR:CAPTCHA_NEED_HUMAN` / `ERROR:RATE_LIMITED` / `ERROR:LOGIN_TIMEOUT` 等,见下方错误码表 |
|
||||
| **幂等 / 断点续跑** | 批量操作记录"已处理到第几条",崩溃后能续跑、不重复提交 |
|
||||
|
||||
> 三端各自实现一个会话抽象 `RpaSession`(launch / login / act / screenshot / close),上层 skill 不感知是浏览器还是手机。
|
||||
|
||||
---
|
||||
|
||||
## 1. 浏览器(标准已成熟)
|
||||
|
||||
**选型:Playwright + 系统 Chrome/Edge。** 这是团队验证最充分的一条线(参考 `1688-scrape-contacts`、`disburse-payroll-icbc`)。
|
||||
|
||||
| 项 | 标准 |
|
||||
|----|------|
|
||||
| 驱动 | Playwright(Python) |
|
||||
| 浏览器 | 系统已装 Chrome/Edge,`channel="chrome"`;**不用内置 Chromium,无需 `playwright install`** |
|
||||
| 登录态 | `launch_persistent_context` + 用户 Profile 目录(由 account-manager 下发) |
|
||||
| 模式 | 默认有头;`OPENCLAW_BROWSER_HEADLESS=1` 转无头 |
|
||||
| 反反爬 | stealth 指纹注入 + 拟人输入/鼠标/延迟 + 滑块停下等人工(见下) |
|
||||
|
||||
### 1.1 防反爬三件套(必做)
|
||||
|
||||
1. **指纹淡化(stealth)**:启动时 `add_init_script` 注入,抹平自动化特征——
|
||||
`navigator.webdriver=undefined`、`chrome.runtime`、`permissions.query`、`plugins`、`languages`、`hardwareConcurrency`、`deviceMemory`、WebGL vendor。
|
||||
启动参数 `--disable-blink-features=AutomationControlled` + `ignore_default_args=["--enable-automation"]`。
|
||||
开关:`OPENCLAW_PLAYWRIGHT_STEALTH`(默认开)。
|
||||
2. **拟人操作**:
|
||||
- 输入:逐字符 `keyboard.type(delay=90~240ms)`,**先真实点击聚焦再输入,绝不 `el.value=`**。
|
||||
- 鼠标:贝塞尔曲线轨迹移动 + 微抖动;进场随机晃动 2~4 次。
|
||||
- 导航:用真实点击触发,**不要 `window.location.href=` / `el.click()` 这类 JS 跳转/点击**。
|
||||
- 翻页:真实点击翻页箭头,注意排除禁用态选择器。
|
||||
- 延迟:每步之间 `random_delay`。
|
||||
3. **风控页 = 停下等人工**:检测到滑块/拦截(URL 含 `punish/x5sec/baxia/tmd`,或 DOM 命中 `#nocaptcha/.nc-container/punish-component` 等)→ 抛 `ERROR:CAPTCHA_NEED_HUMAN`,轮询等人工通过或超时,**不自动操作滑块**。
|
||||
|
||||
> 参考实现:`1688-scrape-contacts/scripts/service/anti_detect.py`、`util/playwright_stealth.py`、`service/login_service.py`(验证码等待)。已提升为共享库 `jiangchang_skill_core.rpa`(见 platform-kit)。
|
||||
|
||||
### 1.2 安装
|
||||
|
||||
```bash
|
||||
pip install playwright # 仅装包;用系统 Chrome,无需 playwright install chromium
|
||||
```
|
||||
|
||||
### 引用方式
|
||||
|
||||
共享实现位于 `jiangchang-platform-kit` 的 `jiangchang_skill_core.rpa`;模板通过 vendor 拷贝引用:
|
||||
|
||||
```python
|
||||
# scripts/jiangchang_skill_core/rpa/ — vendored from platform-kit
|
||||
from jiangchang_skill_core.rpa import (
|
||||
launch_persistent_browser,
|
||||
anti_detect,
|
||||
wait_for_captcha_pass,
|
||||
capture_failure,
|
||||
errors,
|
||||
)
|
||||
from jiangchang_skill_core.rpa.stealth import stealth_enabled, STEALTH_INIT_SCRIPT
|
||||
```
|
||||
|
||||
完整示例见 `scripts/service/example_browser_rpa.py` 与 `scripts/service/example_adapter/sim_rpa.py`。
|
||||
|
||||
---
|
||||
|
||||
## 2. 桌面软件(Windows 原生程序)
|
||||
|
||||
**选型:pywinauto(UIA backend)为主 + 图像识别兜底。**
|
||||
|
||||
桌面端常见于 ERP 客户端、网银控件、银企直连等本地程序。优先走可访问性树(控件 ID/名字),坐标点击只做最后兜底。
|
||||
|
||||
| 技术 | 优先级 | 适用 / 说明 |
|
||||
|------|--------|------|
|
||||
| **pywinauto(`backend="uia"`)** | ✅ 首选 | 基于微软 UI Automation 树,拿控件 AutomationId/Name/ControlType,**稳定、不依赖屏幕坐标**,纯 Python |
|
||||
| **FlaUI**(经 pythonnet 调 .NET) | 备选 | UIA 拿不到的复杂/自绘控件时更完整,但需引入 .NET 运行时 |
|
||||
| **Playwright** | 特例 | 目标是 **Electron 套壳应用**(很多新 SaaS 客户端)时,可当浏览器驱动 |
|
||||
| **PyAutoGUI / SikuliX(图像识别)** | ⚠️ 兜底 | 控件树完全拿不到时(Flash/远程桌面/纯自绘 UI);**靠截图找图+坐标,分辨率/缩放一变就崩**,仅最后手段 |
|
||||
|
||||
### 桌面端注意事项
|
||||
|
||||
- **窗口聚焦/置顶**:操作前确保目标窗口前置,避免误操作其它窗口。
|
||||
- **DPI/缩放**:图像识别方案必须固定显示缩放比例;UIA 方案不受影响(优先用 UIA 即是为此)。
|
||||
- **存证**:同样要失败截图(截目标窗口/全屏),存到 `rpa-artifacts`。
|
||||
- **人工兜底**:U盾插拔、动态口令、人脸 → 停下等人工,超时 `ERROR:XXX_NEED_HUMAN`。
|
||||
|
||||
```bash
|
||||
pip install pywinauto # UIA 自动化
|
||||
# 图像兜底:pip install pyautogui opencv-python
|
||||
```
|
||||
|
||||
> 状态:桌面端选型为推荐标准,**尚待真实项目实战验证**,落地时回补踩坑记录到本文。
|
||||
|
||||
---
|
||||
|
||||
## 3. 手机软件(USB 连接电脑)
|
||||
|
||||
**选型:Android 用 uiautomator2(或 Appium);iOS 用 Appium + WebDriverAgent(需 Mac)。** 底层都是经 USB 的 ADB / WDA。
|
||||
|
||||
| 平台 | 技术 | 优先级 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| **Android** | **uiautomator2**(python 原生) | ✅ 首选 | ADB over USB,直接拿控件树点击/输入,比 Appium 轻快,纯 Python |
|
||||
| Android | **Appium**(uiautomator2 driver) | 备选 | 需要跨平台统一接口、或团队已有 Appium 资产时用 |
|
||||
| Android | **Airtest + Poco**(网易开源) | 兜底 | 图像+控件混合,自带 IDE 可录制;控件树拿不到时用 |
|
||||
| **iOS** | **Appium + WebDriverAgent(XCUITest)** | 唯一可行 | **必须有一台 Mac 做中转**,Windows host 无法直接驱动 iOS |
|
||||
| 投屏/人工介入 | **scrcpy** | 辅助 | USB 投屏到电脑,配合人工过验证码/人脸 |
|
||||
|
||||
### 手机端注意事项
|
||||
|
||||
- **设备就绪检查**:`adb devices` 确认已授权连接;放进 `doctor` 自检。
|
||||
- **登录态**:靠 App 自身保持登录,必要时引导人工首登一次。
|
||||
- **人工兜底**:短信验证码、人脸、指纹 → scrcpy 投屏让人工完成,程序轮询等待。
|
||||
- **存证**:失败时 `adb screencap` / Appium 截图存 `rpa-artifacts`。
|
||||
|
||||
```bash
|
||||
# Android(首选)
|
||||
pip install uiautomator2
|
||||
python -m uiautomator2 init # 初始化设备端 agent
|
||||
# 或统一走 Appium:pip install Appium-Python-Client(另需 Appium Server)
|
||||
```
|
||||
|
||||
> 状态:手机端选型为推荐标准,**尚待真实项目实战验证**,落地时回补踩坑记录到本文。
|
||||
|
||||
---
|
||||
|
||||
## 4. 统一错误码(RPA 场景)
|
||||
|
||||
skill 退出/抛错统一用 `ERROR:` 前缀 + 稳定码,方便宿主与上层判断与重试:
|
||||
|
||||
| 错误码 | 含义 | 上层处理建议 |
|
||||
|--------|------|------|
|
||||
| `ERROR:REQUIRE_LOGIN` | 未登录 / 登录态失效 | 触发登录流程 |
|
||||
| `ERROR:LOGIN_TIMEOUT` | 等待人工登录超时 | 提示用户重跑并及时操作 |
|
||||
| `ERROR:CAPTCHA_NEED_HUMAN` | 命中滑块/验证码拦截 | 暂停等人工,或转人工队列 |
|
||||
| `ERROR:RATE_LIMITED` | 触发频控 | 退避后重试 |
|
||||
| `ERROR:MISSING_BROWSER` | 未检测到 Chrome/Edge | 提示安装 |
|
||||
| `ERROR:DEVICE_NOT_READY` | 手机未连接/未授权 | 检查 USB/ADB |
|
||||
| `ERROR:WINDOW_NOT_FOUND` | 桌面目标窗口未找到 | 检查程序是否启动 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 存证规范
|
||||
|
||||
- **路径**:`{CLAW_DATA_ROOT}/{user}/{slug}/rpa-artifacts/{batch_id}/{tag}_{timestamp}.png`
|
||||
- **失败必截图**:受 `OPENCLAW_ARTIFACTS_ON_FAILURE`(默认开)控制。
|
||||
- **全程录屏**:受 `OPENCLAW_RECORD_VIDEO`(默认关)控制;合规场景(如代发工资)建议开。浏览器用 Playwright `record_video_dir`。
|
||||
- **常见 tag**:`before_submit` / `after_submit` / `captcha` / `login_fail` / `error`。
|
||||
|
||||
---
|
||||
|
||||
## 相关文档
|
||||
|
||||
- `ADAPTER.md` — 真实/仿真 × API/RPA 的四档适配器模式
|
||||
- `CONFIG.md` — `.env` 配置规范与首次落盘机制
|
||||
- `RUNTIME.md` — 运行时目录与环境变量约定
|
||||
Reference in New Issue
Block a user