ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

阴阳师自动化助手:基于图像识别与UI自动化的挂机方案

阴阳师自动化助手:基于图像识别与UI自动化的挂机方案 各位阴阳师玩家尤其是每天下班还要清日常的“肝帝”应该都有过这种体验御魂本刷到手指抽筋、觉醒材料反复进出、结界突破一个个点、悬赏封印还得看脸等碎片……一天下来少说半小时到一个小时全耗在各种重复点击上。我自己早几年就动了“搞个自动化助手”的念头后来把整套方案跑通之后每天上线只需要手动点点登录、确认几个特殊弹窗剩下的事全部交给脚本。这篇就把这套“阴阳师全自动任务助手”的完整思路和落地过程整理出来内容包括方案选型、图像识别、任务编排、异常处理等核心环节适合有一定编程基础、想自己折腾脚本的玩家参考。这个项目本质上是一个游戏UI自动化挂机方案核心思路是用脚本模拟点击和滑动配合图像识别判断当前游戏界面状态再按预置的任务流程循环执行。它能做的具体事情包括自动刷御魂、自动刷觉醒、自动打结界突破、自动完成部分悬赏封印以及定时领取结界卡收益等。整个方案只需要一台电脑Windows/Linux/macOS均可和安卓模拟器或实体安卓手机不需要对游戏客户端做任何注入或修改安全性上相对可控。1. 项目拆解阴阳师日常任务的痛与自动化切入点1.1 游戏日常任务到底有多繁琐先认真算一笔账。阴阳师日常里最耗时间的不是那些需要思考的副本而是大量机械式重复操作。每天需要完成的固定项目大概有御魂副本一天至少刷几十次每次进本、挑战、等待结算、点击“再次挑战”循环往复。觉醒材料副本同样需要反复刷而且不同式神觉醒材料不同选择入口也不一样。结界突破9个对手一轮需要逐个点击、进入战斗、结算。悬赏封印每天有3个悬赏任务击杀指定怪物后还要回去交任务。结界卡结界卡需要定时收取、一键替换、补充结界。斗技低保 / 协同斗技如果追求分段也需要定时上场。仔细看就会发现这些任务的共同特征非常明显操作路径固定、界面元素位置稳定、不需要实时决策。也就是说人脑在其中的参与度极低本质上就是“看到按钮A点击按钮A看到按钮B点击按钮B”这种条件反射。而这类工作恰恰是自动化脚本最擅长替代的场景。1.2 自动化的核心切入点在哪里市面上的脚本工具并不少但很多要么不稳定、要么容易被检测。要自己写一套可用的方案切入点必须选准。我最终确定的切入点是**“图像识别 固定坐标点击”混合策略**而不是纯坐标模拟。原因是阴阳师游戏的界面分辨率虽然有固定布局但不同模拟器、不同分辨率下按钮的位置会有偏移。如果用纯坐标脚本换个设备就全废了。而图像识别则可以根据截图内容动态匹配目标按钮位置对设备差异的容忍度要高得多。具体来说固定坐标点击用于那些绝对坐标不变的情况比如进入副本后屏幕中心偏下的“挑战”按钮在不同分辨率下能用百分比坐标近似覆盖。图像识别匹配用于判断当前处于什么界面状态比如通过识别“挑战”按钮、结算页面的“再次挑战”、弹窗中的“确认”等关键特征图来决定下一步动作。两条腿走路的好处是识别状态用图像点击执行用坐标既保证了准确性也减少了图像匹配次数整体速度更快、CPU占用更少。2. 方案选型为什么走UI自动化图像识别这条路2.1 常见的挂机方案对比动手之前我把市面上几种方案做了对比。先说结论再逐个分析。方案类型原理优点缺点风险等级模拟器自带脚本录制录制点击回放上手快、无需代码分辨率变了就失效、无界面状态判断低PC端改内存/数据包修改客户端数据效率极高、功能多极易被封号、技术门槛高高外接硬件点击器物理模拟点击不涉及系统层只能执行固定动作序列、无法识图低UI自动化图像识别手机端自动化引擎 截图匹配稳定性好、可判断界面、跨分辨率需要写代码、初期成本高低综合对比下来最稳妥的路线就是UI自动化框架 图像识别。它的核心优势在于不碰游戏进程内存、不修改游戏文件、不注入代码只是从UI层模拟人的操作。这相当于把一个人坐在屏幕前点击的过程用程序复现出来对游戏本身的侵入几乎为零。2.2 技术栈选择思路技术栈上我最终选了两套方案配合使用一套用于Windows PC端控制模拟器一套用于直接控制实体手机。第一套是Appium OpenCV运行在Windows或者macOS上。Appium是成熟的移动UI自动化框架支持安卓模拟器和真机通过ADB发送触摸事件和滑动事件。OpenCV负责图像匹配核心函数是matchTemplate用于在截图里查找目标按钮的位置。第二套是uiautomator2Python版 PIL这套更轻量。uiautomator2走的是安卓系统的UIAutomator接口执行速度比Appium快很多而且部署简单——手机端装一个ATX代理应用电脑端用pip安装即可。PIL负责截图处理必要时配合OpenCV做模板匹配。为什么不用Playwright或Selenium这类纯Web自动化工具因为阴阳师是原生手游应用不是Web页面这类工具压根进不去游戏环境。至于tsmaster、Appium这些专业测试平台功能强大但部署偏重单人做游戏脚本没必要上那么重的框架。2.3 整体架构设计整个助手的运行逻辑是一个有限状态机。每个任务组件都维护一个当前状态比如“进入副本前置页”和“战斗结算页”是两个不同状态状态之间通过图像识别结果驱动切换。模块划分是这样的截图模块负责定时截取当前屏幕画面。识别模块用OpenCV模板匹配当前画面中的关键按钮输出目标坐标。点击模块通过ADB或uiautomator2发送点击指令。流程控制模块维护任务队列按优先级执行御魂、觉醒、结界突破等任务。异常处理模块超时重试、意外弹窗处理、死亡判断、体力不足退出等。举个实际例子刷御魂的任务流程是这样的截图识别“探索”按钮。点击探索等待界面加载。截图识别“御魂”入口。点击进入选择第几层通常是十层。点击“挑战”进入战斗。战斗过程中循环截图识别是否出现“结算”按钮或“胜利”字样。结算后点击“再次挑战”回到第5步循环。整个流程看起来简单但真正做起来就会发现坑全藏在识别不准和异常弹窗里。3. 核心实现从环境搭建到第一个自动化脚本3.1 环境搭建与设备连接我以uiautomator2 OpenCV这套方案详细介绍因为它在Windows和Linux上都很好用而且代码量最少。环境准备分三层电脑端Python环境、安卓设备端环境、图像识别依赖库。# 电脑端安装Python依赖 pip install uiautomator2 opencv-python pillow numpy设备端准备步骤手机上开启“开发者选项”并打开“USB调试”。用数据线连接电脑终端执行adb devices确认设备被识别。再跑一次python -m uiautomator2 init这个命令会在手机上自动安装uiautomator2的ATX代理应用。之后断开数据线手机会通过WiFi接受指令需要手机和电脑在同一局域网并在脚本里指定手机的IP地址。连接时的常见问题是ATX应用被系统清理后台或者miui等国产系统拦截应用自启动。解决办法是在系统设置里把ATX应用加入“自启动白名单”并锁定后台任务。这三步完成后跑一段测试代码验证能不能正常截屏和点击import uiautomator2 as u2 # 通过手机IP连接 d u2.connect(192.168.1.100) # 获取屏幕尺寸 print(d.window_size()) # 截屏保存 d.screenshot(test.png) # 点击坐标300, 500 d.click(300, 500)能正常输出屏幕尺寸、保存截图就说明环境没问题了。3.2 图像识别关键参数设计这个项目最核心的技术细节就是图像识别参数怎么调。我一开始用的是OpenCV的matchTemplate匹配效果尚可但很容易出现误匹配和漏匹配。先说我最终采用的模板匹配方案import cv2 import numpy as np def find_template(screen_path, template_path, threshold0.8): # 读取屏幕截图和目标模板 screen cv2.imread(screen_path) template cv2.imread(template_path) # 执行模板匹配 result cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) # 找到最佳匹配位置 min_val, max_val, min_loc, max_loc cv2.minMaxLoc(result) if max_val threshold: # 返回目标中心坐标 h, w template.shape[:2] center_x max_loc[0] w // 2 center_y max_loc[1] h // 2 return center_x, center_y, max_val return None, None, max_val这里有两个关键点值得展开说。阈值的选择。阈值太低容易误点旁边相似元素阈值太高则刷本过程中偶尔截屏角度或亮度一变就识别不到按钮导致任务卡死。我实测下来按钮类模板阈值定在0.75~0.85之间最稳妥。识别不到就先截屏重试连续重试三次再判定为超时。模板图的截取。模板图素材的来源有两种一是直接截取当前界面中的真实按钮区域二是针对不同分辨率进行缩放处理。我最终维护了一个模板库目录按功能和分辨率分别存放比如templates/1080x2400/explore.png、templates/1080x2400/yuhun.png。这样做的好处是换设备或调分辨率时只需要切换模板目录不需要改代码。另一个细节是游戏界面经常有动态特效比如按钮上的闪光动画直接截整帧当模板效果很差。我用的办法是截取按钮的静态核心区域避开动态部分。举个实际例子御魂界面底部的“挑战”按钮左下角和右下角有装饰光效我截的时候就只截中间“挑战”两个字和底色背景匹配效果非常稳定。3.3 任务流程编排御魂、觉醒、结界突破任务编排是这个项目里最有意思的部分。因为阴阳师的日常任务不是孤立存在的合理的执行顺序能明显减少脚本的闲置等待时间。我的任务队列是这样排的优先执行有时限限制的任务比如悬赏封印会在下午刷新结界突破则每6小时刷新一轮。这些任务先刷掉可以尽早开始下一轮刷新计时。然后是纯挂机类任务御魂和觉醒这两个是真正的长时间循环刷多久都行。最后是产出类操作结界卡收取、式神育成经验收取、斗技积分领取等这类操作间隔时间长放在后台碎片化执行。具体到代码层面我用一个简单的task_queue列表和一个while True主循环来调度。伪代码如下import time task_queue [ {name: 悬赏封印, runs: 1}, {name: 结界突破, runs: 2}, {name: 御魂十层, runs: 50}, {name: 觉醒材料, runs: 30}, ] for task in task_queue: print(f开始执行{task[name]}) for i in range(task[runs]): execute_task(task[name]) time.sleep(1) print(f任务完成{task[name]})execute_task函数内部会调用状态机的各个模块拍照、识别、点击、判断结果。真正跑起来之后我建议每个任务循环里加一个random.uniform(0.5, 1.5)的随机间隔避免脚本节奏过于规律。结界突破有一点特殊它的对手列表每次刷新都不同而且战斗有概率失败。所以结界突破任务不能像御魂那样闭眼循环需要在每场战斗后增加一个“是否胜利”判断胜利点击“下一场”继续。失败点掉结算弹窗返回结界突破界面换下一个对手。这个判断通过识别结算界面顶部是“胜利”还是“失败”字样来实现。我准备了两个模板图victory.png和defeat.png同一张截图分别去匹配两个模板哪个匹配度更高就走哪个分支。3.4 调度与循环控制挂机方案要做到“无人值守”循环控制不能是简单的for i in range(100)套while True。我调试过程中发现刷副本过程中会频繁遇到体力不足、式神重伤撤退、神秘商店弹窗、每周秘闻副本额外弹窗等意外情况任何一项都会打断主循环。我的处理方式是给流程控制模块增加弹窗检测子循环。每次任务开始前先执行一次全屏“弹窗扫描”匹配一组弹窗特征模板体力不足弹窗特征是“购买体力”按钮加“关闭”按钮。活动推荐弹窗特征是右上角有个小小的“叉号”。式神升星提示特征是底部有“育成”按钮。匹配到哪个弹窗就执行对应的关闭或处理动作。这个扫描是在每次点击之前执行的保证无论什么时候弹窗出现都能在下一轮操作前把它关掉。另外程序还得处理网络异常重连的情况。移动网络掉线时游戏会弹出“连接中断请检查网络”的提示这个提示弹窗也需要识别并自动点击重连。否则脚本就会一直挂在断线界面上干等到天亮。过了半夜长时间挂机最容易遇到的问题是手机息屏。uiautomator2可以执行熄屏和亮屏操作我实际使用中的策略是亮屏状态下每30分钟模拟一次轻量滑屏防止长时间固定画面被系统判定为“不活跃”。如果用的是模拟器倒没这个问题直接锁屏功能设成永不即可。4. 实战问题与排查技巧4.1 常见问题速查整个项目做下来遇到最多的问题集中在以下这些场景里。整理成一张速查表直接对着排查现象可能原因解决方案脚本点击无效ADB权限不足或ATX未启动重新执行python -m uiautomator2 init识别率低、频繁漏识别模板图截取了动态光效区域重新截取静态核心区域调低阈值到0.75重复点击同一位置点击后界面加载较慢在点击和截图之间增加time.sleep(2)等待关卡打不过卡在战斗界面式神配置不足或战斗超时设置战斗最长时间如120秒超时后判定失败并退出本关模拟器识别不到设备模拟器ADB端口未打通手动adb connect 127.0.0.1:端口号连接鼠标移位后坐标偏移模拟器分辨率被系统改变固定模拟器分辨率同时确保模板目录匹配当前分辨率手机息屏后脚本断掉系统自动清理后台锁定ATX应用允许自启动关闭电池优化4.2 稳定性优化心得这部分是踩坑踩出来的经验很重要。第一稳字当先不要一味追求速度。我最初把识别模块的截图间隔压到0.3秒一次结果游戏都还没完成转场脚本就已经发出去下一次点击了导致点错按钮的情况大幅增加。后来把间隔放宽到1.5秒左右整体完成率反而提升了。这里有一个很朴素的道理识别模块看到的画面是“异步”的截图那一瞬间的状态不等于你此刻想操作的状态必须给界面加载留出缓冲。第二日志比优化功能还重要。脚本跑挂了不可怕可怕的是挂了你不知道它为什么挂。所以我给每个任务模块都加了详细的日志输出记录当前识别到的模板、匹配度、点击坐标和任务状态。跑一晚上之后翻日志定位问题修复效率会高非常多。具体的日志格式可以长这样[2025-11-12 02:15:33] 任务御魂十层, 步骤点击挑战, 坐标(540, 1860), 匹配度0.872 [2025-11-12 02:15:36] 任务御魂十层, 步骤战斗进行中, 等待结算 [2025-11-12 02:15:51] 任务御魂十层, 步骤结算页, 点击再次挑战, 坐标(540, 1600), 匹配度0.903日志文件用日期分片每天一个文件方便回顾一整天的运行情况。实际排查过程中日志的价值不夸张地说顶得上写脚本时间的一半。第三善用模板匹配的置信度做“二次确认”。有些模板和界面里的其他元素长得像比如“挑战”按钮和“挑战另一层”按钮匹配度都能达到0.8以上。我的方案是不仅记录最高匹配坐标还会检查匹配度排序前几名的位置如果多个高匹配点分布在屏幕不同区域则大概率是撞上类似元素了此时程序会提示“识别结果存疑”改用更保守的策略重新截图识别。第四处理好游戏中“随机出现”的障碍。阴阳师时不时会弹Tips助战提醒、御魂库存满的提示、觉醒加成道具使用引导。这些弹窗都是随机出现的每次更新时间也不一样。我的做法是在图片素材库里持续收集“各种奇怪的弹窗截图”不断补充模板库。时间长了弹窗库覆盖面越来越广脚本也就越来越稳定。所以说这类挂机方案本质上是个资产积累的过程——你的模板库越多脚本就越皮实。5. 还可以扩展的方向做完基础的日常刷本之后这套框架还能延伸出不少玩法。我自己后续加过的功能包括每周秘闻副本自动攻略秘闻副本每一关的机制不同需要根据当前关卡选择不同阵容。这个没法用一个固定状态机搞定我是在识别到关卡界面后读取关卡编号再去匹配预置的不同操作序列。斗技相关斗技需要实时决策做完全自动化意义不大但我加了“上班式”的定时器——到点自动进场未进场的场次自动补赛。多开管理一个脚本实例控制一个设备然后用Python开多个线程分别连接不同的模拟器端口实现同时刷多个账号。这一步需要做好线程隔离别让两个实例同时连同一个设备就好了。这些扩展方向让整个“任务助手”不再只是一个刷御魂的小工具而是逐步变成了一套完整的日常管理框架。不过有一点必须说清楚目前所有功能都建立在UI识别模拟点击这一层并没有侵入游戏客户端本身。6. 写在最后的一点个人实操体会这套方案从最初能跑通到后来稳定挂机一周不出问题中间经历了不少调试。我个人最大的体会是游戏自动化脚本的难点并不在写代码而在识别策略和异常处理。代码加起来可能也就几百行但花在收集模板素材、调整阈值、整理弹窗逻辑上的时间远远超过了写代码本身。如果你也想自己动手搭一套我的建议是从最小的场景开始——先只做“自动刷御魂”这一个功能跑通之后再逐步加结界突破、悬赏封印等功能。一上来就想着全任务覆盖很容易在调识别精度时陷入泥潭。还有一点设置好脚本的“每日停止时间”比如凌晨3点半自动结束任务进入待机状态。一方面是给游戏留出休息窗口另一方面也避免脚本因为持续运行太久积累过多异常状态。版本更新之后别急着直接开跑先去游戏里手动跑一遍日常流程把新增的按钮和弹窗截图补进模板库。这个习惯能避免绝大多数“更新后脚本失灵”的情况。就这些希望对有兴趣折腾自动化挂机的朋友有点帮助。
返回列表