// 文档地址 https://docs.hamibot.com/
var isRunning = false;
var window = floaty.window(
<frame gravity="center" bg="#80000000">
<vertical padding="20" bg="#FFFFFFFF" radius="10">
<text id="title" text="猫群专属" textSize="18sp" textColor="#000000" gravity="center"/>
<RadioGroup>
<RadioButton id="pumao" text="普茅" checked/>
<RadioButton id="mamao" text="马茅"/>
</RadioGroup>
<horizontal marginTop="20">
<button id="ok" text="开始" width="80" bg="#47a3ed" textColor="#FFFFFF" marginLeft="10"/>
<button id="cancel" text="停止" width="80" bg="#DDDDDD"/>
</horizontal>
</vertical>
</frame>
);
window.ok.on("click", function() {
if (!isRunning) {
isRunning = true;
toast("开始抢普茅!");
// 在独立线程中执行自动化操作
threads.start(function() {
try {
while (isRunning) {
maotai1499();
sleep(500); // 适当间隔避免过度消耗资源
}
} catch (e) {
log("抢购异常: " + e);
toast("抢购异常: " + e);
}
});
}
});
window.cancel.on("click", function() {
isRunning = false;
toast("已停止抢购");
});
function maotai1499() {
if (!isRunning) return;
print("抢购飞天1499原箱!");
if (textContains("飞天53").exists()) {
print('找到1499!');
var m1499 = textContains("飞天53").findOne(2000);
if (m1499 && isRunning) {
m1499.parent().click();
sleep(2000);
goumai1499();
}
}
}
function goumai1499() {
// 防止无限递归,设置最大尝试次数
var maxAttempts = 5;
var attempt = 0;
while (isRunning && attempt < maxAttempts) {
attempt++;
// 选择2026茅台
if (textContains("2026").exists()) {
var btn2026 = textContains("2026").findOne(2000);
if (btn2026 && isRunning) {
btn2026.click();
sleep(200);
}
}
// 库存加到6买原箱
if (className("android.widget.EditText").exists()) {
var editText = className("android.widget.EditText").findOne(2000);
var shuliang = editText.text();
var addBtn = editText.parent().parent().child(2);
if ((shuliang == '2' || shuliang == '4') && isRunning) {
if (shuliang == '2') {
addBtn.click();
sleep(100);
addBtn.click();
} else if (shuliang == '4') {
addBtn.click();
}
sleep(200);
}
}
// 点击立即购买
if (textContains("立即购买").exists() && isRunning) {
var gmBtn = textContains("立即购买").findOne(2000);
gmBtn.click();
sleep(1000);
}
// 检查是否成功提交
if (textContains("提交订单").exists()) {
return;
}
// 尝试切换2023茅台
if (textContains("2023").exists() && isRunning) {
textContains("2023").findOne(2000).click();
sleep(200);
}
sleep(500);
}
}
这段代码执行完后,窗口闪一下就消失了,需要保持窗口一直存在,并且窗口可以拖动。
回答
// 文档地址 https://docs.hamibot.com/
你的脚本问题在于主线程执行完成后会自动退出,导致悬浮窗消失。同时,当前代码缺少窗口拖动功能。以下是修改后的代码:
auto.waitFor();
var isRunning = false;
var x = 0, y = 0;
var windowX = 0, windowY = 0;
var window = floaty.window(
<frame gravity="center" bg="#80000000">
<vertical padding="20" bg="#FFFFFFFF" radius="10">
<text id="title" text="猫群专属" textSize="18sp" textColor="#000000" gravity="center"/>
<RadioGroup>
<RadioButton id="pumao" text="普茅" checked/>
<RadioButton id="mamao" text="马茅"/>
</RadioGroup>
<horizontal marginTop="20">
<button id="ok" text="开始" width="80" bg="#47a3ed" textColor="#FFFFFF" marginLeft="10"/>
<button id="cancel" text="停止" width="80" bg="#DDDDDD"/>
</horizontal>
</vertical>
</frame>
);
// 添加窗口拖动功能
window.setTouchable(true);
window.setOnTouchListener(function(view, event) {
switch (event.getAction()) {
case event.ACTION_DOWN:
x = event.getRawX();
y = event.getRawY();
windowX = window.getX();
windowY = window.getY();
return true;
case event.ACTION_MOVE:
var nowX = event.getRawX(), nowY = event.getRawY();
var movedX = nowX - x, movedY = nowY - y;
window.setPosition(windowX + movedX, windowY + movedY);
return true;
}
return true;
});
window.ok.on("click", function() {
if (!isRunning) {
isRunning = true;
toast("开始抢普茅!");
// 在独立线程中执行自动化操作
threads.start(function() {
try {
while (isRunning) {
maotai1499();
sleep(500); // 适当间隔避免过度消耗资源
}
} catch (e) {
log("抢购异常: " + e);
toast("抢购异常: " + e);
}
});
}
});
window.cancel.on("click", function() {
isRunning = false;
toast("已停止抢购");
});
function maotai1499() {
if (!isRunning) return;
print("抢购飞天1499原箱!");
if (textContains("飞天53").exists()) {
print('找到1499!');
var m1499 = textContains("飞天53").findOne(2000);
if (m1499 && isRunning) {
m1499.parent().click();
sleep(2000);
goumai1499();
}
}
}
function goumai1499() {
// 防止无限递归,设置最大尝试次数
var maxAttempts = 5;
var attempt = 0;
while (isRunning && attempt < maxAttempts) {
attempt++;
// 选择2026茅台
if (textContains("2026").exists()) {
var btn2026 = textContains("2026").findOne(2000);
if (btn2026 && isRunning) {
btn2026.click();
sleep(200);
}
}
// 库存加到6买原箱
if (className("android.widget.EditText").exists()) {
var editText = className("android.widget.EditText").findOne(2000);
var shuliang = editText.text();
var addBtn = editText.parent().parent().child(2);
if ((shuliang == '2' || shuliang == '4') && isRunning) {
if (shuliang == '2') {
addBtn.click();
sleep(100);
addBtn.click();
} else if (shuliang == '4') {
addBtn.click();
}
sleep(200);
}
}
// 点击立即购买
if (textContains("立即购买").exists() && isRunning) {
var gmBtn = textContains("立即购买").findOne(2000);
gmBtn.click();
sleep(1000);
}
// 检查是否成功提交
if (textContains("提交订单").exists()) {
return;
}
// 尝试切换2023茅台
if (textContains("2023").exists() && isRunning) {
textContains("2023").findOne(2000).click();
sleep(200);
}
sleep(500);
}
}
// 关键修复:保持主线程运行,防止脚本退出
setInterval(function() {}, 2000);
主要修改:
- 添加了窗口拖动功能代码,通过
setOnTouchListener实现 - 在脚本末尾添加了
setInterval(function() {}, 2000)保持主线程运行 - 移除了箭头函数(Rhino 1.7.15不支持),改用传统函数表达式
这样修改后,悬浮窗会一直保持显示,并且你可以通过触摸窗口任意位置来拖动它。脚本只有在你点击"停止"按钮后才会退出。