如何写自动化脚本,要求:描述尽量详细,并说明注意事项

已存档
hhkune5289 · 17 天前

回答

Hamibot AI
1
· 17 天前

自动化脚本编写指南

一、初始化配置

// 文档地址 https://docs.hamibot.com/
// 初始化RootAutomator(需root权限)
var ra = new RootAutomator();
events.on('exit', function() {
    ra.exit();
});

// 配置日志文件(记录操作时间、状态)
var logFile = files.open("/sdcard/automation_log.txt", "a");
function log(msg) {
    var time = new Date().toLocaleString();
    logFile.write(time + " - " + msg + "\n");
    logFile.flush();
}

二、核心操作函数

1. 坐标操作

// 单点点击(推荐使用RootAutomator)
ra.tap(500, 1000); // 点击(500,1000)坐标

// 滑动操作
Swipe(100, 1000, 800, 1000, 500); // 从(100,1000)到(800,1000)滑动,持续500ms

// 复杂手势(需精确坐标)
gesture(1000, [0, 0], [500, 500], [500, 1000]); // 2秒手势路径

2. 应用管理

// 关闭指定应用(示例来自文档4)
function closeApp(appName) {
    var name = getPackageName(appName);
    if (!name && getAppName(appName)) name = appName;
    if (!name) return false;
    
    app.openAppSetting(name);
    text(app.getAppName(name)).waitFor();
    sleep(500);
    
    let forceStop = textMatches(/(.*强.*|.*停.*|.*结.*)/).findOne();
    if(forceStop.enabled()) {
        forceStop.parent().click();
        textMatches(/(.*确.*|.*定.*)/).findOne().click();
        log(app.getAppName(name) + " 已关闭");
        sleep(1000);
        back();
    }
}

3. 控件操作

// 精准控件匹配
var target = text("立即领取").depth(12).findOne(3000);
if(target) {
    click(target.bounds().centerX(), target.bounds().centerY());
} else {
    log("控件未找到");
}

三、开发规范

1. 坐标获取方法

  • 开启开发者选项 → 指针位置(显示实时坐标)
  • 使用截屏工具测量相对坐标
  • 多分辨率适配:使用device.widthdevice.height计算比例坐标

2. 异常处理机制

// 全局异常捕获
try {
    // 核心操作逻辑
} catch(e) {
    log("错误: " + e.message);
    toast("脚本异常中断,请检查设备状态");
}

// 超时控制
var timeout = 10000; // 10秒超时
var startTime = new Date().getTime();
while(!text("预期文本").exists()) {
    if(new Date().getTime() - startTime > timeout) {
        log("等待超时");
        break;
    }
    sleep(500);
}

四、注意事项

1. 权限要求

  • 必须开启无障碍服务权限
  • Root权限需求(坐标操作需root)
  • 显示悬浮窗权限(部分设备需要)

2. 操作规范

  • 每个动作后建议添加sleep(500)防止操作过快
  • 多点触摸使用不同ID区分:
    ra.tap(300, 1000, 1); // 手指1
    ra.tap(700, 1000, 2); // 手指2
    
  • 避免连续快速操作(防止动作队列堆积)

3. 设备差异

  • 不同系统UI层级不同(需要调整控件选择策略)
  • 分辨率差异处理:
    var scale = device.width / 1080; // 以1080p为基准
    var adjustedX = Math.round(500 * scale);
    
  • 厂商定制系统(如MIUI需要手动开启"显示悬浮窗")

4. 调试技巧

  • 使用toast()实时显示调试信息
ℹ️ 本回答由 AI 生成,内容仅供参考