Auto.js 基础知识详解
一、Auto.js 简介
Auto.js 是一款基于 JavaScript 的自动化脚本工具,主要运行在 Android 平台上。它不需要 root 权限即可实现许多自动化操作,如点击、滑动、输入文字等。Auto.js 最初由国内开发者开发,后来开源并衍生出多个版本,如 Auto.js Pro、AutoX.js 等。
1.1 Auto.js 的主要特点
- 无需 root 权限:大多数基础功能不需要 root 权限即可使用
- 基于 JavaScript:使用简单易学的 JavaScript 语言编写脚本
- 丰富的 API:提供大量针对 Android 设备的 API
- 可视化界面:内置编辑器,方便编写和调试脚本
- 多线程支持:可以同时运行多个脚本
- 图像识别:支持基于图像的控件识别和操作
1.2 Auto.js 的应用场景
- 自动化测试
- 游戏辅助
- 日常任务自动化(如微信自动回复、自动打卡等)
- 批量处理重复性手机操作
- 数据采集和监控
二、Auto.js 开发环境搭建
2.1 安装 Auto.js
Auto.js 有多个版本可供选择:
- Auto.js 4.1.1:最后开源的免费版本
- Auto.js Pro:商业化版本,功能更强大
- AutoX.js:社区维护的开源分支
建议从官方或可信渠道下载安装包进行安装。
2.2 开发工具配置
Auto.js 内置了代码编辑器,但也可以使用外部编辑器如 VSCode 进行开发:
-
使用内置编辑器:
- 打开 Auto.js 应用
- 点击"+"号新建脚本
- 使用内置编辑功能编写代码
-
使用 VSCode 开发:
- 安装 VSCode 插件"Auto.js-VSCodeExt"
- 配置连接手机或模拟器
- 通过 WiFi 或 USB 调试连接设备
2.3 第一个 Auto.js 脚本
// 显示一个提示框
toast("Hello Auto.js");
// 等待3秒
sleep(3000);
// 点击屏幕坐标(500, 500)
click(500, 500);
将上述代码保存为 demo.js
并运行,即可看到效果。
三、Auto.js 基础语法
3.1 JavaScript 基础
Auto.js 使用 JavaScript 作为脚本语言,因此需要掌握 JavaScript 的基本语法:
-
变量声明:
var a = 10; // 传统方式 let b = 20; // 块级作用域 const c = 30; // 常量
-
数据类型:
// 基本类型 let str = "字符串"; let num = 123; let bool = true; let nul = null; let undef = undefined; // 对象类型 let obj = {key: "value"}; let arr = [1, 2, 3];
-
函数:
function add(a, b) { return a + b; } // 箭头函数 const multiply = (a, b) => a * b;
3.2 Auto.js 特有语法
-
全局函数:
Auto.js 提供了许多全局函数,如click()
,swipe()
,sleep()
等。 -
模块导入:
可以使用require()
导入其他脚本或模块:const app = require('app'); const device = require('device');
-
事件监听:
// 按键监听 events.on("key", function(code, event){ toast("按键码: " + code); });
四、Auto.js 常用 API
4.1 设备控制 API
-
屏幕操作:
// 获取屏幕尺寸 let width = device.width; let height = device.height; // 点击屏幕 click(x, y); // 长按 press(x, y, duration); // 滑动 swipe(x1, y1, x2, y2, duration);
-
按键操作:
// 返回键 back(); // Home键 home(); // 电源键 power(); // 按下音量上键 keyCode("volume_up");
-
传感器:
// 获取亮度 let brightness = device.getBrightness(); // 设置亮度 device.setBrightness(0.5); // 获取电池信息 let battery = device.getBattery();
4.2 UI 操作 API
-
选择器 API:
// 通过文本查找控件 let btn = text("确定").findOne(); btn.click(); // 通过ID查找 id("com.example:id/button").click(); // 通过类名查找 className("android.widget.Button").findOne().click();
-
控件操作:
// 获取控件信息 let bounds = btn.bounds(); let text = btn.text(); let desc = btn.desc(); // 操作控件 btn.click(); btn.longClick(); btn.setText("新文本");
-
等待控件出现:
// 等待最多10秒直到控件出现 let btn = text("确定").waitFor(); // 超时处理 try { let btn = text("确定").timeout(5000).findOne(); } catch(e) { toast("未找到按钮"); }
4.3 应用管理 API
-
启动和关闭应用:
// 启动应用 app.launch("com.tencent.mm"); // 微信 // 关闭应用 app.forceStop("com.tencent.mm");
-
获取应用信息:
// 获取当前应用包名 let current = currentPackage(); // 获取所有安装的应用 let appList = app.getInstalledApps(); // 获取应用版本 let version = app.getAppVersion("com.tencent.mm");
-
剪贴板操作:
// 设置剪贴板内容 setClip("文本内容"); // 获取剪贴板内容 let content = getClip();
4.4 文件系统 API
-
文件读写:
// 读取文件 let content = files.read("/sdcard/1.txt"); // 写入文件 files.write("/sdcard/1.txt", "内容"); // 追加内容 files.append("/sdcard/1.txt", "追加内容");
-
文件管理:
// 检查文件是否存在 let exists = files.exists("/sdcard/1.txt"); // 创建目录 files.create("/sdcard/new_dir"); // 删除文件 files.remove("/sdcard/1.txt");
-
路径操作:
// 连接路径 let path = files.join("/sdcard", "dir", "file.txt"); // 获取文件名 let name = files.getName("/sdcard/1.txt");
4.5 多线程 API
-
启动线程:
// 启动新线程 threads.start(function(){ while(true){ log("子线程运行中"); sleep(1000); } });
-
线程间通信:
// 在主线程中 let thread = threads.start(function(){ events.on("message", function(msg){ toast("收到消息: " + msg); }); }); // 向线程发送消息 thread.postMessage("Hello");
-
线程池:
// 使用线程池 let pool = threads.disposable(); pool.execute(function(){ // 任务代码 });
五、图像识别与颜色匹配
5.1 基础图像识别
-
截图操作:
// 截取屏幕 let img = captureScreen(); // 保存截图 images.save(img, "/sdcard/screenshot.png");
-
找图找色:
// 在屏幕中找图 let result = findImage(captureScreen(), "/sdcard/template.png"); if(result){ click(result.x, result.y); } // 找色 let point = findColor(captureScreen(), "#ff0000");
-
颜色判断:
// 获取某点颜色 let color = images.pixel(captureScreen(), 100, 200); // 判断颜色相似度 let similar = images.isSimilar(color, "#ff0000", 10);
5.2 高级图像处理
-
图像处理函数:
// 灰度化 let grayImg = images.grayscale(img); // 二值化 let binaryImg = images.threshold(img, 100); // 裁剪 let cropImg = images.clip(img, 0, 0, 100, 100);
-
模板匹配:
// 带阈值的模板匹配 let result = images.matchTemplate(img, template, { threshold: 0.8 });
-
特征匹配:
// 特征点匹配 let detector = new images.FeatureDetector(); let keyPoints = detector.detect(img);
六、实战案例
6.1 微信自动点赞
// 启动微信
app.launch("com.tencent.mm");
// 等待朋友圈加载
sleep(3000);
// 点击发现
click(device.width / 2, device.height - 100);
// 点击朋友圈
sleep(1000);
click(device.width / 2, 500);
// 循环点赞
while(true){
// 查找未点赞的朋友圈
let like = desc("已点赞").findOne(1000);
if(!like){
// 查找点赞按钮
let btn = desc("赞").findOne(1000);
if(btn){
btn.click();
toast("点赞成功");
}
}
// 下滑
swipe(device.width / 2, device.height * 0.8,
device.width / 2, device.height * 0.2, 500);
sleep(2000);
}
6.2 自动刷短视频
// 启动抖音
app.launch("com.ss.android.ugc.aweme");
// 等待加载
sleep(5000);
// 循环刷视频
for(let i = 0; i < 50; i++){
// 随机观看时间3-8秒
let watchTime = random(3000, 8000);
sleep(watchTime);
// 上滑
swipe(device.width / 2, device.height * 0.8,
device.width / 2, device.height * 0.2, 300);
// 随机点赞
if(random(0, 10) > 7){
click(device.width - 100, device.height - 300);
sleep(500);
}
}
6.3 自动化签到脚本
// 多个应用签到
function signInAll(){
// 微博签到
signInWeibo();
// 贴吧签到
signInTieba();
// 其他应用签到...
}
function signInWeibo(){
app.launch("com.sina.weibo");
sleep(5000);
// 查找签到按钮
let signBtn = text("签到").findOne(3000);
if(signBtn){
signBtn.click();
toast("微博签到成功");
} else {
toast("微博已签到或未找到按钮");
}
// 返回桌面
home();
}
function signInTieba(){
app.launch("com.baidu.tieba");
sleep(5000);
// 进入我的贴吧
click(device.width - 100, device.height - 100);
sleep(2000);
// 一键签到
let signAll = text("一键签到").findOne(3000);
if(signAll){
signAll.click();
toast("贴吧签到成功");
} else {
toast("贴吧已签到或未找到按钮");
}
// 返回桌面
home();
}
// 执行签到
signInAll();
七、调试与优化
7.1 调试技巧
-
日志输出:
console.log("调试信息"); console.show(); // 显示控制台
-
截图调试:
// 在出错时截图 try { // 可能出错的代码 } catch(e){ images.save(captureScreen(), "/sdcard/error.png"); }
-
性能分析:
// 计时 console.time("操作"); // 执行操作... console.timeEnd("操作"); // 输出耗时
7.2 脚本优化
-
减少不必要的操作:
// 优化前 click(100, 100); sleep(1000); click(200, 200); // 优化后 - 只在需要时等待 click(100, 100); let btn = id("next").findOne(1000); if(btn) btn.click();
-
使用选择器代替坐标:
// 不推荐 - 容易因分辨率变化失效 click(500, 500); // 推荐 - 使用控件选择器 text("确定").findOne().click();
-
合理使用多线程:
// 主线程处理UI // 子线程处理耗时操作 threads.start(function(){ let data = fetchData(); ui.post(() => { updateUI(data); }); });
7.3 异常处理
-
try-catch 捕获异常:
try { autoOperation(); } catch(e) { console.error("出错:", e); // 恢复操作 home(); }
-
超时处理:
// 设置操作超时 function withTimeout(action, timeout) { let done = false; threads.start(function(){ action(); done = true; }); let start = new Date().getTime(); while(!done && new Date().getTime() - start < timeout){ sleep(200); } if(!done) throw new Error("操作超时"); }
-
自动恢复机制:
function retry(action, maxRetry) { let lastError; for(let i = 0; i < maxRetry; i++){ try { return action(); } catch(e) { lastError = e; sleep(1000); // 恢复状态 home(); } } throw lastError; }
八、安全与权限
8.1 权限管理
-
必要权限:
- 无障碍服务权限
- 悬浮窗权限
- 存储权限
- 通知监听权限(可选)
-
检查权限:
// 检查无障碍服务 if(!auto.service) { toast("请开启无障碍服务"); app.startActivity({ action: "android.settings.ACCESSIBILITY_SETTINGS" }); exit(); }
-
请求权限:
// 请求存储权限 if(!requestPermission("storage")){ toast("存储权限被拒绝"); exit(); }
8.2 脚本安全
-
代码混淆:
// 使用工具对脚本进行混淆 // 防止简单反编译
-
敏感信息保护:
// 不要将密码等敏感信息直接写在脚本中 // 使用外部加密配置文件 let config = files.read("/sdcard/config.enc");
-
脚本签名:
// 对重要脚本进行签名 // 验证脚本来源
8.3 使用限制
-
防检测机制:
// 随机化操作间隔 function randomClick(x, y){ sleep(random(300, 1500)); click(x, y); }
-
操作随机化:
// 随机滑动路径 function randomSwipe(x1, y1, x2, y2){ let steps = random(5, 20); let points = []; // 生成随机路径点... gesture(random(500, 1500), points); }
-
使用代理:
// 设置网络代理 if(needProxy){ $http.setProxy("127.0.0.1", 8888); }
九、进阶主题
9.1 插件开发
-
创建插件:
// plugin.js module.exports = { add: function(a, b) { return a + b; }, version: "1.0.0" }; // 使用插件 const plugin = require("./plugin.js"); plugin.add(1, 2);
-
发布插件:
- 将插件代码打包
- 提供文档和示例
- 发布到社区或私有仓库
9.2 原生交互
-
调用 Android API:
// 通过JavaAdapter调用Java方法 let Uri = android.net.Uri; let intent = new android.content.Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com")); app.startActivity(intent);
-
编写 Java 扩展:
// 通过Rhino引擎扩展Java功能 public class MyExtension { public static String getDeviceInfo() { return Build.MODEL; } }
9.3 网络请求
-
HTTP 请求:
// GET请求 let res = http.get("http://www.example.com"); console.log(res.body.string()); // POST请求 let res = http.post("http://www.example.com", { data: {key: "value"} });
-
WebSocket:
let ws = new WebSocket("ws://example.com/ws"); ws.on("open", () => { ws.send("Hello"); }); ws.on("message", (msg) => { toast("收到消息: " + msg); });
9.4 OCR 识别
-
使用 OCR 插件:
const ocr = require("ocr"); let result = ocr.recognize(captureScreen()); console.log(result.text);
-
离线 OCR:
// 使用Tesseract等引擎 let tess = new Tesseract("/sdcard/tessdata/chi_sim.traineddata"); let text = tess.recognize(img);
十、资源与社区
10.1 学习资源
-
官方文档:
- Auto.js 官方文档(GitHub)
- Auto.js Pro 文档
- AutoX.js 文档
-
开源项目:
- GitHub 上的 Auto.js 相关项目
- 脚本仓库
-
教程与博客:
- CSDN、简书等技术社区
- B站、YouTube 视频教程
10.2 常见问题
-
脚本不执行:
- 检查无障碍服务是否开启
- 检查 Auto.js 是否被系统杀死
- 检查脚本是否有语法错误
-
控件找不到:
- 使用控制台查看布局层次
- 尝试不同的选择策略
- 增加等待时间
-
性能问题:
- 减少不必要的截图和找图操作
- 优化选择器
- 使用多线程分担任务
10.3 社区支持
-
论坛与群组:
- Auto.js 官方论坛
- QQ、Telegram 交流群
- GitHub Issues
-
贡献代码:
- 参与开源项目开发
- 提交问题和建议
- 编写文档和教程
-
商业支持:
- 定制脚本开发
- 企业级解决方案
- 培训服务
结语
Auto.js 是一个功能强大且灵活的 Android 自动化工具,通过 JavaScript 脚本可以实现各种自动化操作。本教程详细介绍了 Auto.js 的基础知识、常用 API、实战案例以及进阶主题,希望能够帮助读者快速掌握 Auto.js 的使用。