尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AutoJS自动化脚本开发实战:从入门到精通1000案例解析

AutoJS自动化脚本开发实战:从入门到精通1000案例解析 简介Android自动化测试与脚本开发是移动端开发与测试领域的重要技术方向其核心原理在于通过程序模拟用户操作实现重复任务的自动执行。这项技术基于Android系统的无障碍服务AccessibilityService等底层接口能够识别并操作UI控件完成点击、滑动、文本输入等一系列交互。其技术价值在于显著提升测试效率、保障操作一致性并能在批量任务处理、数据采集、应用监控等场景中释放人力。随着移动应用复杂度的增加对稳定、高效的自动化解决方案需求日益增长。本文聚焦于AutoJS这一基于JavaScript的Android自动化工具深入探讨如何构建模块化的脚本案例库以解决实际开发中遇到的兼容性、稳定性等核心挑战并提供从环境搭建到高级技巧的完整实践路径助力开发者快速掌握自动化脚本开发。1. 项目概述为什么你需要一个AutoJS案例库如果你是一名Android开发者、测试工程师或者只是一个想用手机自动化来解放双手的普通用户那么“AutoJS”这个名字你一定不陌生。它是一个基于JavaScript的Android平台自动化工具能让你通过编写脚本模拟点击、滑动、读取屏幕信息实现各种自动化操作。听起来很酷对吧但真正上手后很多人都会卡在同一个地方从零开始写一个能稳定运行的脚本实在太难了。你需要理解无障碍服务AccessibilityService的调用逻辑处理各种屏幕适配问题应对不同机型的兼容性还要解决脚本运行中各种莫名其妙的崩溃和中断。这就是“AutoJS 1000案例 脚本代码大全”这个项目标题背后最核心的需求。它不是一个简单的代码合集而是一个面向实战的“工具箱”和“避坑指南”。对于新手它提供了从“Hello World”到复杂业务流程的完整学习路径对于老手它则是解决特定场景如自动签到、游戏辅助、数据采集、批量操作的灵感源泉和即用模块。这个标题暗示了一个庞大的、经过验证的代码仓库其价值在于降低自动化脚本的开发门槛提供经过实战检验的解决方案并系统性地整理开发过程中的经验与教训。接下来我将以一个深度使用者的视角为你拆解如何构建、使用并从这样一个案例库中汲取最大价值。2. AutoJS核心机制与开发环境搭建2.1 AutoJS的工作原理不只是“模拟点击”很多人把AutoJS简单理解为“录屏点击”工具这大大低估了它的能力。它的核心是基于Android无障碍服务AccessibilityService的UI控件分析与操作引擎。当你启动AutoJS并开启其无障碍服务后它就能以编程方式“看到”当前屏幕上的所有UI元素按钮、文本框、列表等并获取它们的属性如id、text、desc、bounds坐标。你的脚本本质上就是对这些UI元素状态进行判断并执行相应操作click, longClick, setText等的逻辑集合。更深一层AutoJS还封装了设备控制如音量、亮度、传感器访问、HTTP网络请求、文件读写、甚至图像识别通过内置的OpenCV模块或第三方插件等能力。这意味着你可以写出非常智能的脚本例如先通过网络API获取今日任务列表再根据任务名称在App内搜索并点击完成后截图保存日志并通过HTTP通知服务器。理解这个“UI自动化 设备控制 扩展能力”的架构是高效利用案例库的前提。2.2 开发环境准备选对工具事半功倍工欲善其事必先利其器。虽然AutoJS有官方提供的编辑器但对于严肃的脚本开发我强烈建议搭建更专业的环境。1. 核心运行平台选择AutoJS Pro付费版这是目前功能最完善、更新最活跃的版本。它提供了更稳定的引擎、更丰富的API如更强大的图像识别、OCR、以及本地打包成APK的功能。对于长期使用或开发复杂脚本这是值得的投资。AutoJS 4.x 开源版本开源免费基础功能齐全社区资源丰富。是学习和入门的最佳选择。你可以在GitHub上找到它的发布页。2. 代码编辑与调试环境在手机小屏幕上敲代码和调试是痛苦的。最佳实践是在电脑上编写和测试脚本。VS Code 插件在电脑上安装VS Code然后安装支持JavaScript的插件如ESLint、Prettier。通过AutoJS Pro提供的“远程连接”功能或使用开源版的“ADB WiFi调试”方式可以将电脑上的脚本文件实时同步到手机端执行和调试。这能极大提升开发效率。脚本管理器在手机上安装一个文件管理器如MT管理器用于方便地查看、编辑和运行脚本文件.js或.auto后缀。3. 必备辅助工具布局边界分析工具AutoJS自带“布局分析”功能可以悬浮显示当前页面的控件信息。这是写脚本时最常用的“眼睛”。日志查看器console.log()是调试的生命线。确保你知道如何查看AutoJS的运行日志通常可以在软件内的“日志”面板查看。注意由于AutoJS需要无障碍服务请务必在手机系统的“设置”-“无障碍”中找到并开启AutoJS的无障碍服务权限。这是所有脚本能运行的基础。3. 案例库的架构设计与代码组织心法一个拥有1000个案例的代码库如果杂乱无章其价值将大打折扣。合理的架构设计能让它从“代码堆”变成“知识库”。3.1 模块化分类建立你的脚本“工具箱”不要按序号case001.js, case002.js…来组织而应按功能领域和技术点进行模块化分类。以下是一个建议的目录结构AutoJS_Scripts/ ├── 基础教程/ │ ├── 01_HelloWorld与日志输出.js │ ├── 02_控件查找与点击id_text_desc.js │ ├── 03_屏幕滑动与坐标点击.js │ ├── 04_条件判断与循环等待.js │ ├── 05_文件读写操作.js │ └── 06_简单的HTTP请求.js ├── 通用函数库/ │ ├── ui_operator.js // 封装通用的控件操作如安全点击、智能等待出现 │ ├── screen_utils.js // 封装屏幕尺寸获取、颜色判断、截图函数 │ ├── file_logger.js // 封装带时间戳的日志记录到文件 │ └── notification.js // 封装脚本状态通知震动、语音、通知栏 ├── 场景应用案例/ │ ├── 社交娱乐/ │ │ ├── 微信_自动抢红包原理与防范.js │ │ ├── 抖音_自动滑动与点赞.js │ │ └── 微博_超话签到.js │ ├── 效率工具/ │ │ ├── 支付宝_收取能量与喂鸡.js │ │ ├── 钉钉_自动打卡考勤.js │ │ └── 各大银行App_自动登录查询余额.js │ ├── 游戏辅助/ │ │ ├── 基于颜色的简单游戏自动化.js │ │ └── 使用图像识别寻找游戏图标并点击.js │ └── 数据收集/ │ ├── 爬取商品列表信息.js │ └── 定时截图并归档.js ├── 高级技巧与排错/ │ ├── 处理动态加载列表.js │ ├── 应对弹窗与权限申请.js │ ├── 脚本保活与防休眠.js │ └── 无障碍服务自动关闭的排查与应对.js └── 项目模板/ ├── 定时任务模板.js ├── 带配置界面的脚本模板.js └── 多线程脚本模板.js这种结构的好处是当你需要实现“支付宝收能量”功能时你可以直接去场景应用案例/效率工具/下找到参考同时可能会用到通用函数库/ui_operator.js里的安全点击函数以及高级技巧/脚本保活.js里的保持屏幕常亮技巧。3.2 代码规范与注释让案例自己能“说话”每个案例脚本都应该是自解释的。我遵循以下规范文件头部注释清晰说明脚本的功能、作者、版本、使用前提如需要开启哪个App、需要的权限、以及主要参数配置。/** * 脚本名称微信自动抢红包原理示例 * 功能描述监听微信聊天窗口模拟点击红包消息。本脚本仅用于学习AutoJS控件监听原理。 * 注意事项抢红包行为可能违反微信使用条款请谨慎使用。需开启AutoJS无障碍服务及悬浮窗权限。 * 核心APIevents.observeNotification, className(“android.widget.TextView”).findOne().click() * 作者资深脚本开发者 * 版本v1.0 */关键步骤注释在复杂的逻辑判断、循环或异步操作处用注释说明“为什么这么做”。例如在等待控件出现时注释超时时间和重试逻辑的原因。函数封装将重复使用的操作如safeClick(uiObject)封装成函数放在通用函数库中并在案例中通过require()引入。这使案例代码更简洁也更利于维护。4. 核心案例深度解析与实战编码让我们深入两个典型且需求旺盛的案例看看如何从思路到代码并融入实战经验。4.1 案例深度解构自动化签到脚本签到脚本看似简单但涵盖了控件查找、条件判断、异常处理等核心技能。我们以某个虚构的“社区App”每日签为例。4.1.1 需求分析与流程设计目标打开App找到签到按钮点击。如果已签到则获取签到奖励提示文本并记录。 难点签到按钮的控件标识可能不唯一网络加载需要等待签到后可能有弹窗。4.1.2 代码实现与逐行解读// 引入通用函数库 let { safeClick, waitForElement, logToFile } require(‘/通用函数库/ui_utils.js’); // 1. 启动目标App launchApp(“社区App”); console.log(“已尝试启动社区App”); sleep(3000); // 等待App冷启动时间根据手机性能调整 // 2. 寻找签到入口通常可能在底部Tab或侧边栏 // 方法一通过文本查找最常见 let signButton text(“签到”).findOne(5000); // 等待5秒 if (signButton) { console.log(“找到文本签到按钮”); safeClick(signButton); // 使用封装的安全点击内部包含点击前判断 } else { // 方法二通过控件描述content-desc查找 signButton desc(“签到”).findOne(3000); if (signButton) { console.log(“找到描述签到按钮”); safeClick(signButton); } else { // 方法三通过组合定位比如在某个特定布局内的图片按钮 let parentLayout className(“android.widget.LinearLayout”).depth(10).findOne(2000); if (parentLayout) { signButton parentLayout.findOne(className(“android.widget.ImageView”).clickable(true)); if(signButton) safeClick(signButton); } else { console.error(“未找到签到入口可能页面布局已更新或网络未加载”); // 这里可以加入截图方便后期分析 captureScreen(“/sdcard/脚本日志/签到失败_” new Date().getTime() “.png”); exit(); } } } // 3. 处理签到后状态 sleep(2000); // 等待签到结果页面或弹窗 // 查找表示“已签到”或获得积分的文本 let signedText textMatches(/(已签到|获得\d积分|签到成功)/).findOne(3000); if (signedText) { let msg “签到成功” signedText.text(); console.log(msg); logToFile(“/sdcard/脚本日志/签到记录.txt”, msg); // 记录到文件 toast(msg); // 手机屏幕提示 } else { // 可能签到失败或按钮本身就是“已签到”状态 let alreadySigned text(“已签到”).exists(); if (alreadySigned) { console.log(“今日已签到无需重复操作”); } else { console.warn(“签到状态不明建议手动检查”); } } // 4. 返回并退出可选 back(); // 返回上一页 sleep(1000); home(); // 返回桌面实操心得sleep的时间设置是门艺术。太短页面没加载完太长效率低下。通常根据网络和手机性能在2000-5000毫秒间调整关键操作后必须等待。findOne(timeout)比find()更常用因为它会阻塞等待直到找到或超时逻辑更清晰。永远要有备选定位策略。UI可能会改版不能只依赖一种定位方式。text、desc、id、className组合使用并利用parent()、child()关系来精确定位是写出健壮脚本的关键。4.2 案例深度解构处理列表数据如商品爬虫滚动列表并提取信息是更高级的操作需要处理动态加载和循环。4.2.1 思路滑动 - 查找条目 - 提取信息 - 循环// 假设我们要爬取一个商品列表页的名称和价格 let results []; // 存储结果 let maxScroll 10; // 最大滚动次数防止死循环 let lastContent “”; // 记录上一次列表底部内容用于判断是否已到底 for (let i 0; i maxScroll; i) { // 1. 定位当前屏幕上的所有商品条目通过共同的父控件或类名 // 这里假设每个商品项是一个RelativeLayout里面有两个TextView分别显示名称和价格 let items className(“android.widget.RelativeLayout”).depth(12).find(); console.log(第${i1}屏找到${items.length}个商品项); for (let j 0; j items.length; j) { let item items[j]; // 2. 在条目内查找具体的子控件 let nameObj item.findOne(className(“android.widget.TextView”).index(0)); // 第一个TextView let priceObj item.findOne(className(“android.widget.TextView”).index(1)); // 第二个TextView if (nameObj priceObj) { let name nameObj.text(); let price priceObj.text(); // 去重简单判断实际可能需更复杂逻辑 if (!results.some(r r.name name r.price price)) { results.push({ name, price }); console.log(采集到${name} - ${price}); } } } // 3. 判断是否已滚动到底部 let currentBottomText className(“android.widget.TextView”).textContains(“没有更多了”).findOne(1000); if (currentBottomText) { console.log(“已滚动到列表底部停止采集”); break; } // 4. 向下滑动 let screenHeight device.height; let screenWidth device.width; // 从屏幕中央偏下向上滑动模拟手指滚动 swipe(screenWidth / 2, screenHeight * 0.7, screenWidth / 2, screenHeight * 0.3, 500); sleep(2000); // 等待新内容加载这个时间很关键 // 5. 简易防重复滚动判断比较滚动前后底部区域内容哈希 // 此处省略具体实现可通过获取底部区域控件文本拼接后比较 } // 将结果保存为JSON文件 files.write(“/sdcard/采集数据/商品列表.json”, JSON.stringify(results, null, 2)); console.log(采集结束共获取${results.length}条数据已保存至文件。);注意事项深度depth和索引index这两个属性在定位嵌套控件时极其有用但不同机型、不同App版本可能不同。需要通过布局分析工具实时查看确定。滑动参数swipe的起始和结束坐标、持续时间需要根据具体列表的滚动手感调整。太快可能触发不了加载太慢效率低。加载等待滑动后的sleep时间必须足够新内容加载。对于网络加载慢的情况可以考虑使用waitForElement等待某个新出现的标志性控件。5. 高级议题稳定性、兼容性与安全5.1 应对“无障碍服务自动关闭”这个老大难问题这是AutoJS用户反馈最多的问题之一。服务被系统或安全软件杀掉导致脚本中断。解决思路是“预防为主监控为辅”。预防措施电池优化设置进入手机系统设置 - 电池 - 电池优化或类似名称找到AutoJS设置为“不优化”。自启动管理在手机管家中允许AutoJS自启动。锁定后台多任务界面下拉AutoJS的卡片通常可以锁定显示小锁图标。使用前台服务在脚本开头使用auto.service保持前台运行部分版本支持或使用device.keepScreenOn()保持屏幕常亮也能间接降低被回收概率。监控与恢复方案在脚本主循环或关键节点加入服务状态检查。function checkAccessibilityService() { // 尝试执行一个简单的无障碍操作来检测服务是否存活 try { if (!auto.service) { console.error(“无障碍服务已断开”); toast(“无障碍服务已断开正在尝试重新打开…”); // 尝试跳转到无障碍设置页面 app.startActivity({ action: “android.settings.ACCESSIBILITY_SETTINGS” }); sleep(2000); // 这里无法自动开启需要用户手动点击。可以增加语音提示。 speak(“请手动在设置页面中找到AutoJS并打开开关”); // 等待一段时间假设用户已手动开启 sleep(10000); // 再次检查 if (auto.service) { toast(“服务已恢复继续执行”); return true; } else { toast(“服务恢复失败脚本退出”); exit(); } } return true; } catch (e) { console.error(“检查服务时异常”, e); return false; } } // 在脚本主循环中定期调用 while (true) { if (!checkAccessibilityService()) { break; } // … 你的主要业务逻辑 … sleep(30000); // 每30秒检查一次 }5.2 脚本的兼容性适配你的脚本可能需要在不同分辨率、不同Android版本的手机上运行。坐标与尺寸适配绝对坐标如click(500, 1000)是兼容性杀手。永远优先使用控件定位。如果万不得已要用坐标请使用基于屏幕比例的相对坐标。// 不好的做法 click(500, 1200); // 好的做法 let screenWidth device.width; let screenHeight device.height; click(screenWidth * 0.5, screenHeight * 0.8); // 点击屏幕底部中间区域控件属性适配不同厂商的ROM如小米MIUI、华为EMUI可能会修改标准控件的className或resourceId。多用text和desc这类与视觉相关的属性或者使用bounds()获取位置后结合click进行容错点击。Android版本差异高版本Android对后台启动Activity、悬浮窗权限管理更严格。脚本中涉及启动其他App或弹出悬浮窗时要增加权限检查和处理。5.3 结束App进程的正确姿势有时我们需要在脚本完成后或开始前清理后台以确保环境干净。function forceStopApp(packageName) { // 方法1使用shell命令需要root权限 // let result shell(“am force-stop “ packageName, true); // console.log(“Shell强制停止结果:”, result.code 0 ? “成功” : “失败”); // 方法2使用AutoJS的App类无需root但可能不适用于所有情况 console.log(“正在尝试关闭应用”, packageName); let appName getAppName(packageName); if (appName) { // 先尝试正常回到主页让目标App退到后台 home(); sleep(500); // 打开最近任务多任务界面 recents(); sleep(1000); // 这里无法直接通过代码精确滑动清除因为最近任务界面UI不统一 // 更通用的做法是如果脚本需要纯净环境在脚本开始前手动清理后台。 console.log(“请手动在最近任务界面中滑动清除「” appName “」应用。”); speak(“请手动清理后台应用” appName); sleep(5000); // 等待用户操作 } else { console.log(“未找到包名为” packageName “的应用”); } } // 使用示例 // forceStopApp(“com.tencent.mm”); // 结束微信重要提醒在非root设备上完全通过代码结束其他App进程是非常困难且不稳定的。更常见的做法是在脚本逻辑中通过多次按back()键直到退出App或者结合home()键。设计脚本时应优先考虑在App内部完成操作并正常退出而非强制结束进程。6. 从案例学习到自主开发思维进阶拥有1000个案例最终目的是为了不依赖案例。你需要建立自己的自动化问题解决框架。拆解目标将任何自动化需求拆解为“感知找到什么- 决策如果…那么…- 执行点击、输入等”的循环。寻找稳定锚点在变化的UI中寻找那些相对稳定的元素作为脚本的“锚点”例如底部的导航栏、标题栏、具有唯一性的图标或文本。设计容错与恢复假设每一步都可能失败。查找控件失败怎么办点击后没反应怎么办网络弹窗突然出现怎么办在主要逻辑周围包裹try-catch并为常见异常设计恢复路径如重试、返回上一步、记录日志后跳过。制作你的“瑞士军刀”将安全点击、智能等待、日志管理、状态检查这些通用功能不断优化并沉淀到你的个人函数库中。以后写新脚本就是组合这些“武器”的过程。最后记住自动化脚本的伦理和法律边界。它应该是提升个人效率、完成重复劳动的帮手而不是用于攻击、欺诈或干扰他人服务正常运行的武器。合理使用让技术真正为你服务。本文还有配套的精品资源点击获取
返回列表