// 文档地址 https://docs.hamibot.com/
"ui"; // 声明使用UI模式
// 1. UI 界面设计
ui.layout(
<vertical padding="16">
<text textSize="18sp" textStyle="bold" textColor="#333333">自动抢购助手</text>
<horizontal marginTop="16">
<text textSize="14sp" layout_weight="1">点击速率 (毫秒/次):</text>
<input id="clickRate" inputType="number" text="500" w="100" />
</horizontal>
<button id="startBtn" text="开始运行" style="Widget.AppCompat.Button.Colored" marginTop="20"/>
<button id="stopBtn" text="停止运行" style="Widget.AppCompat.Button.Colored" />
</vertical>
);
// 2. 全局变量与状态控制
var isRunning = false;
var clickThread = null; // 用于存放运行线程,方便随时停止
// 3. 按钮点击事件
ui.startBtn.on("click", function() {
if (isRunning) {
toast("脚本正在运行中");
return;
}
var rate = parseInt(ui.clickRate.getText());
if (isNaN(rate) || rate < 100) {
toast("速率设置不合理,建议大于100");
return;
}
isRunning = true;
toast("脚本已启动");
// 开启独立线程执行任务,避免阻塞UI界面
clickThread = threads.start(function() {
runAutoClick(rate);
});
});
ui.stopBtn.on("click", function() {
if (clickThread) {
clickThread.interrupt(); // 中断运行线程
clickThread = null;
}
isRunning = false;
toast("脚本已停止");
});
// 4. 核心自动化逻辑
function runAutoClick(rate) {
// 开启无障碍服务
auto.waitFor();
while (isRunning) {
try {
// 尝试查找“立即购买”控件
var btn = text("立即购买").findOnce();
// 如果找不到,可能是隐藏状态,尝试上划页面
if (!btn) {
scrollDown();
sleep(300); // 滑动后稍微等待页面加载
btn = text("立即购买").findOnce();
}
// 找到按钮且可点击,则执行点击
if (btn && btn.clickable()) {
btn.click();
log("成功点击:立即购买");
} else if (btn) {
// 按钮存在但不可点击(clickable为false),尝试获取中心坐标点击
click(btn.bounds().centerX(), btn.bounds().centerY());
log("通过坐标点击:立即购买");
} else {
log("未找到目标按钮,等待下一次检测...");
}
} catch (e) {
log("发生错误: " + e);
}
// 按照设定的速率进行休眠
sleep(rate);
}
}
然后报错信息是:20:11:25.301/E: Error: 需要在ui模式下运行才能使用该函数 (file:///android_asset/modules/ui.js#15)
Error: 需要在ui模式下运行才能使用该函数
at file:///android_asset/modules/ui.js:15:0
at 6a689c3b489ce29a300cbcf4.js:9:0
这个自己写的代码,运行的时候报错,什么叫UI模式下运行?我没找到这个
回答
你的脚本已经用 "ui"; 声明了 UI 模式,但仍然报错 需要在ui模式下运行才能使用该函数,这通常是因为脚本文件头部确实是以 "ui"; 开头的,但实际运行时并没有正确进入 UI 模式。常见原因有:
-
脚本开头不是
"ui";独占一行
Hamibot 的 UI 模式要求脚本的第一行严格是"ui";(可以带双引号或单引号,但不能有注释、空格或其他字符)。你的代码第一行是注释// 文档地址 ...,这就导致脚本被当作普通模式运行,ui.layout等函数自然无法使用。 -
运行方式不正确
如果你是通过“调试”或者从“脚本管理”中直接运行,并且脚本的确以"ui";开头,那应该能进入 UI 界面。如果脚本在后台通过其他脚本调用(如engines.execScriptFile),则也不会自动进入 UI 模式。
解决办法:
将脚本修改为第一行就是 "ui";,不带任何注释。例如:
"ui";
// 后面的代码...
对于你的代码,只需把注释移到 "ui"; 下面即可:
"ui";
// 文档地址 https://docs.hamibot.com/
// 1. UI 界面设计
ui.layout(
...
);
这样修改后,脚本启动时会先弹出 UI 界面,点击按钮后再执行自动化操作,就不会再报错了。