SikuliX图像识别自动化:从游戏挂机到Python集成实战全指南
2026/9/20 10:08:45 网站建设 项目流程

说到游戏挂机,很多人第一反应是按键精灵,或者干脆去碰内存修改那一套。我的习惯是用 SikuliX 做纯屏幕识别,脚本只负责“看屏幕、点鼠标”,全程不碰游戏进程。这套思路做游戏挂机脚本,稳定性和通用性反而更好,而且天生就少了很多被检测的理由。后面我再把 Python 集成方案一起讲清楚,调度、日志、数据分析都能串起来,整个玩法就完全不一样了。

这篇文章主要面向想用 SikuliX 做桌面自动化、又不想碰底层逆向的朋友。我会从环境搭建开始,手写一个完整的挂机循环,再把防检测思路里最重要的行为优化讲透,最后给出三种 Python 联动方案。你可以把这篇文章当成一份可以直接上手复现的实操笔记,不是那种讲完概念就结束的教程。

1. 为什么用SikuliX做游戏挂机脚本:图像识别自动化的核心逻辑

1.1 SikuliX的原理:屏幕截图就是对象

SikuliX 最核心的思想,是“用图片代替代码里的对象”。传统自动化脚本里,你要操作一个按钮,得知道它的坐标、控件 ID 或者窗口句柄。SikuliX 不一样,你只需要把按钮截图下来,运行时它会用 OpenCV 在屏幕上做图像匹配,找到这张小图出现的位置,然后返回坐标给你操作。

这个设计让 SikuliX 对 UI 类型几乎没有任何要求。不管是游戏里手绘风格的技能图标、网页里的 CSS 按钮,还是老软件里像素级的菜单项,只要能截图,就能操作。它不依赖窗口信息,所以在游戏这种“自绘界面、无标准控件”的极端环境里反而特别能打。

这里的底层逻辑很简单:SikuliX 把屏幕当成一张大图,把你要找的目标当成一张小图,然后计算小图在大图中的相似度。匹配分数超过阈值就算找到。它内置的是 OpenCV 的模板匹配算法,所以对颜色、形状、缩放都有一定容忍度。你不需要懂图像处理细节,但理解“阈值”和“相似度”这两个概念,后面调脚本会轻松很多。

1.2 横向对比:坐标脚本、内存挂和SikuliX的差异

我用过按键精灵一类纯坐标脚本,也接触过读内存的辅助工具,三套方案摆在一起对比,差异一下就清楚了。

坐标脚本的最大问题是“死”。窗口一挪、分辨率一改、画面元素位置稍微变化,脚本就全部失准。你得手动重新取坐标,维护成本极高。内存挂则是另一条路子,直接读取游戏进程数据,精确是精确,但这已经属于“进程级介入”,轻则兼容性差,重则触碰安全边界,而且每次游戏更新,偏移地址全变,维护代价更大。

SikuliX 走的是“外部视觉自动化”路线。它不读内存、不注入进程、不获取窗口句柄,只做两件事:屏幕截图和模拟输入。从原理上就和“进程级”工具划清了界限。代价是每次图像匹配都有几百毫秒的耗时,耗时的高低取决于你设定的搜索区域和图片复杂度,不像内存挂那样毫秒级响应。但对挂机场景来说,这个速度完全够用。

1.3 游戏自动化场景中它到底香在哪

挂机脚本的典型特点是:操作重复、UI 位置相对固定、对实时性要求不高。这正好是 SikuliX 的优势区间。

第一,画面识别方式决定了它天然具备“多开”能力。每个游戏窗口只要位置不重叠,SikuliX 分别对每个区域做匹配就行。它不在乎你开了几个游戏客户端,只在乎屏幕上有没有出现目标图片。

第二,脚本可以做到“窗口无关”。游戏窗口被遮挡一部分、最小化再恢复、切换分辨率,只要截图标的是屏幕绝对坐标区域内的内容,SikuliX 都能重新找到。哪怕是全屏游戏切到窗口模式,只要里面的按钮样式没变,基本不用改脚本。

第三,防检测思路更干净。因为整个自动化过程不涉及游戏进程,从系统层面看,你就是一个“在屏幕上做图像识别,然后模拟鼠标键盘”的普通程序。这比注入式方案在合规层面和安全性层面都干净得多。当然,图像自动化一样会被行为侧检测识别出来,这个我在第 4 节会专门讲。

2. 环境准备:把Java、SikuliX和Python三件套装利索

2.1 安装Java并正确配置JAVA_HOME

SikuliX 是 Java 写的,所以第一步是把 Java 运行环境装好。这里我建议用 JDK 8 或者 JDK 11,不要一上来装最新的 JDK 版本。SikuliX 对 JDK 17 以上版本并不是完全兼容,某些老版本跑起来会直接报错,白白浪费时间。

安装 JDK 时,Windows 下一路 Next 就行。装完以后,最关键的是设环境变量。在系统变量里新建JAVA_HOME,指向 JDK 的安装目录,比如C:\Program Files\Java\jdk-11,然后把%JAVA_HOME%\bin加到Path变量里。设置完之后,打开命令行执行java -version,能正常打印出版本号就说明 Java 环境没问题。

这个步骤坑很多,我见过不少人卡在这里。有些电脑装了多个 Java 版本,环境变量互相覆盖;有些人的 Path 配置有误,导致命令行找不到 java 命令。建议在命令行里多跑一次where java,看看实际调用的到底是哪个路径的 Java,避免辛辛苦苦装好环境,SikuliX 却用了另一个版本。

2.2 下载并启动SikuliX:几个关键设置

去 SikuliX 的官方发布页面下载对应的 jar 包,现在主流版本是 2.0.5 或者更高。下载下来是一个单独的sikulix-x.x.x.jar,不需要安装。双击运行,或者在命令行执行java -jar sikulix-x.x.x.jar

第一次启动时,SikuliX 会弹出一个安装配置窗口,问你想要安装哪些扩展。这里直接按默认全选即可,它会自动把 IDE、脚本运行环境等组件准备好。在命令行运行的好处是能看到完整日志,一旦缺依赖或 Java 版本不对,错误信息会直接显示在控制台里,排查起来方便很多。

我个人的习惯是把 jar 包放在一个专门的目录,比如D:\sikuli\,后面跑脚本、放截图素材、写日志都统一在这一个目录下管理。这个做法开始觉得麻烦,时间长了会发现好处极大——项目结构清楚,复制到另一台电脑也能快速跑起来。

2.3 先解决DPI和屏幕缩放这个最大的坑

玩 SikuliX 最容易踩的坑是 Windows 的屏幕缩放。现在笔记本基本都有 125% 或 150% 缩放,SikuliX 默认读取的屏幕坐标是物理分辨率,当系统和软件缩放比例不一致时,截图看起来没问题,但点击坐标会发生偏移。

解决办法是让 SikuliX 的运行和缩放比例保持一致。简单粗暴的操作是:在启动 SikuliX 的快捷方式上右键,属性,兼容性,更改高 DPI 设置,勾选“替代高 DPI 缩放行为”,缩放执行选择“应用程序”。这样 SikuliX 会以系统缩放后的坐标工作,和屏幕截图的实际像素对齐。

如果有多显示器,还要注意 SikuliX 默认只识别主屏。副屏上的游戏窗口如果不在主屏,匹配会失败或坐标错位。我的建议是,跑挂机脚本时把游戏窗口固定在主屏,分辨率保持系统默认,不要开着奇奇怪怪的缩放比例。这些都是小细节,但能让你在写脚本时少掉一半头发。

2.4 Python环境:SikuliX自带Jython,但外挂CPython更灵活

SikuliX 的 IDE 里内置了 Jython 2.7 解释器,你可以在脚本里直接写 Python 语法,基础的if/elsewhilerandom都能用。对于简单的挂机脚本,内置 Jython 已经足够。

但 Jython 有个明显短板:它跑在 JVM 上,没法直接用 CPython 生态里那些重量级库,比如requestspandasflask。如果你希望脚本能联网更新配置、把运行数据存到数据库、或者做一个 Web 控制台,就必须让外部 Python 参与进来。

这种场景下,需要单独装一个 Python 环境。安装时记得勾选“Add Python to PATH”,版本用 3.8 以上的稳定版即可。装好以后,Python 这边负责调度、数据处理、任务决策,SikuliX 负责屏幕识别和键盘鼠标操作,两者通过命令行或者 JPype 桥接。具体怎么配合,我会在第 5 节细讲。

3. 实战拆解:5分钟写完一个能跑的挂机循环

3.1 截图素材:决定识别率的细节

挂机脚本里所有要找的东西,都需要先截图保存。这个步骤决定了脚本的识别率,比写代码本身更关键。

截图要注意几个细节。第一,图片尺寸别太小,尽量不小于 20×20 像素。像技能图标这种显眼物体问题不大,但如果你要找一个细小的文字按钮,截图太小,匹配时容易跟背景混淆。第二,截图尽量选静态、特征明显的部分。带动态特效或透明渐变的图像容易匹配失败,我实际测试时发现,带半透明光效的按钮在画面切换的一瞬间经常找不到。第三,同一张素材可以多截几个角度,比如技能图标平时是亮的,按下去之后变暗,这时候你用常亮的图去匹配按下去的按钮,可能就找不到,需要另存一张“按下状态”的图。

截图保存的格式优先用 PNG,别用 JPG。JPG 压缩会引入色块和噪点,导致匹配分数下降。SikuliX 里引用图片时,默认是相对路径,也就是脚本文件.sikuli目录下的图片,路径问题后面完全不用操心。

3.2 核心循环:找图、点击、等待、再找

挂机脚本的核心逻辑,无非是一个无线循环:找目标图、点击操作、随机等待、再找下一个目标。下面这个例子是典型的最小挂机循环,处理的场景是:发现怪物图标 → 点击怪物 → 按下技能按钮 → 拾取掉落物。

# coding: utf-8 import random import time def find_and_click(target_image, timeout=3, similarity=0.85): pattern = Pattern(target_image).similar(similarity) matched = exists(pattern, timeout) if matched: click(matched.getTarget()) return True return False while True: # 1. 找怪物,找到就点 if find_and_click("monster.png", timeout=3): wait(random.uniform(0.8, 1.6)) # 2. 找技能按钮,点技能 if find_and_click("skill_icon.png", timeout=2): wait(random.uniform(0.5, 1.2)) # 3. 看地上有没有掉落物,有就双击拾取 if find_and_click("item_drop.png", timeout=1): wait(random.uniform(0.3, 0.8)) # 4. 没找到怪物,就等一会重新找 wait(random.uniform(1.0, 2.5))

这里有几个关键点。Pattern(target_image).similar(0.85)是设置匹配相似度阈值,意思是“只要有 85% 相似就认为是目标”。阈值设得越低,越容易误匹配;设得越高,越容易漏匹配。实际使用中我一般从 0.85 起步,根据运行效果微调。exists(pattern, timeout)是在等待时间内持续查找,找不到就返回空,不会一直卡死。matched.getTarget()拿到的是匹配到的具体坐标,这样即使图像在屏幕不同位置出现,也能准确点击。

实际用的时候,我一般不会直接点monster.png这张图的中心,而是点图里的一个特征点。比如怪物的头顶位置,可以单独截一个小图作为“点击焦点”,用click(Pattern("monster_slot.png"))配合targetOffset(x, y)去点旁边的坐标。

3.3 给脚本加坐标范围限制和容错日志

全屏搜索对性能不友好,而且容易误匹配。更好的做法是只盯着游戏窗口内的一块区域,SikuliX 用Region对象搞定这个事。

game_area = Region(300, 150, 1280, 720) # 游戏画面区域,根据你的窗口位置调整 game_area.exists(Pattern("monster.png").similar(0.85))

把搜索范围缩小到游戏画面内,匹配速度会快很多,误匹配率也会明显下降。比如你屏幕上还有聊天窗口、系统消息,这些地方的图案如果不在搜索区域内,就不会干扰识别。

容错和日志是长跑挂机脚本的保命工具。初始版本我经常遇到的问题是:脚本一旦找不到目标,就直接报错退出,结果一晚上白挂。后来我加了一个“连续失败计数”的机制:连续 N 次没找到目标,就自动把当前屏幕截图保存起来,然后尝试按 ESC 或者关闭弹窗,继续执行。这样就算遇到意外弹窗,脚本也能自己恢复,不会傻乎乎地卡死在那里。

failure_count = 0 while True: if find_and_click("monster.png", timeout=3): failure_count = 0 # 执行技能、拾取等操作... else: failure_count += 1 if failure_count > 5: capture(SCREEN.getBounds()).save("logs/" + time.strftime("%Y%m%d_%H%M%S") + ".png") type(Key.ESC) failure_count = 0 wait(random.uniform(1.0, 2.5))

这个截图存档的习惯非常有用。第二天起来,你直接看 logs 目录里的截图,就能知道脚本一晚上在哪个环节出了问题,不需要守在电脑前看实时日志。

4. 防检测思路:从行为上“去掉机器味”

4.1 游戏行为检测到底在检测什么

先说清楚一个原则:SikuliX 是纯外部自动化,不做内存修改,不注入进程,所以不存在“进程级特征”。但纯屏幕识别加模拟输入,仍然有“行为特征”可以被捕捉到。

游戏的反作弊系统会记录你的操作序列、操作频率、鼠标移动轨迹、点击间隔等数据,再用规则或机器学习模型判断你是否是真人。最典型的破绽有三个:一是鼠标瞬间从 A 点跳到 B 点,没有任何中间轨迹;二是操作间隔全是固定的,比如每次都精准等待 1.2 秒;三是行为序列重复度极高,每轮循环一模一样,连点击位置都分毫不差。

防检测这个命题,本质上是减少这些“机器味”。注意,我这里说的是在合规场景下降低被误判的风险。如果你的目标是一边挂着脚本一边外出售号,或者硬刚反作弊系统,那我劝你现在就收手,这东西的价值不在对抗检测,而在让自动化流程在许可范围内更顺畅地运行。

4.2 鼠标轨迹优化:别一秒钟瞬移过去

鼠标移动是行为检测里最显眼的破绽。真人移动鼠标,轨迹不是直线,而是有弧度、有停顿、有轻微抖动的曲线。SikuliX 默认的点击是屏幕坐标直接跳转,从系统层面看,鼠标轨迹就是从起点瞬间到终点,几乎可以认为是机器操作。

解决思路不复杂:不要直接click(x, y),而是先手动把鼠标平滑移过去。也就是把“当前鼠标位置到目标位置”的距离拆成十几段,每一段只移动一小步,并在每一步加一个 1~3 像素的随机偏移。

import random import time def human_move(target_x, target_y, steps=25): start = Mouse.at() points = [] for i in range(1, steps + 1): ratio = i / steps # 每一小步都加随机噪声,让轨迹不那么笔直 noise_x = random.randint(-2, 2) noise_y = random.randint(-2, 2) x = start.x + (target_x - start.x) * ratio + noise_x y = start.y + (target_y - start.y) * ratio + noise_y points.append((x, y)) for x, y in points: mouseMove(x, y) wait(random.uniform(0.008, 0.025)) # 点击之前先模拟移动,到了之后再停顿一下再点 human_move(1200, 800) wait(random.uniform(0.1, 0.3)) click(1200, 800)

配合 SikuliX 的Settings.MoveMouseDelay也能设置鼠标移动速度,但那是让鼠标以固定速度线性移动,效果不如自己写分段移动那么自然。我的建议是:关键坐标点用自定义human_move,非关键路径直接用Settings.MoveMouseDelay = 0.3,既能保证流畅度,又不至于太假。

4.3 随机等待与任务分支:让节奏更像真人

随机等待是另一个必须做的点。真人不可能每次按技能都间隔完全相同的毫秒数,所以循环里的wait一定要用随机数,而且别用random.uniform(1.0, 1.1)这种范围极小的随机,那相当于没随机。合理的范围是至少 30% 的浮动,比如本次等 1.2 秒,下次等 2.3 秒。

除了时间随机,操作顺序也要随机。我见过很多脚本是“找怪→打怪→捡东西→回城”一条线走到底,每轮顺序一模一样。这种固定序列是行为检测最典型的样本。我的对策是给每个任务节点设置一个随机概率,比如有 70% 的概率先放技能再捡东西,30% 的概率先捡东西再放技能;回城补给也不一定每次都做,而是在血量低于某个阈值时才触发,并且触发时间稍微随机一点。

这样处理之后,脚本的每轮行为序列和间隔都会有所变化,从行为数据上看,和真人玩游戏的节奏就非常接近了。

4.4 运行习惯层面的几点经验

防检测不能只看脚本内部,运行时的系统状态同样重要。我的经验是,挂机期间最好不要一边开脚本一边手动操作,鼠标轨迹的叠加会让行为数据变得混乱,反而不利于模拟真人。单人跑脚本的话,有一个干净独立的运行环境更稳。

另外,不要开着加速齿轮之类的工具。这类东西会影响游戏内部的时间计算,从而在行为数据上产生不可解释的异常。窗口大小也尽量保持正常比例,别把游戏窗口压到一条细缝里,那样画面渲染方式会和正常状态不一样,图像匹配会不稳定。

最后一点,脚本运行时间过长后,建议主动重启。我发现长时间运行后,内存里累积的资源问题和日志膨胀会导致识别速度变慢。设定一个“运行 4 小时自动重启”的策略,整个过程更稳定。

5. Python集成技巧:让SikuliX做眼睛,Python做大脑

5.1 方案一:用subprocess调用SikuliX脚本

最简单也是最稳妥的 Python 集成方式,是让 Python 用subprocess去调用 SikuliX 的命令行运行模式。每个.sikuli文件夹就是一个独立脚本,Python 可以随时启动它,运行完成后拿到退出码,然后继续做自己的事情。

import subprocess def run_sikuli_script(script_name, timeout=120): result = subprocess.run( ["java", "-jar", "D:/sikuli/sikulix-2.0.5.jar", "-r", f"D:/sikuli/{script_name}.sikuli"], capture_output=True, text=True, timeout=timeout, encoding="utf-8", errors="replace" ) return result.returncode, result.stdout

这种方式的优点是物理隔离。SikuliX 和 Python 各跑各的进程,互不干扰,Python 就算挂了,SikuliX 脚本也能继续把当前任务执行完。缺点是有进程启动开销,每次运行都要加载一次 Java 环境,所以不适合高频调用,比较适合“每隔几分钟跑一次”的挂机巡检场景。

实操上有个细节:SikuliX 脚本运行完会自动退出,如果脚本里写了一个无限while True循环,那 subprocess 就会一直挂起。这时必须在 Python 侧设置timeout,同时让 SikuliX 脚本能响应中断请求。我的做法是给脚本加一个“运行 N 次循环后主动退出”的开关,主要给测试阶段用,正式挂机时再改成常驻模式。

5.2 方案二:JPype直接操作SikuliX的Java API

如果你不想反复启动 Java 虚拟机,可以让 Python 通过 JPype 直接调用 SikuliX 的 Java 类。这样做的好处是,Python 和 SikuliX 运行在同一个 JVM 里,整个会话只启动一次 JVM,后续调用都是函数级别的开销,速度很快。

import jpype if not jpype.isJVMStarted(): jpype.startJVM(classpath=["D:/sikuli/sikulix-2.0.5.jar"], convertStrings=True) from jpype import JClass Screen = JClass("org.sikuli.script.Screen") screen = Screen() match = screen.exists("D:/sikuli/target.png", 5000) # 单位是毫秒 if match: target = match.getTarget() screen.click(target)

这里要注意,直接传 String 给screen.exists()时,JPype 可能会因为 Java 方法重载问题而报错。保险起见,先构造Pattern对象再传:

Pattern = JClass("org.sikuli.script.Pattern") pattern = Pattern("D:/sikuli/target.png").similar(0.85) match = screen.exists(pattern, 5000)

JPype 的坑在于convertStrings=True必须设置,否则 Java 返回的 String 对象没办法直接拿到 Python 字符串。另外,JVM 启动一次后不能再改 classpath,如果你的 SikuliX jar 路径变了,需要重启 Python 进程。用这种方式的话,建议把“启动 JVM”和“操作屏幕”封装成单独的模块,避免每个脚本都重复做初始化。

5.3 方案三:Python调度+多SikuliX实例的混合架构

最后一个方案,是我的长期挂机项目里比较喜欢用的架构:Python 做主控调度,SikuliX 只干活,两者通过文件或者 HTTP 接口通信。

具体来说,Python 这边维护一个任务队列,比如task.json里写了需要自动做的操作列表。SikuliX 的脚本每隔一段时间去读取这个 JSON 文件,发现有新任务就执行,执行完把结果写回一个result.json。两个进程之间的通信不通过任何 SDK,用最原始的文件交换方式,稳定性极高。

D:/sikuli/ ├── task.json # Python 写入的任务指令 ├── result.json # SikuliX 写入的执行结果 ├── scripts/ │ ├── worker.sikuli # SikuliX 工作脚本 │ └── images/ # 截图素材 └── logs/ # 截图与运行日志

比如 Python 检测到某个服务器需要定时签到,就写入一个任务:“去游戏里找签到按钮,点击确认,然后返回结果”。SikuliX 脚本轮询到任务,执行完毕后把成功失败的标志写进结果文件。Python 再根据结果决定下一步动作。

这个架构的好处是解耦。SikuliX 完全不需要知道任务是怎么被下发的,Python 也不需要关心 SikuliX 的截图匹配细节。哪一边挂了,另一边都能继续运行,非常契合长时间挂机的场景。我还配合一个简单的 Web 页面,Python 用 Flask 把 task.json 和 result.json 的内容读出来展示,这样我躺在床上拿手机也能看到挂机状态。

6. 常见问题与排查实录

6.1 找不到图、匹配错乱怎么办

先说找不到图。第一步先确认是不是截图问题:目标区域是否超过搜索范围、图片像素是否太小、相似度阈值是否设得太高。我一般这样排查:打开 SikuliX IDE,把截图素材拖到脚本中,用highlight()看匹配框在哪。如果匹配框明显偏移,说明图片特征选得不对,换个特征区域再截一张。

如果屏幕上确实有目标,但脚本就是找不到,多半是分辨率和缩放导致。我在办公室的电脑和家里的笔记本跑同一个脚本,其他都正常,就是找不到某个按钮,后来发现一台是 1920×1080 100% 缩放,另一台是 2560×1600 150% 缩放,图形大小和缩放比例都在变,模板匹配自然不稳定。解决办法要么用统一的缩放,要么在脚本里做动态截图对比。

6.2 点击坐标总偏一点,多半是DPI缩放

这个问题前面提过,这里再展开一下。现象是:截图匹配到了正确位置,但鼠标点击后点的位置和预期差了一段距离,而且这个偏移量不固定,窗口拉大缩小后偏移量还会变。

问题根源是 SikuliX 拿到的是物理像素坐标,而系统在 125% 或 150% 缩放下会做逻辑坐标转换。解决方式是设置进程的 DPI 感知。在代码层面也可以手动做换算,把坐标除以缩放系数。但最省心的还是我在 2.3 节说的:在 SikuliX 的快捷方式属性里勾选“替代高 DPI 缩放行为”,缩放执行选择“应用程序”。

另外,如果你用双显示器且两个屏幕分辨率不一致,也会出现坐标偏移。跑脚本时尽量保证所有窗口都在同一个显示器内,否则screen.exists()返回的坐标会超出目标窗口的实际范围。

6.3 跑几分钟就卡死或内存飙升

SikuliX 跑挂机脚本时,内存会慢慢增长,这是 Java 环境的常见问题。如果脚本里频繁调用全屏截图,内存增长会更快。

解决思路有两层。第一层,尽量把搜索区域限定在游戏窗口的Region里,减少全屏的像素扫描量。第二层,脚本运行过程中,定期让脚本自己退出,再通过 Python 调度重新启动。比如每运行 200 次循环,就exit(0),然后由 Python 判断是否需要继续拉起新进程。这个“自我重启”机制在后端服务里很常见,放到 SikuliX 上也一样有效,实测下来稳定性提升非常明显。

6.4 SikuliX启动不了,先查这几项

启动时最常见的问题是 Java 环境变量没配好,命令行直接报“找不到 Java”。按顺序检查三件事:java -version是否正常、JAVA_HOME是否指向了正确的 JDK 目录、Path里是否有%JAVA_HOME%\bin

如果你装了多个 Java 版本,记得检查系统变量和用户变量里的冲突。还有一点,SikuliX 运行需要图形界面环境,不要在无桌面的 Linux 服务器上强行跑,它会因为找不到 X server 而报错。Windows 和 Linux 桌面版没问题。卡在启动界面时,看一下日志文件路径,一般在临时目录下有个SikuliX.log,里面会写明具体原因。

我在实际使用中最大的感受是:SikuliX 这类工具,真正考验人的不是写脚本那 5 分钟,而是你怎么把“看屏幕、点鼠标”这套能力嵌入到更大的自动化体系里。挂机脚本只是它的一个小场景,同样的思路放到批量办公、数据录入、桌面软件测试上,一样成立。别被“游戏挂机”这四个字局限住,你掌握的是“视觉驱动自动化”这套通用技能,换个场景就能迁移过去。写脚本前先把环境整利索,写的时候多用 Region 和随机节奏,跑起来之后留好日志,这个思路能帮你省下大把时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询