|
|
@@ -0,0 +1,234 @@
|
|
|
+# 工作流语法
|
|
|
+
|
|
|
+## 基本结构
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "variables": {},
|
|
|
+ "execute": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 语法分层
|
|
|
+
|
|
|
+- **基础语法**:`schedule`、`if`、`while`
|
|
|
+- **基础 action**:`adb`(通过 method 区分)
|
|
|
+- **扩展标签(Func)**:`src/pages/processing/func/` 目录下的脚本文件名即为标签名
|
|
|
+
|
|
|
+## 定时执行(schedule)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "schedule",
|
|
|
+ "condition": {
|
|
|
+ "interval": "1s",
|
|
|
+ "repeat": -1
|
|
|
+ },
|
|
|
+ "interval": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+- `interval`: 执行间隔("1s", "2m", "3h")
|
|
|
+- `repeat`: 重复次数(`-1` 表示无限循环)
|
|
|
+
|
|
|
+## ADB操作(adb)
|
|
|
+
|
|
|
+统一格式:
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "adb",
|
|
|
+ "method": "input|click|locate|swipe|scroll|press|string-press",
|
|
|
+ "inVars": [],
|
|
|
+ "outVars": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+| method | 说明 | inVars |
|
|
|
+|--------|------|--------|
|
|
|
+| `input` | 输入文本 | `[0]`: 文本内容 |
|
|
|
+| `click` | 点击 | `[0]`: 位置坐标(字符串格式:`"{\"x\":123,\"y\":456}"` 或 `"123,456"`) |
|
|
|
+| `locate` | 定位 | `[0]`: 图片/文字,`outVars[0]`: 保存位置 |
|
|
|
+| `swipe` | 滑动 | `[0]`: 方向(up-down/down-up/left-right/right-left) |
|
|
|
+| `scroll` | 滚动 | `[0]`: 方向(up/down) |
|
|
|
+| `press` | 图像匹配并点击 | `[0]`: 图片路径 |
|
|
|
+| `string-press` | 文字识别并点击 | `[0]`: 文字内容 |
|
|
|
+
|
|
|
+## 条件判断(if)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "if",
|
|
|
+ "condition": "{变量} == '值'",
|
|
|
+ "ture": [],
|
|
|
+ "false": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+支持操作符:`==` `!=` `>` `<` `>=` `<=`
|
|
|
+
|
|
|
+### 条件判断示例
|
|
|
+
|
|
|
+**数值比较:**
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "if",
|
|
|
+ "condition": "{count} > 5",
|
|
|
+ "ture": [{"type": "echo", "value": "count大于5"}],
|
|
|
+ "false": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**字符串比较:**
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "if",
|
|
|
+ "condition": "{message} == \"hello\"",
|
|
|
+ "ture": [{"type": "echo", "value": "消息是hello"}],
|
|
|
+ "false": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**布尔值判断:**
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "if",
|
|
|
+ "condition": "{isReady} == true",
|
|
|
+ "ture": [{"type": "echo", "value": "已准备好"}],
|
|
|
+ "false": [{"type": "echo", "value": "未准备好"}]
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+或直接使用布尔变量:
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "if",
|
|
|
+ "condition": "{isReady}",
|
|
|
+ "ture": [{"type": "echo", "value": "已准备好"}],
|
|
|
+ "false": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 循环(while)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "while",
|
|
|
+ "condition": "{变量} > 0",
|
|
|
+ "ture": []
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 注意:`ture` 是 `body` 的别名。
|
|
|
+
|
|
|
+## 内置操作
|
|
|
+
|
|
|
+### 延迟(delay)
|
|
|
+```json
|
|
|
+{ "type": "delay", "value": "2s" }
|
|
|
+```
|
|
|
+
|
|
|
+### 设置变量(set)
|
|
|
+```json
|
|
|
+{ "type": "set", "variable": "{name}", "value": "value" }
|
|
|
+```
|
|
|
+
|
|
|
+### 打印信息(echo)
|
|
|
+```json
|
|
|
+{ "type": "echo", "value": "当前消息: {{lastMessage}}" }
|
|
|
+```
|
|
|
+
|
|
|
+或使用 `inVars`:
|
|
|
+```json
|
|
|
+{ "type": "echo", "inVars": ["{lastMessage}", "{lastRole}"] }
|
|
|
+```
|
|
|
+
|
|
|
+- `value`: 直接文本,支持 `{{variable}}` 格式的变量替换(双花括号用于字符串拼接)
|
|
|
+- `inVars`: 变量名数组,输出所有变量的值
|
|
|
+
|
|
|
+> 注意:`log` 标签已废弃,请使用 `echo` 标签。
|
|
|
+
|
|
|
+### 随机数(random)
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "random",
|
|
|
+ "inVars": ["1", "100"],
|
|
|
+ "outVars": ["{randomNum}"]
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+- `inVars[0]`: 最小值(字符串格式的数字或变量引用)
|
|
|
+- `inVars[1]`: 最大值(字符串格式的数字或变量引用)
|
|
|
+- `outVars[0]`: 输出变量(**`number` 类型**,可以是整数或小数)
|
|
|
+
|
|
|
+**传统格式(已过时,建议使用上述格式):**
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "random",
|
|
|
+ "variable": "num",
|
|
|
+ "min": 1,
|
|
|
+ "max": 100,
|
|
|
+ "integer": true
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 变量
|
|
|
+
|
|
|
+- 定义:`"variables": {"name": "value"}`
|
|
|
+- 使用:`"{name}"` 在字段中引用
|
|
|
+- 保存:`"outVars": ["{name}"]` 或 `"variable": "{name}"`
|
|
|
+- 类型:支持三种数据类型:
|
|
|
+ - **`number`**:数值类型(整数或小数),例如:`1`、`3.14`、`-5.2`
|
|
|
+ - **`string`**:字符串类型,例如:`"hello"`、`""`
|
|
|
+ - **`bool`**:布尔类型,只能是 `true` 或 `false`(不是字符串)
|
|
|
+
|
|
|
+### 变量类型说明
|
|
|
+- 变量的类型由其初始值自动推断:
|
|
|
+ - 如果初始值是数字(如 `1`、`3.14`),类型为 `number`
|
|
|
+ - 如果初始值是字符串(如 `"text"`、`""`),类型为 `string`
|
|
|
+ - 如果初始值是布尔值(如 `true`、`false`),类型为 `bool`
|
|
|
+- 示例:
|
|
|
+ ```json
|
|
|
+ {
|
|
|
+ "variables": {
|
|
|
+ "count": 0, // number 类型
|
|
|
+ "message": "", // string 类型
|
|
|
+ "isReady": false // bool 类型
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ```
|
|
|
+
|
|
|
+## 时间格式
|
|
|
+
|
|
|
+- 间隔:`"1s"`, `"2m"`, `"3h"`
|
|
|
+- 日期:`"2026/1/14 01:21"`
|
|
|
+- 时间:`"09:00"`
|
|
|
+
|
|
|
+## 扩展标签
|
|
|
+
|
|
|
+扩展标签由 `src/pages/processing/func/` 目录下的脚本文件决定,每个脚本文件名即为标签名。
|
|
|
+
|
|
|
+常用标签:
|
|
|
+- `ocr-chat`: OCR识别对话内容
|
|
|
+ - `inVars`: `[好友RGB颜色, 我的RGB颜色, 区域坐标]`(RGB格式:`"(r,g,b)"`,区域坐标:JSON字符串)
|
|
|
+ - `outVars`: `[聊天记录变量]`(输出 chat-history.txt 格式的JSON字符串)
|
|
|
+- `read-last-message`: 读取最后一条消息(输出文本和发送者角色)
|
|
|
+- `smart-chat-append`: 智能合并历史聊天记录和当前聊天记录,自动检测并去除连续重合部分后返回新的聊天记录字符串
|
|
|
+ - `inVars`: `[历史记录, 当前记录]`
|
|
|
+ - `outVars`: `[合并后的记录]`
|
|
|
+- `read-txt`: 读取文本文件内容
|
|
|
+ - `inVars`: `[文件路径]`(相对于工作流目录,如 `"history/chat-history.txt"`)
|
|
|
+ - `outVars`: `[文件内容变量]`
|
|
|
+- `save-txt`: 保存字符串为文本文件
|
|
|
+ - `inVars`: `[内容, 文件路径]`(路径相对于工作流目录)
|
|
|
+ - `outVars`: `[]`
|
|
|
+- `image-center-location`: 图像中心点定位
|
|
|
+ - `inVars`: `[模板图片路径]`(相对于工作流目录的 resources 文件夹)
|
|
|
+ - `outVars`: `[位置坐标变量]`(输出JSON字符串格式:`{"x":123,"y":456}`)
|
|
|
+- `image-region-location`: 图像区域定位(在完整截图中查找区域图片的位置)
|
|
|
+ - `inVars`: `[截图路径, 区域图片路径]`(都相对于工作流目录的 resources 文件夹,如 `"ScreenShot.jpg"` 和 `"ChatArea.png"`)
|
|
|
+ - `outVars`: `[区域坐标变量]`(返回四个顶点坐标:`{topLeft: {x, y}, topRight: {x, y}, bottomLeft: {x, y}, bottomRight: {x, y}}`)
|
|
|
+ - 注意:此标签**不主动截图**,使用 `resources/` 文件夹下已有的截图文件进行匹配
|
|
|
+- `image-area-cropping`: 图像区域裁剪(从当前屏幕截图裁剪指定区域)
|
|
|
+ - `inVars`: `[区域坐标, 保存路径]`(区域坐标:JSON字符串格式,保存路径相对于工作流目录的 history 文件夹)
|
|
|
+ - `outVars`: `[]`
|
|
|
+ - 功能:从主进程缓存获取最新截图,保存到 `history/ScreenShot.jpg`,然后根据区域坐标裁剪并保存到指定路径
|