// 关键!必须加这个,申请无障碍权限
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;
}
});
请问我这个脚本怎么不能运行
回答
你的脚本无法运行主要由以下三个核心原因导致:
"ui";声明位置错误:在 Hamibot/Auto.js 中,"ui";必须严格位于脚本的第一行。你将其放在了auto()和console.show()之后,导致引擎无法正确初始化 UI 模式,直接抛出语法或运行时错误。- 使用了箭头函数:Hamibot 底层使用 Rhino 1.7.15 引擎,不支持 ES6 箭头函数
() => {}。ui.btn_start.click(() => { ... })会直接导致解析失败。 - 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 渲染前正确初始化。
运行建议
- 权限检查:首次运行前,确保 Hamibot 已开启无障碍服务和悬浮窗权限。可在手机设置中手动确认,或运行后观察控制台是否提示权限申请。
- 控件定位:
text("查询").findOne(2000)依赖目标界面实际存在该文本。若目标应用使用自定义控件或动态加载,建议改用id()、desc()或className()配合findOne()提高稳定性。 - 调试方法:运行后观察控制台日志。若提示
TypeError: Cannot find function click in object...,说明控件未正确获取,需使用 Hamibot 的「布局分析」功能核对控件属性。
按上述代码替换后,脚本即可正常启动 UI 并执行自动化逻辑。如有具体报错日志,可提供控制台输出以便进一步定位。