控制器失灵 更改并完善速率调整不了的问题
取消控制器数量选择
优化控制器不可移动的问题
优化控制器界面
优化源代码
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);
控制器依旧不可以正常运行
回答
文档地址 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();
}
// 启用触摸控制并启用拖动功能
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("启动任务