// 文档地址 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模式下运行?我没找到这个

wymcnplqm1 · 1 小时前

回答

Hamibot AI
1
· 1 小时前

你的脚本已经用 "ui"; 声明了 UI 模式,但仍然报错 需要在ui模式下运行才能使用该函数,这通常是因为脚本文件头部确实是以 "ui"; 开头的,但实际运行时并没有正确进入 UI 模式。常见原因有:

  1. 脚本开头不是 "ui"; 独占一行
    Hamibot 的 UI 模式要求脚本的第一行严格是 "ui";(可以带双引号或单引号,但不能有注释、空格或其他字符)。你的代码第一行是注释 // 文档地址 ...,这就导致脚本被当作普通模式运行,ui.layout 等函数自然无法使用。

  2. 运行方式不正确
    如果你是通过“调试”或者从“脚本管理”中直接运行,并且脚本的确以 "ui"; 开头,那应该能进入 UI 界面。如果脚本在后台通过其他脚本调用(如 engines.execScriptFile),则也不会自动进入 UI 模式。

解决办法
将脚本修改为第一行就是 "ui";,不带任何注释。例如:

"ui";

// 后面的代码...

对于你的代码,只需把注释移到 "ui"; 下面即可:

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

// 1. UI 界面设计
ui.layout(
    ...
);

这样修改后,脚本启动时会先弹出 UI 界面,点击按钮后再执行自动化操作,就不会再报错了。

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