const CONFIG = {
refreshInterval: 500,
stopAfterMinutes: 15,
autoClickNotify: true
};

// 请求截图权限
if (!requestScreenCapture()) {
toast("请授予截图权限");
exit();
}

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

// ===== 悬浮窗状态栏 =====
let floatWindow = null;
ui.run(() => {
floatWindow = floaty.rawWindow(
<frame gravity="left|top">
<text id="log" text="初始化中..." textSize="14sp" textColor="#ffffff" bg="#99000000" padding="8"/>
</frame>
);
floatWindow.setSize(-2, -2);
floatWindow.setTouchable(false);
floatWindow.setPosition(20, 80);
});

function updateStatus(text) {
ui.run(() => {
if (floatWindow && floatWindow.log) {
floatWindow.log.setText("状态:" + text);
}
});
console.log("[状态] " + text);
}

// ===== 用户输入 =====
let buyType = dialogs.select("请选择购买方式", ["送到家", "到店取"]);
if (buyType < 0) exit();
buyType = buyType === 0 ? "home" : "store";

let quantityInput = dialogs.input("请输入购买数量", "1");
if (!quantityInput || isNaN(quantityInput)) exit();
let quantity = parseInt(quantityInput);

// ===== 坐标校准 =====
const COORDS_FILE = "/sdcard/hamibot_coords.json";
let coords = {};
if (!files.exists(COORDS_FILE)) {
alert("首次使用请依次点击以下按钮进行坐标校准:\n立即购买、整盒、送到家、到店取、到货通知、确认按钮、确认信息并支付、就是这家、我知道了");
coords = autoCalibrate();
files.write(COORDS_FILE, JSON.stringify(coords));
toast("坐标校准完成,重新运行脚本");
exit();
} else {
coords = JSON.parse(files.read(COORDS_FILE));
}

// ===== 主流程 =====
try {
main();
} catch (e) {
console.error("脚本异常:" + e);
toast("脚本错误:" + e);
if (floatWindow) floatWindow.close();
exit();
}

function main() {
updateStatus("开始抢购");

clickAndLog("立即购买", coords.buyNow);
sleep(300);

clickAndLog("整盒", coords.box);
sleep(300);

if (buyType === "home") {
clickAndLog("送到家", coords.sendHome);
} else {
clickAndLog("到店取", coords.pickUp);
}
sleep(300);

updateStatus("点击加号 x" + (quantity - 1));
for (let i = 1; i < quantity; i++) {
if (isBlack(coords.checkColor.x, coords.checkColor.y)) {
clickAndLog("加号", coords.checkColor);
sleep(200);
}
}

if (CONFIG.autoClickNotify) {
updateStatus("OCR点击 到货通知");
clickTextByOCR("到货通知", null, 5000);
sleep(300);
}

updateStatus("等待“确定”按钮...");
let startTime = new Date().getTime();
while (true) {
let obj = text("确定").findOne(1000);
if (obj) {
clickAndLog("确定", obj.bounds().center());
break;
}
clickAndLog("刷新送到家", coords.sendHome);
sleep(CONFIG.refreshInterval);
clickAndLog("刷新到店取", coords.pickUp);
sleep(CONFIG.refreshInterval);
if ((new Date().getTime() - startTime) > CONFIG.stopAfterMinutes * 60 * 1000) {
updateStatus("超时退出");
exit();
}
}

waitAndClickText("确认信息并支付", coords.pay);
sleep(300);

waitAndClickText("就是这家", coords.thisShop);
sleep(300);

if (textContains("库存不足").exists()) {
updateStatus("库存不足,OCR点击“我知道了”");
clickTextByOCR("我知道了");
}

updateStatus("抢购完成 ✅");
device.vibrate(500);
sleep(1500);
floatWindow.close();
exit();
}

我在代码上有什么问题,如何实现监控日志悬浮窗

已存档
2011303732 · 2 个月前

回答

Hamibot AI
1
· 2 个月前

以下是对代码的分析和改进建议,以及如何实现监控日志悬浮窗的具体方案:

代码改进建议

  1. 权限检查增强
// 更完善的权限检查逻辑
if (!requestScreenCapture()) {
    toastLog("未授予截图权限,3秒后自动退出");
    sleep(3000);
    hamibot.exit();
}
  1. 悬浮窗优化方案
// 增强的悬浮窗实现
let logWindow = floaty.window(
    <vertical padding="8" bg="#AA000000">
        <text id="title" text="抢购监控日志" textSize="16sp" textColor="#FFFFFF"/>
        <scroll>
            <text id="content" text="初始化完成\n" textSize="12sp" textColor="#CCCCCC"/>
        </scroll>
    </vertical>
);
logWindow.setPosition(100, 100);
logWindow.setSize(500, 300);
logWindow.setTouchable(true);

// 日志记录函数
function appendLog(text) {
    ui.run(() => {
        let now = new Date().toLocaleTimeString();
        logWindow.content.setText(logWindow.content.getText() + "[" + now + "] " + text + "\n");
    });
}

完整监控日志方案

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

// 创建日志悬浮窗
let logWindow = floaty.window(
    <frame gravity="center" bg="#AA000000">
        <vertical padding="8">
            <horizontal gravity="center">
                <text text="抢购监控日志" textSize="16sp" textColor="#FFFFFF"/>
                <button id="close" text="X" w="30" h="30"/>
            </horizontal>
            <scroll>
                <text id="logContent" text="" textSize="12sp" textColor="#CCCCCC" margin="8"/>
            </scroll>
        </vertical>
    </frame>
);
logWindow.setPosition(100, 100);
logWindow.setSize(500, 350);

// 关闭按钮事件
logWindow.close.click(() => {
    logWindow.close();
});

// 日志记录函数
function logMessage(message) {
    ui.run(function() {
        let now = new Date().toLocaleTimeString();
        let logText = "[" + now + "] " + message + "\n";
        logWindow.logContent.setText(logWindow.logContent.getText() + logText);
    });
    console.log(message);
}

// 使用示例
logMessage("脚本初始化完成");
logMessage("开始执行抢购流程");
// ... 在你的各个操作节点调用logMessage记录状态

hamibot.exit();

关键改进点:

  1. 日志窗口功能增强
  • 添加时间戳自动记录
  • 支持滚动查看历史记录
  • 增加关闭按钮
  • 优化窗口样式
  1. 日志管理建议
  • 重要操作节点都调用logMessage记录状态
  • 错误捕获时记录详细错误信息
  • 可扩展为同时写入文件日志
  1. 性能优化
  • 使用ui.run保证线程安全
  • 控制日志长度避免内存问题
  • 窗口可拖动调整位置

使用时只需在关键节点调用logMessage函数即可实现完整监控记录,窗口会实时显示执行状态和操作历史。

ℹ️ 本回答由 AI 生成,内容仅供参考