MaaAssistantArknights 自动公招(Auto Recruitment)完全指南:从界面配置到源码实现
【免费下载链接】MaaAssistantArknights《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients.项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights
本文围绕 MaaAssistantArknights(MAA)《明日方舟》小助手中的“自动公招”功能展开,系统讲解其功能定位、界面配置项含义、底层执行流程与参数接口。读完本文,你将能够独立配置自动公招任务(包括加急许可、最大招募次数、3 星 Tag 倾向、保留指定词条与数据上报),并能结合源码理解 MAA 是如何完成“识别标签 → 组合计算 → 刷新/确认 → 数据上报”这一完整链路的。本文以 docs/en-us/manual/introduction/recruit.md 为核心依据,并辅以 MaaCore 与 MaaWpfGui 的实际实现代码进行印证。
一、功能定位:自动公招 ≠ 公招识别
在使用该功能前必须明确一个关键区分:自动公招(Auto Recruitment)与公招识别(Recruitment Recognition)是两个完全不同的功能。
- 自动公招:作为任务队列中的一个“日常任务”运行,它会真实地在游戏内自动打开公开招募界面、识别标签、计算组合、设置时限、选择/确认标签,并完成招募,甚至可以配合加急许可批量消耗招募券。
- 公招识别:属于工具箱类功能,仅对用户手动提供或截取的公招界面图片进行“计算器”式的识别与分析,返回可能的干员组合与星级结论,不会在游戏内进行任何点击操作。
从源码也能印证这一点:AutoRecruitTask::_run()中首先判断is_calc_only_task(),如果是纯计算任务(小工具中的公招计算),则只返回recruit_calc_task().success的计算结果而不执行点击确认(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。也就是说,两条功能路径共用同一套标签识别与组合计算逻辑,只是“是否真正操作游戏”不同。
二、自动公招的核心能力
根据官方手册(docs/en-us/manual/introduction/recruit.md),自动公招具备以下核心能力:
- 支持自动使用加急许可:开启后 MAA 会在识别到“开始招募”按钮后调用
RecruitNow流程立即结束当前招募(对应recruit_now()调用的RecruitNow任务,见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 支持设置单次任务最大招募次数:默认值为 4(见 src/MaaWpfGui/Configuration/Single/MaaTask/RecruitTask.cs),主循环
while (m_cur_times < m_max_times)会严格按照该上限控制本轮招募次数。 - 可配合加急许可一次性刷光招募券:加急许可开启后,每次招募完成后会立即点击
RecruitNow再次开始下一轮,直到招募次数用尽或招募券不足。 - 关键标签弹窗通知:当识别到保留词条(preserved tags)、5 星标签或 6 星标签时,MAA 会弹出通知提示用户。这在源码中表现为回调消息
RecruitSpecialTag(识别到“高级资深干员/资深干员”时发出)与RecruitPreservedTag(识别到保留词条时发出),WPF 客户端据此触发 Toast 通知。 - 公招数据自动上报:刷新招募标签时,自动将标签数据上报至企鹅物流数据统计(Penguin Statistics)与一图流(Yituliu)两个数据站点,用于反哺社区大数据统计。
三、界面配置与高级设置详解
3.1 基础配置项
- 自动使用加急许可(Use Expedited Plans):对应
RecruitTask.UseExpedited配置项。开启后 MAA 会在每次“开始招募”后立即点击加急,缩短单轮耗时。 - 单轮最大招募次数(Max Times):对应
MaxTimes,默认 4。该值同时会作为ExpeditedTimes(加急许可使用次数上限)传入任务参数(见 src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RecruitSettingsUserControlModel.cs)。
3.2 高级设置
官方手册将高级设置划分为两组核心语义:
自动确认 / 手动确认:
自动确认(Auto confirm)意味着 MAA 会自动选择标签并执行招募;手动确认(Manual confirm)意味着 MAA 只完成识别与计算,不自动选标签、不确认招募。 在源码层面,这一语义由两个参数共同实现:select(会去点击标签的干员等级列表)与confirm(会去点击确认的干员等级列表)。WPF 端序列化时,勾选“自动确认 3 星”会向ConfirmList加入3,勾选“自动确认 4 星”会同时向SelectList与ConfirmList加入4,5/6 星同理(见 src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RecruitSettingsUserControlModel.cs)。
3 星 Tag 时的 Tag 倾向(Preference for 3★ Tags):开启后可在预设列表中挑选首选的 3 星 Tag(如“近战位”“远程位”“先锋干员”“费用回复”“输出”“生存”等,完整列表见 src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RecruitSettingsUserControlModel.cs)。这些首选 Tag 通过
first_tags参数传给核心层,仅在组合星级为 3 星时参与标签选择(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。匹配采用“子串包含”方式:只要识别出的 Tag 名称包含首选 Tag 文本即命中。保留指定词条(Preserve selected tags):开启后可选择一个或多个需要保留的 Tag(默认预置“支援机械”,见 src/MaaWpfGui/Configuration/Single/MaaTask/RecruitTask.cs)。
3.3 保留词条的槽位跳过机制
官方手册特别强调:当识别到任一保留词条时,MAA 会跳过当前公招槽位并保留该栏位,不会继续确认本次招募。
源码中这一逻辑的实现路径非常清晰:
- 识别出的标签集合与
m_preserve_tags(保留词条列表)做交集判断,命中则置has_skip_tag = true并记录preserved_tag(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 在
recruit_calc_task的返回值中体现为preserved_tag_skip(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 recruit_one收到for_preserved_tags_skip后,将该槽位加入m_force_skipped集合,点击“返回”按钮,不消耗招募次数地跳过该槽位(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。
“高级资深干员”与“资深干员”两个特殊标签同样受保留词条逻辑约束:若它们被列入保留词条,即使出现也不会自动确认;否则会触发RecruitSpecialTag通知(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。
另外需要注意的是,旧版参数skip_robot已在 6.11.0 版本中弃用,请改用preserve_tags(等价写法为preserve_tags = ["支援机械"],见 src/MaaCore/Task/Interface/RecruitTask.cpp)。
四、多 Tag 策略(Extra Tags Mode)
界面中的“多 Tag 策略”对应核心参数extra_tags_mode,可选值如下(定义于 src/MaaWpfGui/Models/AsstTasks/AsstRecruitTask.cs):
| 取值 | 语义 | 实现逻辑 |
|---|---|---|
0 | 默认不选择额外 Tag(Default No Extra Tags) | 只选择最优组合所需的 Tag,见get_select_tags中的NoExtra分支(src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp) |
1 | 选满至 3 个 Tag(Select Extra Tags) | 依次遍历所有组合的 Tag 去重填充,直到选中 3 个(src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp) |
2 | 只选 4 星以上稀有 Tag,能选多少选多少(Select Extra Only Rare Tags) | 仅当最优组合星级大于 3 时生效,从高到低按组合整体取舍,避免凑出低价值 Tag(src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp) |
核心层在解析参数时会校验取值合法性,遇到未知值自动回退为NoExtra(见 src/MaaCore/Task/Interface/RecruitTask.cpp)。
五、各星级招募时限(Recruitment Time)
- 3 星 / 4 星:可在界面中独立设置小时与分钟,底层存储为分钟数,取值范围被限制在
60 ~ 540(即 1 小时到 9 小时),并以 10 分钟为粒度取整;非法输入会自动纠正(见 src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RecruitSettingsUserControlModel.cs)。核心层默认值为 9 小时(540 分钟),并用std::clamp限定在 60~540 分钟区间(见 src/MaaCore/Task/Interface/RecruitTask.cpp)。 - 5 星 / 6 星:招募时间固定为 9:00(540 分钟),界面不可修改,仅作为配置文件项存在(见 src/MaaWpfGui/Models/AsstTasks/AsstRecruitTask.cs)。
设置时限时,MAA 会依据目标时间计算“时/分递减按钮”的点击次数(先点小时递减,再点分钟递减,见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp),随后通过check_timer()用 OCR 校验倒计时文本是否符合预期,防止因点击失败导致时限设置错误(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。
六、3 星标签的刷新策略
- 无倾向 Tag 时刷新 3 星(Refresh Level 3):对应
refresh参数。当识别结果中最优组合星级为 3 时,MAA 会点击刷新按钮重新抽取标签,刷新存在上限(refresh_limit = 3,分析重试上限为 5 次),达到上限后停止本轮(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 无招聘许可仍然刷新(Force Refresh):对应
force_refresh参数,默认开启。当招聘许可耗尽(m_has_permit == false)时,只要界面上还有刷新按钮就继续尝试刷新,否则提前结束任务(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。
刷新触发的严格条件是:m_need_refresh && m_has_refresh && !has_special_tag && !has_skip_tag && final_combination.min_level == 3——即必须没有 5 星以上特殊标签、没有保留词条、且最优组合仅为 3 星(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。
七、数据上报:企鹅物流与一图流
官方手册说明:公招刷新时会自动将公招标签数据上传至企鹅物流与一图流两个数据统计站点。从源码看,该行为由upload_result()统一分发(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp):
- 企鹅物流上报:仅对“干净槽位”(本任务开始后尚未上报过的槽位)执行,避免重复上报污染数据(
m_dirty_slots机制,见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。请求体包含server、stageId = "recruit"及每个标签作为NORMAL_DROP的掉落条目,并携带authorization: PenguinID <id>请求头与User-Agent: MaaAssistantArknights/<版本>(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 一图流上报:请求体包含
server、uuid(一图流回报 ID)以及完整的组合计算结果(result、level等),通过ReportDataTask发送(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 服务器参数:
server默认"CN",可选CN / US / JP / KR,直接影响上报数据归属的服务器(见 src/MaaWpfGui/Models/AsstTasks/AsstRecruitTask.cs)。
八、源码级执行流程
自动公招的完整执行链路由 RecruitTask.cpp(接口层)与 AutoRecruitTask.cpp(实现层)构成。接口层负责解析 JSON 参数并装配到AutoRecruitTask(含重试次数 3,见 src/MaaCore/Task/Interface/RecruitTask.cpp),实现层按以下流程运行:
- 进入公招界面:执行
RecruitBegin任务(recruit_begin())。 - 领取已完成招募:
hire_all()用MultiMatcher查找蓝色“招聘”按钮并逐一领取,同时将这些槽位标记为“干净槽位”(m_dirty_slots.erase(...)),为后续上报做准备(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 循环处理每个可招募槽位:通过 OCR 任务
StartRecruit识别“开始招募”按钮(start_recruit_analyze),跳过已强制跳过的槽位,进入recruit_one(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 单槽位处理
recruit_one(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp):- 点击“开始招募”打开槽位;
- 调用
recruit_calc_task完成识别与计算; - 按结果分流:保留词条/特殊标签 →
skipped(记入m_force_skipped,不消耗次数);识别失败 →failed(计数m_slot_fail,连续失败 3 次终止本轮);正常 → 校验时限后确认招募。
- 确认与加急:
confirm()执行RecruitConfirm(重试上限 5 次,见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp);开启加急时每次确认后执行recruit_now()(RecruitNow任务)立即开下一轮,并处理“加急许可耗尽”“误触右下角槽位”等边界情况(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。 - 循环结束条件:达到
m_max_times、无可用开始按钮、招募许可耗尽且不允许继续刷新、或槽位失败超限,任一满足即结束。
8.1 标签组合计算(recruit_calc)
recruit_calc::get_all_combs()实现了全组合枚举(src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp):
- 对每个标签求单标签组合,再两两、三三组合,得到所有可行组合;
- 每个组合记录可覆盖干员列表(
opers)、最低星级(min_level)、最高星级(max_level)与平均星级(avg_level); - 若组合中不含“高级资深干员”标签,则剔除其中的 6 星干员(防止无锁船词条却点出 6 星预期)。
排序策略按优先级依次为:含特殊标签的组合优先 → 最低星级高者优先 → 最高星级高者优先 → 平均星级高者优先 → Tag 数量少者优先(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。最终取排序后的第一个组合作为最优解,并将完整结果列表通过RecruitResult回调消息输出(含每个组合的标签、干员与星级)。
8.2 图像识别输入
标签识别由 RecruitImageAnalyzer 完成,它一次性输出四类信息:
get_tags_result():识别的中文标签文本列表;get_hour_decrement_rect()/get_minute_decrement_rect():时限设置中的“小时/分钟递减按钮”位置;get_refresh_rect():刷新按钮位置;get_permit_rect():招聘许可区域(用于判断许可是否耗尽)。
该分析器不允许外部设置 ROI,标签数必须等于配置中的标准数量(RecruitConfig::CorrectNumberOfTags)才会继续处理(见 src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp)。
九、接口参数速查(AsstRecruitTask)
对希望以编程方式集成该功能的开发者,WPF 端通过 AsstRecruitTask.cs 序列化为如下 JSON 参数(Serialize()输出,见该文件 L143-L186):
{ "refresh": false, "force_refresh": true, "select": [4, 5, 6], "confirm": [3, 4, 5, 6], "times": 4, "set_time": true, "expedite": true, "expedite_times": 4, "extra_tags_mode": 0, "first_tags": [], "preserve_tags": ["支援机械"], "recruitment_time": { "3": 540, "4": 540, "5": 540, "6": 540 }, "report_to_penguin": true, "penguin_id": "", "report_to_yituliu": true, "yituliu_id": "", "server": "CN" }关键参数说明:
select/confirm:必选,整数数组。select表示会点击标签的星级,confirm表示会点击确认的星级;若仅做公招计算可传空数组。times:招募次数,默认0(0 表示不限制/仅计算)。set_time:是否设置招募时限,默认true。expedite:是否使用加急许可,默认false;开启时需一并提供expedite_times。preserve_tags:保留词条列表,命中即跳过槽位。first_tags:3 星首选 Tag 列表。recruitment_time:按星级区分的时限(分钟)。report_to_penguin/report_to_yituliu:是否上报两个数据站点,开启时才需要对应的penguin_id/yituliu_id。server:服务器标识,可选CN / US / JP / KR,默认CN。
参数解析的权威实现位于 src/MaaCore/Task/Interface/RecruitTask.cpp,其严格要求select与confirm必须存在且为数字数组,否则任务参数设置失败。
十、使用建议与注意事项
- 保留词条与手动确认组合使用:将“支援机械”等稀有词条加入保留列表,MAA 会跳过对应槽位并弹窗提醒,适合不想错过特殊词条的玩家;若希望完全由自己决定,可同时关闭 3/4/5 星的自动确认。
- 加急许可与次数上限配合:设置合理的
times上限并开启加急,可在一次任务中快速清空招募券,同时避免误用过多加急许可。 - 数据上报隐私:企鹅物流与一图流上报默认可在设置中开关;上报会携带
server、标签及回报 ID,无需回报 ID 也能匿名上报,但建议按需填写以获得更完整的个人统计。 - 保留词条参数迁移:旧参数
skip_robot已弃用,若你基于旧版接口开发,请迁移为preserve_tags: ["支援机械"]。 - 与公招识别的区别:如需“只看结果不动游戏”,请使用工具箱中的公招识别功能,而非自动公招任务。
综上,MAA 的自动公招是一个“视觉识别 + 组合算法 + 自动化操作 + 数据上报”四位一体的完整功能,其核心价值在于将繁琐的公开招募日常完全托管,同时通过保留词条与通知机制把关键决策权保留给玩家。
【免费下载链接】MaaAssistantArknights《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients.项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考