从自动化测试到游戏脚本:使用Maafw开发

起因是想用自动化的流程做一些游戏任务,右面发现了MAA相关资源并尝试学习开发一些流程。这里总结一下踩坑和经验。

开发环境搭建

最早是从MaaAssistantArknights/MaaAssistantArknights中脱离的框架,目前用于MAA1999/M9A: 重返未来overflow65537/MAA_SnowBreak等等项目。框架在下文中简称maa或maafw.

官方简介如下:

MaaFramework 是基于图像识别技术、运用 MAA 开发经验去芜存菁、完全重写的新一代自动化黑盒测试框架。低代码的同时仍拥有高扩展性,旨在打造一款丰富、领先、且实用的开源库,助力开发者轻松编写出更好的黑盒测试程序,并推广普及。

推荐vscode+neko-para/maa-support-extension进行开发,也方便使用插件测试。

注意,插件有个maa.agentTimeout设置超时时间,如果你发现连接不上,并且一般都是30秒关闭连接,那就有可能是超时了,可以把时间设置更长一点。

image-20260604165943683

重点知识

官方文档1.1 快速开始 | MaaFramework

一般采用JSON+自定义逻辑扩展。JSON中会通过识别+动作定义节点。常用的动作包括点击,按键等等。

任务流水线协议

/assets/resource下包含资源文件夹,例如image,model以及pipeline.

pipeline中定义任务流水线。3.1 任务流水线(Pipeline)协议 | MaaFramework

一个节点包含节点名称,以及识别行为,后续,以及前后等待时间,识别等待时间和最多进入次数等。

对当前节点的 next 列表进行顺序检测,依次尝试识别每个子节点

若本轮均未命中,则继续下一轮检测;直到超时或有节点命中

当检测到某个子节点匹配成功时,立即终止后续节点检测。执行匹配节点的 action 定义的操作

从entry开始,针对第一个节点开始识别并进行动作,若该节点识别命中,并且动作成功,进入next列表。在next列表中循环检测,如果一个子节点识别命中则进入,如果动作成功进入其next列表重复流程,如果失败进入该节点on_error列表。

如果第一个节点识别命中但动作失败同样进入on_error列表,如果识别失败直接终止。

如果某个节点的next列表识别超时,则进入当前节点的on_error列表。如果全都走了一遍未命中且超时则终止。

设置timeout控制当前节点的 next 列表识别的超时时间

当满足以下任意条件时,任务流程终止:

  • 当前节点的 next 列表为空(若存在 [JumpBack] 回跳点,会先回跳)
  • 当前节点的 next 列表未命中且超时
  • 外部调用 post_stop 或执行了 StopTask 动作

核心:识别成功才算进入,如果一个节点下的next列表识别超时则走on_error(但next中节点还未识别完),如果都未命中且超时则退出

识别recognition类型包括默认 DirectHit
可选的值:DirectHit | TemplateMatch | FeatureMatch | ColorMatch | OCR | NeuralNetworkClassify | NeuralNetworkDetect | And | Or | Custom

动作action包括默认 DoNothing
可选的值:DoNothing | Click | LongPress | Swipe | MultiSwipe | Scroll | ClickKey | LongPressKey | InputText | StartApp | StopApp | StopTask | Command | Shell | Screencap | Custom

next接下来要执行的节点列表。可选,默认空。
按顺序识别 next 中的每个节点,只执行第一个识别到的

on_error本节点内的 next 列表中没有任何节点命中并且循环识别超时,或动作执行失败后,接下来会执行该列表中的节点。可选,默认空。

这里存在一点疑惑,next 列表中没有任何节点命中并且循环识别超时到底是走on_error列表还是直接中止

rate_limit: uint
识别速率限制,单位毫秒。可选,默认 1000 。
每轮识别最低消耗 rate_limit 毫秒,不足的时间将会 sleep 等待。

timeout: int
当前节点next 列表识别的超时时间,毫秒。可选,默认 20 * 1000(20 秒)

repeat: uint
动作重复执行次数。可选,默认 1 ,即不重复。

max_hit: uint
该节点最多可被识别成功多少次。可选,默认 UINT_MAX ,即无限制。
若超过该次数,其他 node 的 next 列表中的该 node 会被跳过,既不会被识别也不会被执行

anchor: string | list | object
锚点名称。可选,默认空。
当节点识别命中并执行动作后,会将该锚点名设置为对应的节点(无论动作成功或失败)。多个节点可设置同一个锚点名,后执行的会覆盖先执行的。

支持三种格式:

  • 字符串"anchor": "MyAnchor" - 将锚点设置为当前节点

  • 字符串数组"anchor": ["A", "B"] - 将多个锚点都设置为当前节点

  • 对象 💡 v5.7"anchor": {"A": "TargetNode", "B": ""} - 将锚点 A 设置为 TargetNode,锚点 B 清除(空字符串表示清除该锚点)

    nexton_error 中可通过 [Anchor] 属性引用该锚点,运行时会解析为最后设置该锚点的节点。如果引用的锚点未设置或已被清除,该节点将被跳过(不会执行)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"NodeA": {
"recognition": {
"type": "TemplateMatch",
"param": {
// 识别相关字段放入 recognition.param 中,键和值均无变化
"template": "A.png",
"roi": [100, 100, 10, 10]
}
},
"action": {
"type": "Click",
"param": {
// 动作相关字段放入 action.param 中,键和值均无变化
"target": "XXX"
}
},
// 非 recognition 和 action 的字段与 v1 无变化
"next": ["NodeB"],
"pre_delay": 1000,
// ...
}
}

类型放入 type 字段,其余参数放入 param 字段中

PIV2协议

所谓 ProjectInterface,即 MaaFramework 的一个标准化的项目结构声明,该声明目前包含 interface.json 一个文件。通过定义 PI,你可以使用 MaaFramework 的各种衍生工具。因此,即使你打算纯粹依靠通用编程语言集成,也建议定义包含基础信息的 PI。

一般可以通过PI定义项目信息以及UI展示。一般的UI项目会展示任务信息以及一些参数。3.3 Project Interface V2 协议 | MaaFramework

在已有应用中添加节点/任务

个人开发基于MAA的应用

可以使用MaaXYZ/MaaPracticeBoilerplate: MaaFramework 通用项目模板

以及参考资料how_to_develop

目前maafw提供了python,go,nodejs,c#以及rust等语言的binding,可以结合这些框架开发一些客户端,目前已经有MaaXYZ/MFAAvalonia: 基于 Avalonia 的 MAAFramework 通用 GUI 项目MistEO/MXU: MaaFramework Next UI等通用UI

相关资料

  1. MaaAssistantArknights/MaaAssistantArknights: 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients.
  2. MaaFramework
  3. 开发指南 | 开发文档 | MAA 文档站
  4. MaaHub
  5. MAA1999/M9A: 重返未来:1999 小助手 | Assistant For Reverse: 1999
  6. MistEO/MXU: MaaFramework Next UI
  7. 1bananachicken/MaaNTE: MaaNTE. Nevertheless to Everless automatic assistant 异环小助手
  8. MaaXYZ/MaaFramework: 基于图像识别的自动化黑盒测试框架 | An automation black-box testing framework based on image recognition
-------------本文结束感谢您的阅读-------------
感谢阅读.

欢迎关注我的其它发布渠道