控制器失灵 更改并完善速率调整不了的问题
取消控制器数量选择
优化控制器不可移动的问题
优化控制器界面
优化源代码
var config = {
delay: 200, // 点击间隔(毫秒)
buyCount: 1 // 购买数量
};

// 创建浮动窗口(最小化UI结构)
var win = floaty.rawWindow(
<vertical padding="16" bg="#EEEEEE">
<horizontal gravity="center">
<text text="速率:" textColor="#444444"/>
<input id="delayInput" text="200" w="60"/>
<text text="ms"/>
</horizontal>
<seekbar id="seekBar" progress="200" max="500"/>

    <radiogroup id="buyGroup">
        <radio text="购买1个" checked="true"/>
        <radio text="购买整盒"/>
    </radiogroup>
    
    <horizontal gravity="center" margin="10 0">
        <button id="startBtn" text="开始" w="80"/>
        <button id="pauseBtn" text="暂停" w="80"/>
    </horizontal>
</vertical>

);

// 验证悬浮窗是否创建成功
if (!win) {
toast("悬浮窗创建失败,请重启Hamibot后重试");
exit();
}

// 设置悬浮窗特性
win.setPosition(100, 200); // 初始位置
win.setTouchable(true); // 允许触控

// 初始化UI控件(带容错处理)
(function initUI() {
try {
// 绑定滑动条与输入框
win.seekBar.progress = config.delay;
win.delayInput.text = config.delay.toString();

    // 事件绑定
    win.seekBar.on("progresschanged", function(progress) {
        config.delay = progress;
        win.delayInput.setText(progress.toString());
    });
    
    win.delayInput.on("textchanged", function(text) {
        let val = parseInt(text) || 0;
        val = Math.min(500, Math.max(0, val));
        config.delay = val;
        win.seekBar.setProgress(val);
    });
    
    // 购买数量选择
    win.buyGroup.setOnCheckedChangeListener(function(group, id) {
        config.buyCount = id == 0 ? 1 : 10;  // 假设整盒为10个
    });
    
} catch (e) {
    log("UI初始化错误: " + e.message);
}

})();

// 控制逻辑模块
var controller = {
running: false,

start() {
    if (this.running) return;
    this.running = true;
    
    // 在独立线程中执行任务
    threads.start(this.mainLoop.bind(this));
},

stop() {
    this.running = false;
    toast("任务已暂停");
},

mainLoop() {
    while (this.running) {
        try {
            // 获取最新配置
            let delay = config.delay;
            
            // 优先级按钮检测
            const checkButton = (texts, sleepTime) => {
                for (let text of texts) {
                    let el = text(text).findOne(50);
                    if (el) {
                        log(`点击: ${text}`);
                        el.click();
                        sleep(sleepTime);
                        return true;
                    }
                }
                return false;
            };
            
            // 按优先级执行检测
            if (!checkButton(["就是这家", "确认无误"], 500)) {
                if (!checkButton(["确认信息并支付"], 500)) {
                    if (!checkButton(["确定"], 100)) {
                        if (!checkButton(["立即购买"], 500)) {
                            // 配送方式检测
                            checkButton(["送到家", "到店取"], delay);
                        }
                    }
                }
            }
            
            // 自适应延迟
            sleep(Math.max(50, delay * 0.8));
            
        } catch (e) {
            log("运行错误: " + e.message);
            sleep(1000);
        }
    }
}

};

// 按钮点击事件绑定
(function bindButtons() {
win.startBtn.click(() => {
controller.start();
});

win.pauseBtn.click(() => {
    controller.stop();
});

})();

toast("控制器已启动");
log("悬浮窗状态: " + (win.visible ? "可见" : "不可见"));

// 保持脚本运行
setInterval(() => {}, 1000);

已存档
krawfndbai · 1 个月前
第 1 条补充
·
1 个月前

控制器依旧不可以正常运行

回答

Hamibot AI
1
· 1 个月前

文档地址 https://docs.hamibot.com/

已针对以下需求进行优化:

  1. 修复速率调节失效问题
  2. 移除购买数量选择控件
  3. 增加悬浮窗拖拽功能
  4. 优化界面布局与交互

优化后的脚本代码如下:

var config = {
    delay: 200,       // 点击间隔(毫秒)
};

// 创建可拖动的浮动窗口
var win = floaty.window(
    <vertical padding="16" bg="#EEEEEE">
        <horizontal gravity="center">
            <text text="速率:" textColor="#444444"/>
            <input id="delayInput" text="200" w="60"/>
            <text text="ms"/>
        </horizontal>
        
        <seekbar id="seekBar" progress="200" max="1000"/>
        
        <horizontal gravity="center" margin="10 0">
            <button id="startBtn" text="开始" w="80"/>
            <button id="pauseBtn" text="暂停" w="80"/>
        </horizontal>
        
        // 添加拖动提示图标
        <text textSize="16sp" textColor="#888">⇅ 拖动调整位置</text>
    </vertical>
);

if (!win) {
    toast("悬浮窗创建失败,请重启Hamibot后重试");
    exit();
}

// 启用触摸控制并启用拖动功能
win.setTouchable(true);
let x = 0, y = 0;
let windowX = 100, windowY = 200;

// 触摸事件处理
win.setOnTouchListener(function(view, event){
    switch(event.getAction()){
        case event.ACTION_DOWN:
            x = event.getRawX();
            y = event.getRawY();
            break;
        case event.ACTION_MOVE:
            let nowX = event.getRawX();
            let nowY = event.getRawY();
            windowX += nowX - x;
            windowY += nowY - y;
            win.setPosition(windowX, windowY);
            x = nowX;
            y = nowY;
            break;
    }
    return true;
});

// 设置初始位置
win.setPosition(windowX, windowY);

(function initUI() {
    try {
        // 扩展调节范围
        win.seekBar.progress = config.delay;
        win.delayInput.text = config.delay.toString();
        
        // 双向绑定滑动条和输入框
        win.seekBar.on("progresschanged", function(progress) {
            config.delay = progress;
            win.delayInput.setText(progress.toString());
        });
        
        win.delayInput.on("textchanged", function(text) {
            let val = parseInt(text) || 0;
            val = Math.min(1000, Math.max(0, val));
            config.delay = val;
            win.seekBar.setProgress(val);
        });
        
    } catch (e) {
        log("UI初始化错误: " + e.message);
    }
})();

// 控制逻辑模块
var controller = {
    running: false,
    
    start() {
        if (this.running) return;
        this.running = true;
        threads.start(this.mainLoop.bind(this));
    },
    
    stop() {
        this.running = false;
        toast("任务已暂停");
    },
    
    mainLoop() {
        while (this.running) {
            try {
                const checkButton = (texts, sleepTime) => {
                    for (let text of texts) {
                        let el = text(text).findOne(50);
                        if (el) {
                            log(`点击: ${text}`);
                            el.click();
                            sleep(sleepTime);
                            return true;
                        }
                    }
                    return false;
                };
                
                if (!checkButton(["就是这家", "确认无误"], 500)) {
                    if (!checkButton(["确认信息并支付"], 500)) {
                        if (!checkButton(["确定"], 100)) {
                            if (!checkButton(["立即购买"], 500)) {
                                checkButton(["送到家", "到店取"], config.delay);
                            }
                        }
                    }
                }
                
                sleep(Math.max(50, config.delay * 0.8));
                
            } catch (e) {
                log("运行错误: " + e.message);
                sleep(1000);
            }
        }
    }
};

(function bindButtons() {
    win.startBtn.click(() => {
        controller.start();
    });
    
    win.pauseBtn.click(() => {
        controller.stop();
    });
})();

toast("增强型控制器已启动");
log("悬浮窗状态: " + (win.visible ? "可见" : "不可见"));

setInterval(() => {}, 1000);

主要优化点说明:


补充回答 1

文档地址 https://docs.hamibot.com/

针对控制器无法运行的问题,已进行以下深度优化:

var config = {
    delay: 200,       // 点击间隔(毫秒)
};

// 创建可拖动浮动窗口
var win = floaty.window(
    <vertical padding="16" bg="#EEEEEE">
        <horizontal gravity="center">
            <text text="速率:" textColor="#444444"/>
            <input id="delayInput" text="200" w="60"/>
            <text text="ms"/>
        </horizontal>
        
        <seekbar id="seekBar" progress="200" max="1000"/>
        
        <horizontal gravity="center" margin="10 0">
            <button id="startBtn" text="开始" w="80"/>
            <button id="pauseBtn" text="暂停" w="80"/>
        </horizontal>
        
        <text textSize="16sp" textColor="#888">⇅ 拖动调整位置</text>
    </vertical>
);

// 增加悬浮窗有效性检查
if (!win) {
    toast("悬浮窗创建失败,请重启Hamibot后重试");
    exit();
}

// 悬浮窗拖动逻辑改进
(function setupDrag() {
    let x = 0, y = 0, windowX = 100, windowY = 200;
    win.setOnTouchListener(function(view, event){
        switch(event.getAction()){
            case event.ACTION_DOWN:
                x = event.getRawX();
                y = event.getRawY();
                break;
            case event.ACTION_MOVE:
                let nowX = event.getRawX();
                let nowY = event.getRawY();
                windowX += nowX - x;
                windowY += nowY - y;
                win.setPosition(windowX, windowY);
                x = nowX;
                y = nowY;
                break;
        }
        return true;
    });
    win.setPosition(windowX, windowY);
})();

// UI初始化增强
(function initUI() {
    try {
        // 初始化组件状态
        win.seekBar.setProgress(config.delay);
        win.delayInput.setText(config.delay.toString());
        
        // 滑动条事件绑定
        win.seekBar.on("progresschanged", function(progress) {
            config.delay = progress;
            win.delayInput.setText(progress.toString());
        });
        
        // 输入框校验逻辑
        win.delayInput.on("textchanged", function(text) {
            let val = parseInt(text) || 0;
            val = Math.min(1000, Math.max(0, val));
            config.delay = val;
            win.seekBar.setProgress(val);
        });
        
    } catch (e) {
        toast("UI初始化失败: " + e.message);
        log("UI初始化错误: " + e);
    }
})();

// 控制器核心逻辑优化
var controller = {
    running: false,
    
    start() {
        if (this.running) return;
        this.running = true;
        // 使用独立线程执行
        threads.start(this.mainLoop.bind(this));
        toast("任务已启动");
    },
    
    stop() {
        this.running = false;
        toast("任务暂停");
    },
    
    mainLoop() {
        while (this.running) {
            try {
                // 增强型元素检测
                const checkButton = (texts, sleepTime) => {
                    for (let text of texts) {
                        // 增加查找超时时间
                        let el = text(text).waitFor(200);
                        if (el) {
                            log(`点击: ${text}`);
                            el.click();
                            sleep(sleepTime);
                            return true;
                        }
                    }
                    return false;
                };
                
                // 执行按钮检测流程
                if (!checkButton(["就是这家", "确认无误"], 500)) {
                    if (!checkButton(["确认信息并支付"], 500)) {
                        if (!checkButton(["确定"], 100)) {
                            if (!checkButton(["立即购买"], 500)) {
                                checkButton(["送到家", "到店取"], config.delay);
                            }
                        }
                    }
                }
                
                // 动态延迟控制
                let randomDelay = Math.max(50, config.delay * 0.8 + Math.random() * 100);
                sleep(randomDelay);
                
            } catch (e) {
                toast("运行异常: " + e.message);
                log("主循环错误: " + e);
                sleep(2000);
            }
        }
    }
};

// 按钮事件绑定加强
(function bindButtons() {
    // 增加点击反馈
    win.startBtn.click(() => {
        toast("启动任务
ℹ️ 本回答由 AI 生成,内容仅供参考