- 状态驱动:遵循"识别 → 操作 → 识别"循环。每次操作必须基于识别结果,禁止假设操作后画面状态。
- 高命中率:扩充
next列表,覆盖当前操作后所有可能画面,力争一次截图命中。 - 避免硬延迟:尽量不用
pre_delay/post_delay/timeout,用中间识别节点或pre_wait_freezes/post_wait_freezes替代。当确实不需要延迟时,显式将rate_limit/pre_delay/post_delay设为 0(协议默认rate_limit=1000ms、pre_delay/post_delay=200ms,省略字段会引入隐式等待)。 - 720p 基准:所有坐标、ROI、图片必须基于 1280×720。
使用 PascalCase,同一任务内以任务名/模块名为前缀。示例:FishNewEntrance、TetrisEntrance、TouchDetect。私有节点以 __ 开头:__ScenePrivateWorldEnterBag。
MaaNTE 使用 v2 格式,recognition 和 action 放入二级字典:
"recognition": {
"type": "TemplateMatch",
"param": {
"template": "path/to/image.png", // 相对 resource/base/image
"roi": [x, y, w, h],
"threshold": 0.7,
"green_mask": true // 可选:跳过 RGB(0,255,0) 区域
}
}- 图片必须从无损原图裁剪并缩放到 720p
order_by: "Score"可按置信度排序
"recognition": {
"type": "OCR",
"param": {
"roi": [x, y, w, h],
"expected": ["完整文本"],
"threshold": 0.5, // 默认 0.3
"only_rec": false // true 时只识别不动作
}
}expected写完整文本。需要跳过 i18n 同步时加// @i18n-skip标记only_rec: true用于 Python 侧处理多结果
"recognition": {
"type": "ColorMatch",
"param": {
"roi": [x, y, w, h],
"method": 40, // RGB 距离
"lower": [r, g, b],
"upper": [r, g, b],
"count": 20, // 最小像素数
"connected": true // 返回连通组件
}
}不做识别,直接执行动作。适用于前一节点已确认状态、不需要重复识别的场景:
"recognition": { "type": "DirectHit" },
"action": { "type": "ClickKey", "param": { "key": 70 } }// And:全部子识别都成功才算命中
"recognition": { "type": "And", "param": { "all_of": ["NodeA", "NodeB"] } }
// Or:任一子识别成功即命中
"recognition": { "type": "Or", "param": { "any_of": ["NodeA", "NodeB"] } }"action": {
"type": "Custom",
"param": {
"custom_action": "auto_make_coffee",
"custom_action_param": { "count": 10 }
}
}custom_action 的值必须与 Python 中 @AgentServer.custom_action("name") 一致。
| 动作 | 关键字段 |
|---|---|
Click |
target(true/节点名/[x,y]/[x,y,w,h]) |
LongPress |
target, duration |
Swipe |
begin, end, duration, end_hold |
ClickKey |
key(虚拟键码) |
Custom |
custom_action, custom_action_param |
DoNothing |
不执行动作 |
StopTask |
停止当前任务 |
按序识别,首个命中的节点执行后成为当前节点。全部超时则任务结束(默认超时 20 秒)。
[JumpBack] — 命中后执行完该节点链,自动返回父节点继续识别 next。适用于处理弹窗、加载等中断场景。
"next": [
"BusinessNode",
"[JumpBack]SceneAnyEnterWorld",
"[JumpBack]SceneClickBlankToExit"
][Anchor] — 动态引用锚点,运行时解析为最后设置该锚点的节点。
"FishNewEntrance": { "anchor": "FishNewRestart" },
// ...
"next": ["[Anchor]FishNewRestart"]限制节点最大命中次数:
"max_hit": 100 // 实现可控循环"focus": {
"Node.Action.Succeeded": "$task_fish_new_focus_got_fish"
}推荐使用 $i18n_key 格式,五种语言文件中定义翻译。详见 i18n。
"on_error": ["TetrisExit"]"post_wait_freezes": {
"time": 200,
"target": [0, 0, 0, 0],
"threshold": 0.95,
"timeout": 20000
}{
"MyTaskEntry": {
"next": [
"MyTaskMainStep",
"[JumpBack]HandlePopup",
"[JumpBack]SceneAnyEnterWorld"
]
}
}// 任务配置
"MyFeature": {
"type": "switch",
"cases": {
"Yes": { "pipeline_override": { "MyNode": { "enabled": true } } },
"No": { "pipeline_override": { "MyNode": { "enabled": false } } }
}
}复杂任务建议拆分为独立目录:
pipeline/WithdrawMoney/
├── WithdrawMoney.json # 主流程节点
└── WithdrawMoneyStatus.json # 辅助识别/动作节点
{ "MyNode": { "recognition": { "type": "TemplateMatch", "param": { "template": "MyTask/button.png", "roi": [100, 200, 300, 100], "threshold": 0.7 } }, "action": { "type": "Click" }, "next": ["NextNode"] } }