// 关键!必须加这个,申请无障碍权限
auto();
// 日志悬浮窗,方便你看运行情况
console.show();

// --- 你的UI代码保留,主逻辑分开写 ---
"ui";
ui.layout(
<vertical padding="16">
<text text="号码自动查询工具" textSize="20" textColor="#000000" margin="10"/>
<linear padding="12" margin="10" bg="#f0f0f0" corner="8">
<vertical>
<text text="目标应用包名:"/>
<text id="tv_pkg" text="com.xxx.xxx"/>
<text text="数据目录:"/>
<text id="tv_path" text="/sdcard/xxx/"/>
</vertical>
</linear>
<horizontal>
<input id="et_file_path" hint="选择数据文件" w="*"/>
<button id="btn_start" text="开始运行" w="auto" bg="#2196F3" color="#fff"/>
</horizontal>
</vertical>
);

// --- 主脚本逻辑 ---
let running = false;

ui.btn_start.click(() => {
if (running) {
toast("脚本正在运行");
return;
}
running = true;
// 开新线程跑脚本,防止UI卡死
threads.start(function() {
mainTask();
});
});

function mainTask() {
toast("脚本开始运行");
while (running) {
// 你的自动化逻辑写在这里
// 比如:查找控件、点击、循环查询
let queryBtn = text("查询").findOne(2000);
if (queryBtn) {
queryBtn.click();
console.log("点击了查询按钮");
} else {
console.log("未找到查询按钮");
}
sleep(1000);
}
toast("脚本已停止");
}

// 监听返回键,停止脚本
events.observeKey();
events.onKeyDown("back", function(event) {
if (running) {
running = false;
toast("脚本已停止");
event.consumed = true;
}
});
请问我这个脚本怎么不能运行

HAMI_0281560656 · 5 天前

回答

Hamibot AI
1
· 5 天前

你的脚本无法运行主要由以下三个核心原因导致:

  1. "ui"; 声明位置错误:在 Hamibot/Auto.js 中,"ui"; 必须严格位于脚本的第一行。你将其放在了 auto()console.show() 之后,导致引擎无法正确初始化 UI 模式,直接抛出语法或运行时错误。
  2. 使用了箭头函数:Hamibot 底层使用 Rhino 1.7.15 引擎,不支持 ES6 箭头函数 () => {}ui.btn_start.click(() => { ... }) 会直接导致解析失败。
  3. UI 模式下事件监听冲突events.observeKey() 适用于纯脚本模式。在 "ui"; 模式下,按键事件应通过 ui.emitter 监听,否则可能无法触发或与 UI 线程冲突。

以下是修正后可直接运行的完整代码:

// 文档地址 https://docs.hamibot.com/
"ui";

auto();
console.show();

ui.layout(
    <vertical padding="16">
        <text text="号码自动查询工具" textSize="20" textColor="#000000" margin="10"/>
        <linear padding="12" margin="10" bg="#f0f0f0" corner="8">
            <vertical>
                <text text="目标应用包名:"/>
                <text id="tv_pkg" text="com.xxx.xxx"/>
                <text text="数据目录:"/>
                <text id="tv_path" text="/sdcard/xxx/"/>
            </vertical>
        </linear>
        <horizontal>
            <input id="et_file_path" hint="选择数据文件" w="*"/>
            <button id="btn_start" text="开始运行" w="auto" bg="#2196F3" color="#fff"/>
        </horizontal>
    </vertical>
);

let running = false;

ui.btn_start.click(function() {
    if (running) {
        toast("脚本正在运行");
        return;
    }
    running = true;
    threads.start(function() {
        mainTask();
    });
});

function mainTask() {
    toast("脚本开始运行");
    while (running) {
        let queryBtn = text("查询").findOne(2000);
        if (queryBtn) {
            queryBtn.click();
            console.log("点击了查询按钮");
        } else {
            console.log("未找到查询按钮");
        }
        sleep(1000);
    }
    toast("脚本已停止");
}

// UI 模式下使用 ui.emitter 监听返回键
ui.emitter.on("back_pressed", function(event) {
    if (running) {
        running = false;
        toast("脚本已停止");
        event.consumed = true; // 阻止默认退出行为,保持界面可见
    }
});

关键修改说明

  • 首行声明"ui"; 已移至第一行,确保引擎以 UI 模式启动。
  • 函数语法:所有 () => {} 已替换为 function() {},完全兼容 Rhino 1.7.15。
  • 返回键监听:改用 ui.emitter.on("back_pressed", ...),这是 UI 模式的标准事件绑定方式,避免线程阻塞。
  • 执行顺序优化auto()console.show() 放在 "ui"; 之后、布局之前,确保无障碍服务与悬浮窗在 UI 渲染前正确初始化。

运行建议

  1. 权限检查:首次运行前,确保 Hamibot 已开启无障碍服务悬浮窗权限。可在手机设置中手动确认,或运行后观察控制台是否提示权限申请。
  2. 控件定位text("查询").findOne(2000) 依赖目标界面实际存在该文本。若目标应用使用自定义控件或动态加载,建议改用 id()desc()className() 配合 findOne() 提高稳定性。
  3. 调试方法:运行后观察控制台日志。若提示 TypeError: Cannot find function click in object...,说明控件未正确获取,需使用 Hamibot 的「布局分析」功能核对控件属性。

按上述代码替换后,脚本即可正常启动 UI 并执行自动化逻辑。如有具体报错日志,可提供控制台输出以便进一步定位。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实