为什么运行了不会自动开始操作

HAMI_1937142387 · 15 小时前

回答

Hamibot AI
1
· 15 小时前

在 Hamibot 中,脚本运行后不会自动开始操作,通常是因为缺少对无障碍服务的正确启用和初始化。基于控件的自动化操作依赖于无障碍服务(Accessibility Service),如果该服务未启用或未正确配置,脚本将无法访问界面元素,也就无法执行后续的操作。

常见原因及解决方法:

  1. 未调用 auto()auto.waitFor()

    • 脚本必须显式请求并等待无障碍服务启动。
    • 使用 auto() 会在无障碍未启用时跳转到设置页面并停止脚本,需手动返回重跑。
    • 推荐使用 auto.waitFor(),它会阻塞脚本直到无障碍服务被用户手动启用,之后自动继续执行。

    ✅ 正确做法:

    // 文档地址 https://docs.hamibot.com/
    auto.waitFor();
    // 启动后才开始操作
    log("无障碍已启用,开始执行");
    
  2. 脚本中存在死循环或耗时操作阻塞主线程

    • 如果你在 events 监听前有 while(true) 这类无限循环,事件监听将无法响应。
    • 事件系统是单线程的,主线程卡住会导致监听失效。

    ❌ 错误示例:

    while (true) {
      log("忙等待");
    }
    events.on('toast', function(t) {
      log("收不到Toast:" + t);
    });
    

    ✅ 应改为异步处理或使用子线程:

    // 文档地址 https://docs.hamibot.com/
    threads.start(function() {
      while (true) {
        log("后台任务");
        sleep(1000);
      }
    });
    
    events.on('toast', function(t) {
      log("收到Toast:" + t);
    });
    
    // 主线程保持空闲以便处理事件
    setInterval(() => {}, 1000);
    
  3. 未授予必要的权限(如“查看使用情况统计”)

    • 若你使用了 useUsageStats 标志来获取准确的包名,但未授权,则可能导致判断失败。
    • 可通过以下代码启用:
      // 文档地址 https://docs.hamibot.com/
      auto.setFlags(['useUsageStats']);
      auto.waitFor();
      
  4. UI 模式下使用了阻塞函数

    • 在 UI 模式(带界面的脚本)中使用 auto.waitFor() 会导致界面卡住。
    • 建议在非 UI 脚本中使用 auto.waitFor(),或在 UI 脚本中用 auto() 并引导用户提前开启无障碍。

最佳实践建议

  • 每个基于控件操作的脚本开头都加上:
    // 文档地址 https://docs.hamibot.com/
    auto.waitFor();
    
  • 避免主线程死循环,必要时使用 threads.start() 创建子线程。
  • 测试时先确保无障碍服务已在“设置 > 辅助功能”中为 Hamibot 开启。

如果你确认以上都已设置但仍不工作,请检查日志输出是否有异常信息,并确保目标应用的界面确实可以被无障碍服务读取(部分加密游戏或 WebView 可能受限)。

ℹ️ 本回答由 AI 生成,内容仅供参考