chore: auto release commit (2026-06-15 17:32:47)
All checks were successful
技能自动化发布 / release (push) Successful in 7s
All checks were successful
技能自动化发布 / release (push) Successful in 7s
This commit is contained in:
@@ -51,7 +51,13 @@ scripts/service/<domain>_adapter/
|
||||
real_rpa.py # 真实系统 RPA(占位,谨慎实现)
|
||||
```
|
||||
|
||||
模板示例:`scripts/service/example_adapter/`(复制改名即用)。
|
||||
模板示例:
|
||||
|
||||
- **四档骨架(占位)**:`scripts/service/example_adapter/` — 复制改名后补齐业务 adapter
|
||||
- **仿真浏览器 RPA 完整案例**:`examples/simulator_browser_rpa/` — mock + simulator_rpa + sandbox 页面 + 测试
|
||||
- **真实浏览器 RPA 完整案例**:`examples/real_browser_rpa/` — 登录/验证码/滚动采集
|
||||
|
||||
> 先判断属于四象限哪一种(`real_browser_rpa` / `real_api` / `simulator_browser_rpa` / `simulator_api`),再读对应 `examples/*/README.md`。示例是**参考架构与边界**,不是业务代码原样复制。
|
||||
|
||||
## 档位 dispatch
|
||||
|
||||
@@ -92,15 +98,29 @@ def get_adapter():
|
||||
依赖 account-manager 或其他兄弟技能时:
|
||||
|
||||
1. 在 `SKILL.md` 的 `metadata.openclaw.dependencies.required` 声明。
|
||||
2. 调用兄弟技能走统一 **`service.sibling_bridge`**(`call_sibling_json`),**不要**在 service 层散落 `subprocess.run`。
|
||||
3. **lease 必须 release**(account-manager 租约);进程被 kill 后可能残留 lease,需在运维文档说明排查方式(查 account-manager lease 列表 / 手动释放)。
|
||||
2. **普通兄弟技能调用**,优先走统一 **`service.sibling_bridge`**(`call_sibling_json`),**不要**在 `task_service.py`、`task_rpa.py` 等业务流程文件中到处散落 `subprocess.run`。
|
||||
3. **account-manager 账号/租约能力**是例外:可参考 `examples/real_browser_rpa/scripts/service/account_client.py`,封装为**单一** `account_client.py`;允许在该文件内部集中通过 subprocess 调 account-manager CLI。
|
||||
4. **不允许**直接 `import account-manager` 的内部 Python 模块(如 `service/`、`util/`、`db/`)。
|
||||
5. **pick lease 后必须 `finally release lease`**;进程被 kill 后可能残留 lease,需在运维文档说明排查方式(查 account-manager lease 列表 / 手动释放)。
|
||||
|
||||
```python
|
||||
# 普通兄弟技能 — 走 sibling_bridge
|
||||
from service.sibling_bridge import call_sibling_json
|
||||
|
||||
result = call_sibling_json("account-manager", ["list", "--limit", "10"])
|
||||
```
|
||||
|
||||
```python
|
||||
# account-manager 账号/租约 — 集中在 account_client.py
|
||||
from service.account_client import pick_web_account, release_lease
|
||||
|
||||
account = pick_web_account(platform="target_platform")
|
||||
try:
|
||||
...
|
||||
finally:
|
||||
release_lease(account.get("lease_token"))
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- `RPA.md` — 三端 RPA 技术选型与拟人/反反爬范式
|
||||
|
||||
@@ -161,8 +161,17 @@ scripts/
|
||||
|
||||
1. **先读三份标准**:`RPA.md`(三端范式与反反爬)、`CONFIG.md`(`.env` 落盘与读取)、`ADAPTER.md`(四档 adapter)。
|
||||
2. **从模板复制骨架**:
|
||||
- `scripts/service/example_adapter/` → 改名为 `scripts/service/<domain>_adapter/`
|
||||
- 参考 `scripts/service/example_browser_rpa.py` 写浏览器会话逻辑
|
||||
- `scripts/service/example_adapter/` → 改名为 `scripts/service/<domain>_adapter/`(仅 adapter 四档骨架,**不等同于**真实浏览器 RPA 成功案例)
|
||||
- 若是 **真实浏览器 RPA**(真实网站、登录态、验证码、滚动采集),**必须先读** `examples/real_browser_rpa/README.md`,再按需参考:
|
||||
- `examples/real_browser_rpa/scripts/service/browser_session.py`
|
||||
- `examples/real_browser_rpa/scripts/service/human_verification.py`
|
||||
- `examples/real_browser_rpa/scripts/service/task_rpa.py`
|
||||
- `examples/real_browser_rpa/scripts/service/account_client.py`
|
||||
- 若是 **仿真浏览器 RPA**(自有 sandbox、表单批量提交、可控 DOM),**必须先读** `examples/simulator_browser_rpa/README.md`,再按需参考:
|
||||
- `examples/simulator_browser_rpa/scripts/service/browser_session.py`
|
||||
- `examples/simulator_browser_rpa/scripts/service/adapter/`
|
||||
- `examples/simulator_browser_rpa/scripts/service/task_service.py`
|
||||
- `examples/simulator_browser_rpa/sandbox/demo_app.html`
|
||||
3. **只用共享库,不在 skill 里重写反反爬**:
|
||||
```python
|
||||
from jiangchang_skill_core import config
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
- 一个 skill 对应一份主需求文档
|
||||
- 需求先写清楚,再进入开发
|
||||
- 文档描述“要做什么”和“做到什么程度”,不要在这里堆实现细节
|
||||
- 实现方式、代码结构、发布流程,分别放到 `DEVELOPMENT.md`、`CLI.md`、`SCHEMA.md`、`RUNTIME.md`
|
||||
- 实现方式、代码结构、发布流程,分别放到 `DEVELOPMENT.md`、`references/`、`development/` 下的技术规范
|
||||
|
||||
如果你是从 `skill-template` 复制新技能,请复制本文件后,把下面所有占位内容替换成你的真实项目内容。
|
||||
|
||||
@@ -21,46 +21,39 @@
|
||||
|
||||
模板写法:
|
||||
|
||||
- 本文档用于明确 `【技能名称】` 的研发范围、交付标准、依赖关系和验收要求。
|
||||
- 本文档用于明确 `your-skill-slug` 的研发范围、交付标准、依赖关系和验收要求。
|
||||
- 技术人员应以本文件作为开发范围依据,以避免实现偏差、范围蔓延或理解不一致。
|
||||
|
||||
示例:
|
||||
|
||||
- 本文档用于明确 `your-skill-slug`(示例:`disburse-payroll-icbc`)的研发范围、交付标准、依赖关系和验收要求。
|
||||
|
||||
## 2. 业务背景
|
||||
|
||||
说明为什么要做这个 skill,它服务什么业务场景,解决什么实际问题。
|
||||
|
||||
模板写法:
|
||||
|
||||
- 当前业务场景中,用户需要在 `【目标平台】` 完成 `【业务动作】`。
|
||||
- 现有流程主要依赖人工处理,存在 `【效率低 / 容易出错 / 不可批量 / 不可追踪】` 等问题。
|
||||
- 因此需要开发 `【技能名称】`,将该流程标准化、自动化,并接入匠厂技能体系中。
|
||||
- 当前用户在 `<业务场景>` 中需要反复处理 `<输入数据>`,人工操作耗时且易错。
|
||||
- 现有流程主要依赖人工处理,存在 `<效率低 / 容易出错 / 不可批量 / 不可追踪>` 等问题。
|
||||
- 因此需要开发 `your-skill-slug`,用于自动完成 `<核心动作>`,输出 `<输出结果>`,并写入 `task_logs` 便于追踪。
|
||||
|
||||
示例:
|
||||
填写提示:
|
||||
|
||||
- 当前财务团队需要将工资代发批次与银行接口对账,人工导出表格、核对差异耗时且易错。
|
||||
- 因此需要开发 `disburse-payroll-icbc`,用于自动拉取代发结果、写入任务日志 `task_logs` 并输出对账摘要,支持审计追踪。
|
||||
- `<业务场景>`:例如“每日批量导入外部系统结果”“Agent 触发的单次查询”
|
||||
- `<输入数据>`:例如“关键词列表”“批次 ID”“账号标识”
|
||||
- `<核心动作>`:例如“调用 adapter 提交”“采集并入库”“对账摘要生成”
|
||||
- `<输出结果>`:例如“结构化 JSON”“任务摘要”“本地 SQLite 记录”
|
||||
|
||||
## 3. 开发目标
|
||||
|
||||
说明本次开发希望最终交付什么结果。
|
||||
|
||||
模板写法:
|
||||
模板写法(按 skill 类型勾选/改写):
|
||||
|
||||
- 完成 `【技能名称】` 的标准目录结构搭建
|
||||
- 完成 CLI 入口与基础命令
|
||||
- 完成核心业务流程
|
||||
- 完成与兄弟技能或外部系统的必要集成
|
||||
- 完成正式环境发布验证
|
||||
|
||||
示例:
|
||||
|
||||
- 完成 `your-skill-slug` 的标准 skill 结构建设
|
||||
- 提供 `health`、`version`、`run`、`logs`、`log-get` 等命令
|
||||
- 支持对接银行 / 薪酬系统 API(示例),并记录任务执行结果
|
||||
- 支持写入任务日志 `task_logs`,并可在正式环境中安装验证
|
||||
- 解析并校验 `<输入数据>` 的关键字段
|
||||
- 通过 adapter 完成 mock / simulator / real 档位下的 `<核心动作>`
|
||||
- 输出结构化结果(stdout JSON 或固定文本 + 机读字段)
|
||||
- 写入 `task_logs`(及必要的业务表,见 `references/SCHEMA.md`)
|
||||
- 支持失败可诊断(稳定错误码、`ERROR:` 前缀、必要截图/日志)
|
||||
- 完成 CLI 入口与 `health` / `version` 最小可运行验证
|
||||
- 完成正式环境发布与安装验证(如适用)
|
||||
|
||||
## 4. 功能范围
|
||||
|
||||
@@ -68,219 +61,123 @@
|
||||
|
||||
模板写法:
|
||||
|
||||
- 支持 `【命令1】`
|
||||
- 支持 `【命令2】`
|
||||
- 支持读取 `【数据来源】`
|
||||
- 支持执行 `【核心业务动作】`
|
||||
- 支持记录 `【日志 / 状态 / 结果】`
|
||||
- 支持 `<命令1>`(如 `run`)
|
||||
- 支持 `<命令2>`(如 `logs` / `log-get`)
|
||||
- 支持读取 `<数据来源>`(兄弟 skill / 本地 DB / 外部 API)
|
||||
- 支持执行 `<核心业务动作>`
|
||||
- 支持记录 `<日志 / 状态 / 结果>`
|
||||
|
||||
建议将功能拆成“必须实现”和“可后续扩展”。
|
||||
|
||||
示例:
|
||||
|
||||
### 必须实现
|
||||
|
||||
- 支持 `python scripts/main.py health`
|
||||
- 支持 `python scripts/main.py version`
|
||||
- 支持 `python scripts/main.py run`
|
||||
- 支持从 `some-sibling-skill` 读取批次元数据(如需要)
|
||||
- 支持执行核心业务编排(HTTP / 批处理 / 可选 RPA)
|
||||
- 支持 `python scripts/main.py <your-main-command>`
|
||||
- 支持核心业务编排(HTTP / 批处理 / 可选 RPA,按四档 adapter 选型)
|
||||
- 支持写入任务日志(`task_logs`)
|
||||
|
||||
### 可后续扩展
|
||||
|
||||
- 支持定时批跑
|
||||
- 支持失败自动重试
|
||||
- 支持多目标轮询
|
||||
- 支持多 `<目标系统>` 轮询
|
||||
|
||||
## 5. 非功能要求
|
||||
|
||||
说明除功能外,对稳定性、可维护性、目录规范、日志、编码等方面的要求。
|
||||
|
||||
模板写法:
|
||||
|
||||
- 目录结构必须符合当前 skill 模板规范
|
||||
- 目录结构必须符合当前 `skill-template` 规范
|
||||
- 入口必须统一为 `scripts/main.py`
|
||||
- 输出格式应尽量机读友好
|
||||
- 错误前缀统一为 `ERROR:`
|
||||
- 用户说明写在根 `README.md`;LLM/运行契约写在 `SKILL.md`;开发规范在 `development/`
|
||||
- 输出格式应尽量机读友好;错误前缀统一为 `ERROR:`
|
||||
- Windows 环境下需保证 UTF-8 输出兼容
|
||||
- 必须具备基本日志能力
|
||||
|
||||
示例:
|
||||
|
||||
- 项目结构必须对齐 `skill-template`
|
||||
- CLI 入口统一使用 `scripts/main.py`
|
||||
- 关键执行结果应可通过 JSON 或固定文本结构返回
|
||||
- 任务日志必须可追踪(`task_logs`)
|
||||
- 不允许重新引入旧模板中的 `docs/`、`optional/` 或 `scripts/skill_main.py`
|
||||
- 必须具备基本日志能力;敏感字段脱敏
|
||||
- RPA 类 skill:Playwright 由宿主共享 runtime 提供;技能侧不要 `playwright install`;URL 不要放进 `launch_persistent_context` 的 `args`
|
||||
|
||||
## 6. 输入输出要求
|
||||
|
||||
说明这个 skill 接收什么输入,产出什么输出。
|
||||
|
||||
模板写法:
|
||||
|
||||
### 输入
|
||||
|
||||
- `【输入参数1】`
|
||||
- `【输入参数2】`
|
||||
- `【依赖系统返回的数据】`
|
||||
填写本 skill 实际接受的参数与数据来源:
|
||||
|
||||
- `<参数名>`:含义、是否必填、默认值
|
||||
- `<依赖系统>` 返回的结构化数据(如有)
|
||||
- 环境变量 / `.env` 中的关键配置(引用 `CONFIG.md`)
|
||||
|
||||
### 输出
|
||||
|
||||
- `【标准输出】`
|
||||
- `【错误输出】`
|
||||
- `【数据库记录】`
|
||||
- `【日志文件】`
|
||||
|
||||
示例:
|
||||
|
||||
### 输入
|
||||
|
||||
- `target_id`:可选,指定任务目标(账号 / 客户 / 平台)
|
||||
- `input_id`:可选,指定输入批次或记录
|
||||
- 兄弟技能返回的结构化数据(如有)
|
||||
|
||||
### 输出
|
||||
|
||||
- 成功结果(stdout / JSON)
|
||||
- 错误输出(`ERROR:` / `FAIL:`)
|
||||
- 在本地数据库写入 `task_logs`
|
||||
- 在日志目录中写入执行日志
|
||||
- 成功结果(stdout / JSON 字段说明)
|
||||
- 错误输出(`ERROR:` 稳定码 + 中文 message)
|
||||
- 数据库记录(表名、关键字段,见 `references/SCHEMA.md`)
|
||||
- 可选:RPA 截图/视频路径(artifacts)
|
||||
|
||||
## 7. 依赖的兄弟技能或外部系统
|
||||
|
||||
说明开发该 skill 时依赖哪些内部技能或外部平台。
|
||||
|
||||
模板写法:
|
||||
|
||||
### 兄弟技能依赖
|
||||
|
||||
- `【skill-a】`:作用是 `【用途】`
|
||||
- `【skill-b】`:作用是 `【用途】`
|
||||
- `<sibling-skill-slug>`:`<用途>`(例如 account-manager 提供 profile_dir / 租约)
|
||||
|
||||
### 外部系统依赖
|
||||
|
||||
- `【平台名】`:作用是 `【用途】`
|
||||
- `【浏览器 / API / 第三方服务】`:作用是 `【用途】`
|
||||
- `<目标系统>`:`<用途>`(HTTP API / 仿真 sandbox / 真实网页)
|
||||
- 浏览器(如适用):系统 Chrome/Edge,非 Playwright 内置 Chromium
|
||||
- Gitea / 匠厂客户端:发布与正式环境验证
|
||||
|
||||
### Python 包依赖(requirements.txt)
|
||||
|
||||
- 本技能若需**特有** Python 三方包,写入根目录 `requirements.txt`。
|
||||
- `jiangchang-platform-kit`、`playwright` 等公共能力由宿主共享 runtime 提供,**不要**写入技能 requirements。
|
||||
- `SKILL.md` 的 `platform_kit_min_version` 是运行契约/兼容性声明,供宿主校验,**不是** pip 依赖声明。
|
||||
- 匠厂宿主安装/更新技能后,会将技能 requirements 安装到 `{JIANGCHANG_DATA_ROOT}/python-runtime/.venv`。
|
||||
- `SKILL.md` 的 `platform_kit_min_version` 是运行契约/兼容性声明,**不是** pip 依赖声明。
|
||||
- 版本须尽量收窄(如 `requests>=2.31.0,<3`),避免共享 venv 冲突。
|
||||
- **不要**把系统运行时组件(如 Microsoft Visual C++ Redistributable)写进 requirements.txt。
|
||||
|
||||
### 系统运行时前置条件(preflight / health)
|
||||
|
||||
- 若依赖 Windows 原生 DLL、本机浏览器 channel 等**系统级**能力,在 `health` / preflight 中检测并提示用户自行安装。
|
||||
- 此类依赖**不**通过 pip / requirements.txt 由宿主自动安装。
|
||||
|
||||
示例:
|
||||
|
||||
### 兄弟技能依赖
|
||||
|
||||
- `some-sibling-skill`:提供主数据或凭证索引(按业务填写)
|
||||
|
||||
### 外部系统依赖
|
||||
|
||||
- 银行 / 政务 HTTP API(示例):核心外部接口
|
||||
- Chromium / Chrome / Edge(可选):用于浏览器自动化
|
||||
- Gitea:用于代码托管和发布工作流
|
||||
- 匠厂客户端:用于正式环境安装与验证
|
||||
- **不要**把系统运行时组件写进 requirements.txt;在 `health` / preflight 中检测并提示。
|
||||
|
||||
## 8. 不在本次范围内的内容
|
||||
|
||||
这一节非常重要,用来明确本次“不做什么”,避免研发越做越散。
|
||||
明确本次“不做什么”,避免范围蔓延:
|
||||
|
||||
模板写法:
|
||||
|
||||
- 本次不实现 `【功能A】`
|
||||
- 本次不处理 `【平台B】`
|
||||
- 本次不做 `【高级能力】`
|
||||
- 本次不兼容 `【旧结构 / 旧逻辑】`
|
||||
|
||||
示例:
|
||||
|
||||
- 本次不实现多租户隔离之外的附加报表
|
||||
- 本次不实现实时流式处理
|
||||
- 本次不实现自动重试机制
|
||||
- 本次不兼容旧模板中的历史目录结构
|
||||
- 本次不实现 `<功能A>`
|
||||
- 本次不处理 `<平台B>` / `<档位>`
|
||||
- 本次不做 `<高级能力>`
|
||||
- 本次不兼容旧模板历史结构(`docs/`、`optional/`、`skill_main.py` 等)
|
||||
|
||||
## 9. 验收标准
|
||||
|
||||
说明什么情况下才算真正开发完成。
|
||||
|
||||
模板写法:
|
||||
|
||||
- 代码结构符合模板规范
|
||||
- 最小命令可运行
|
||||
- 核心命令可运行
|
||||
- 正式环境可安装
|
||||
- 匠厂中可看到最新版本
|
||||
- 可以在新建任务中实际使用
|
||||
|
||||
示例:
|
||||
什么情况下才算开发完成:
|
||||
|
||||
- 代码结构符合模板规范;`SKILL.md` slug 与 `constants.SKILL_SLUG` 一致
|
||||
- `health`、`version` 命令执行正常
|
||||
- `run` 主流程可运行
|
||||
- 发布后 Gitea 工作流成功
|
||||
- 匠厂技能市场能看到最新版本
|
||||
- skill 可以正常安装
|
||||
- 安装后可在“新建任务”中调用
|
||||
|
||||
**测试与日志相关验收(所有新 skill 必须满足)**:
|
||||
|
||||
- 主命令(如 `run`)在 mock / simulator 档位可重复验证
|
||||
- `python tests/run_tests.py -v` 必跑测试全部通过
|
||||
- 任务日志(task_logs)写入和查询符合预期
|
||||
- 真实联调(如有)已在 tests/integration/ 中验证,且默认套件不包含真实外联
|
||||
- `task_logs` 写入和查询符合 `references/SCHEMA.md`
|
||||
- 真实联调(如有)放在 `tests/integration/`,且默认套件不包含真实外联
|
||||
- 发布后 Gitea 工作流成功;匠厂技能市场可见最新版本;安装后可在“新建任务”中调用
|
||||
|
||||
## 10. 开发注意事项
|
||||
|
||||
说明研发过程中必须特别注意的事项。
|
||||
|
||||
模板写法:
|
||||
|
||||
- 不要修改无关 skill
|
||||
- 不要破坏现有模板规范
|
||||
- 优先遵守目录和分层约定
|
||||
- 不要在 CLI 层堆业务逻辑
|
||||
- 发布前必须先做本地最小验证
|
||||
|
||||
示例:
|
||||
|
||||
- 只允许修改当前 skill 仓库,不要改动其他兄弟项目
|
||||
- 如使用浏览器自动化,优先复用已验证过的定位器和流程
|
||||
- `cli` 只做参数解析,核心逻辑统一放到 `service`
|
||||
- 发布前必须完成本地验证、工作流验证和正式环境安装验证
|
||||
- 只修改当前 skill 仓库,不要改动无关兄弟项目
|
||||
- 先判断四象限类型(`real_browser_rpa` / `real_api` / `simulator_browser_rpa` / `simulator_api`),再读对应 `examples/*/README.md`
|
||||
- `cli` 只做参数解析;核心逻辑在 `service`;兄弟 skill 调用集中封装(见 `ADAPTER.md`)
|
||||
- 发布前完成本地验证、工作流验证和正式环境安装验证
|
||||
|
||||
## 11. 变更记录
|
||||
|
||||
这一节用于记录需求文档本身的变化,不是 git 提交记录的替代,而是给技术人员看“需求范围怎么变了”。
|
||||
|
||||
模板写法:
|
||||
|
||||
| 日期 | 版本 | 变更人 | 变更内容 |
|
||||
|------|------|--------|----------|
|
||||
| 2026-04-13 | v1.0 | 张三 | 初版需求文档 |
|
||||
| 2026-04-14 | v1.1 | 李四 | 增加正式环境验收要求 |
|
||||
| YYYY-MM-DD | v1.0 | `<姓名>` | 初版需求文档 |
|
||||
|
||||
---
|
||||
|
||||
## 建议使用方式
|
||||
|
||||
建议每个新 skill 开发时,按下面顺序使用文档:
|
||||
|
||||
1. 先写 `REQUIREMENTS.md`
|
||||
2. 再按 `DEVELOPMENT.md` 进入开发
|
||||
3. 开发过程中补充 `CLI.md`、`SCHEMA.md`、`RUNTIME.md`、`TESTING.md`
|
||||
4. 发布前回到 `REQUIREMENTS.md` 对照验收标准逐项检查
|
||||
3. 开发过程中补充 `references/CLI.md`、`references/SCHEMA.md` 及 `development/` 技术规范
|
||||
4. 发布前对照第 9 节验收标准逐项检查
|
||||
|
||||
## 最小模板示例
|
||||
|
||||
下面给出一个可直接参考的简化版示例:
|
||||
下面给出一个可直接参考的简化版(复制后替换占位符):
|
||||
|
||||
```md
|
||||
# REQUIREMENTS
|
||||
@@ -291,66 +188,61 @@
|
||||
|
||||
## 2. 业务背景
|
||||
|
||||
采购审计需要将政府采购公告结构化归档;人工复制粘贴效率低,需要可追溯的任务日志。
|
||||
当前用户在 `<业务场景>` 中需要反复处理 `<输入数据>`,人工操作耗时且易错。
|
||||
因此需要开发 `your-skill-slug`,自动完成 `<核心动作>`,输出 `<输出结果>`,并写入 task_logs。
|
||||
|
||||
## 3. 开发目标
|
||||
|
||||
- 完成 `your-skill-slug` 的标准 skill 结构
|
||||
- 支持核心业务批处理 / HTTP 对接主流程
|
||||
- 支持任务日志记录(task_logs)
|
||||
- 解析并校验输入
|
||||
- 通过 adapter 完成 mock / simulator / real 档位动作
|
||||
- 输出结构化结果并写入 task_logs
|
||||
- 支持失败可诊断
|
||||
|
||||
## 4. 功能范围
|
||||
|
||||
- 支持 `health`
|
||||
- 支持 `version`
|
||||
- 支持 `run`
|
||||
- 支持查询任务日志(logs / log-get)
|
||||
- 支持 health / version / run
|
||||
- 支持 logs / log-get
|
||||
|
||||
## 5. 非功能要求
|
||||
|
||||
- 入口统一为 `scripts/main.py`
|
||||
- 保持 UTF-8 输出
|
||||
- 结构符合 skill 模板规范
|
||||
- 入口统一为 scripts/main.py
|
||||
- 保持 UTF-8 输出;结构符合 skill-template
|
||||
|
||||
## 6. 输入输出要求
|
||||
|
||||
### 输入
|
||||
|
||||
- `target_id`
|
||||
- `input_id`
|
||||
- target_id、input_id(按业务定义)
|
||||
|
||||
### 输出
|
||||
|
||||
- 成功结果
|
||||
- 错误信息
|
||||
- 成功 JSON / 摘要
|
||||
- ERROR: 稳定错误码
|
||||
- task_logs 记录
|
||||
|
||||
## 7. 依赖的兄弟技能或外部系统
|
||||
|
||||
- (按需填写兄弟 skill)
|
||||
- 政务公告站点 HTTP API(示例)
|
||||
- `<sibling-skill>`(按需)
|
||||
- `<目标系统>` API 或 sandbox
|
||||
|
||||
## 8. 不在本次范围内的内容
|
||||
|
||||
- 不实现浏览器可视化回放(如需另行立项)
|
||||
- 不实现自动重试
|
||||
- 不实现 `<本次不做>`
|
||||
|
||||
## 9. 验收标准
|
||||
|
||||
- 命令可运行
|
||||
- `python tests/run_tests.py -v` 全部通过
|
||||
- task_logs 写入符合 SCHEMA 约定
|
||||
- 能完成正式环境安装验证
|
||||
- 能在新建任务中使用
|
||||
- 命令可运行;tests/run_tests.py -v 通过
|
||||
- task_logs 符合 SCHEMA
|
||||
- 正式环境安装验证通过
|
||||
|
||||
## 10. 开发注意事项
|
||||
|
||||
- 不修改无关项目
|
||||
- 不引入旧模板结构
|
||||
- 不修改无关项目;不引入旧模板结构
|
||||
|
||||
## 11. 变更记录
|
||||
|
||||
| 日期 | 版本 | 变更人 | 变更内容 |
|
||||
|------|------|--------|----------|
|
||||
| 2026-04-13 | v1.0 | 张三 | 初版 |
|
||||
| YYYY-MM-DD | v1.0 | 张三 | 初版 |
|
||||
```
|
||||
|
||||
@@ -63,11 +63,26 @@
|
||||
|
||||
### 1.2 页面启动标准
|
||||
|
||||
优先级(高 → 低):
|
||||
**`launch_persistent_context` 的 `args` 只能放 Chrome 启动参数**(例如 `--start-maximized`、`--disable-blink-features=AutomationControlled` 等)。
|
||||
|
||||
1. **launch args `start_url`**:浏览器启动即打开目标首页(推荐生产路径)。
|
||||
2. **profile preferences**:作为兜底(例如 homepage / startup URLs)。
|
||||
3. **程序化导航 `page.goto`**:仅最后兜底;强风控站点慎用裸 `goto` 深链。
|
||||
**绝对不要把 `https://...` 这类 URL 放进 `args`。** 否则 Playwright 会报错:
|
||||
|
||||
```
|
||||
BrowserType.launch_persistent_context: Arguments can not specify page to be opened
|
||||
```
|
||||
|
||||
**正确做法(生产路径):**
|
||||
|
||||
1. `launch_persistent_context(user_data_dir=profile_dir, executable_path=chrome, args=chrome_args, ...)`
|
||||
2. `page = await context.new_page()`
|
||||
3. `await page.goto(start_url, wait_until="domcontentloaded", timeout=60000)`
|
||||
|
||||
对强风控站点,如果需要更拟人,可以启动后通过**地址栏输入 / 真实点击进入**目标页,但**仍然不能把 URL 塞进 launch args**。
|
||||
|
||||
完整参考实现见:
|
||||
|
||||
- `examples/real_browser_rpa/README.md`(**开发真实浏览器 RPA 类 skill 时必须先读**)
|
||||
- `examples/real_browser_rpa/scripts/service/browser_session.py`
|
||||
|
||||
**生产路径不要依赖 CDP 接管现有页面**;CDP 仅用于诊断或桌面宿主已打开浏览器的场景。
|
||||
|
||||
@@ -78,7 +93,11 @@
|
||||
- 检测到风控页(URL/DOM 特征)→ 抛 `ERROR:CAPTCHA_NEED_HUMAN`,轮询等待或超时,**不要强行绕过平台安全机制**。
|
||||
- **不要自动操作滑块**。
|
||||
|
||||
> 共享库:`jiangchang_skill_core.rpa.wait_for_captcha_pass`;参考 `scripts/service/example_browser_rpa.py`。
|
||||
> 共享库:`jiangchang_skill_core.rpa.wait_for_captcha_pass`;**真实浏览器 RPA 成功案例**见 `examples/real_browser_rpa/`:
|
||||
>
|
||||
> - 先读 `examples/real_browser_rpa/README.md`
|
||||
> - 再参考 `examples/real_browser_rpa/scripts/service/human_verification.py`
|
||||
> - 再参考 `examples/real_browser_rpa/scripts/service/task_rpa.py`
|
||||
|
||||
### 1.4 安装
|
||||
|
||||
@@ -108,7 +127,31 @@ from jiangchang_skill_core.rpa.stealth import stealth_enabled, STEALTH_INIT_SCRI
|
||||
- `RpaVideoSession` 来自 platform-kit **>= 1.0.14**;ffmpeg、背景音乐、media-assets 由 platform-kit 统一解析;已提供前置/后置缓冲、字幕、TTS 旁白、背景音乐循环、结尾淡出。
|
||||
- `health` 对上述资源做只读诊断,不下载、不修复。
|
||||
|
||||
完整示例见 `scripts/service/example_browser_rpa.py` 与 `scripts/service/example_adapter/sim_rpa.py`。
|
||||
### 1.5 真实浏览器 RPA 示例(必读)
|
||||
|
||||
开发**真实网站 + 浏览器操作 + 登录态/验证码/滚动采集**类 skill 时:
|
||||
|
||||
1. **必须先阅读** `examples/real_browser_rpa/README.md`
|
||||
2. 再参考以下代码:
|
||||
- `examples/real_browser_rpa/scripts/service/browser_session.py` — persistent context 启动
|
||||
- `examples/real_browser_rpa/scripts/service/human_verification.py` — 人工验证等待
|
||||
- `examples/real_browser_rpa/scripts/service/task_rpa.py` — RPA 主流程
|
||||
- `examples/real_browser_rpa/scripts/service/account_client.py` — account-manager CLI 封装
|
||||
|
||||
模板内 adapter 仿真示例(`scripts/service/example_adapter/sim_rpa.py`)仅用于 **adapter 四档骨架**,不能替代真实浏览器 RPA 规范。
|
||||
|
||||
### 1.6 仿真浏览器 RPA 示例(必读)
|
||||
|
||||
开发**自有仿真页面 / sandbox / 可控 DOM 的浏览器 RPA**(表单填写、批量提交、弹窗确认)时:
|
||||
|
||||
1. **必须先阅读** `examples/simulator_browser_rpa/README.md`
|
||||
2. 再参考:
|
||||
- `examples/simulator_browser_rpa/scripts/service/browser_session.py`
|
||||
- `examples/simulator_browser_rpa/scripts/service/adapter/`(base / mock / simulator_rpa / dispatch)
|
||||
- `examples/simulator_browser_rpa/scripts/service/task_service.py`
|
||||
- `examples/simulator_browser_rpa/sandbox/demo_app.html`
|
||||
|
||||
> **先选类型再写代码**:真实第三方网站 → `real_browser_rpa`;自有 sandbox → `simulator_browser_rpa`。不要跨类型照抄 selector 或业务流程。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user