// 设置购买数量
function setQuantity() {
if (purchaseConfig.quantity <= 1) {
return; // 如果数量是1,不需要操作
}

log("设置购买数量:" + purchaseConfig.quantity);
sleep(200);

// 获取当前数量作为基准
let beforeQuantity = getCurrentQuantity();
if (beforeQuantity === null) {
    log("❌ 无法获取当前数量,跳过数量设置");
    return;
}
log("当前数量:" + beforeQuantity);

// 需要点击的次数
let clicksNeeded = purchaseConfig.quantity - beforeQuantity;
if (clicksNeeded <= 0) {
    log("当前数量已满足要求,无需调整");
    return;
}

// 设置重试次数和超时时间
let retryCount = 0;
const maxRetries = 10;
const clickInterval = 200;

while (retryCount < maxRetries && beforeQuantity < purchaseConfig.quantity) {
    retryCount++;
    log("第 " + retryCount + " 次尝试增加数量...");

    // 查找+号按钮(Image类型)
    let plusBtn = className("android.widget.Image").findOne(1);
    if (!plusBtn) {
        log("未找到Image类型的按钮,等待后重试");
        sleep(100);
        continue;
    }

    try {
        // 获取按钮位置
        let bounds = plusBtn.bounds();
        log("找到按钮,位置:" + JSON.stringify(bounds));
        
        // 点击按钮中心位置
        let x = Math.floor((bounds.left + bounds.right) / 2);
        let y = Math.floor((bounds.top + bounds.bottom) / 2);
        
        // 使用press长按而不是click
        press(x, y, 150);
        
        // 等待并检查数量是否变化
        sleep(clickInterval);
        let currentQuantity = getCurrentQuantity();
        
        if (currentQuantity > beforeQuantity) {
            log("✅ 数量增加成功:" + beforeQuantity + " -> " + currentQuantity);
            beforeQuantity = currentQuantity;
            if (currentQuantity >= purchaseConfig.quantity) {
                break;
            }
            // 成功后重置重试计数
            retryCount = 0;
        } else {
            // 如果点击中心位置失败,尝试周围的点
            log("中心点击未生效,尝试周围位置");
            let offsets = [
                {x: -3, y: 0}, {x: 3, y: 0},
                {x: 0, y: -3}, {x: 0, y: 3},
                {x: -3, y: -3}, {x: 3, y: 3},
                {x: 3, y: -3}, {x: -3, y: 3}
            ];
            
            for (let offset of offsets) {
                if (beforeQuantity >= purchaseConfig.quantity) break;
                
                press(x + offset.x, y + offset.y, 150);
                sleep(clickInterval);
                
                currentQuantity = getCurrentQuantity();
                if (currentQuantity > beforeQuantity) {
                    log("✅ 偏移点击成功:" + beforeQuantity + " -> " + currentQuantity);
                    beforeQuantity = currentQuantity;
                    break;
                }
            }
        }
    } catch (e) {
        log("点击尝试出错: " + e);
    }

    if (beforeQuantity < purchaseConfig.quantity) {
        log("本次尝试未完全成功,等待后重试");
        sleep(100);
    }
}

// 最终验证
let finalQuantity = getCurrentQuantity();
if (finalQuantity === purchaseConfig.quantity) {
    log("✅ 数量设置成功,当前数量:" + finalQuantity);
} else {
    log("⚠️ 数量设置可能不完整,当前数量:" + finalQuantity + ",目标数量:" + purchaseConfig.quantity);
}

}

为什么无法点击 + 按钮,要用hamibot什么特殊的语法吗

已存档
菜鸟 · 26 天前

回答

Hamibot AI
1
· 26 天前

在 Hamibot 中实现控件点击操作时,确实需要注意几个关键点来确保操作成功。以下是对你的问题的分析与解决方案:


1. 控件定位准确性

你使用了 className("android.widget.Image") 来查找 + 按钮,但实际控件可能是 Button 类型或其他类型。建议使用更具体的选择器来定位控件,比如结合 textdesc(描述)属性。

✅ 示例:使用更精确的控件定位方式

let plusBtn = className("android.widget.Button").text("+").findOne(1000);
if (!plusBtn) {
    log("未找到 + 按钮");
    return;
}

2. 点击操作的正确方式

在 Hamibot 中,press(x, y, duration) 通常用于模拟“长按”操作,而如果你只是想点击按钮,推荐使用 click(x, y) 方法,它更符合常规点击行为。

✅ 示例:使用 click 替代 press

let bounds = plusBtn.bounds();
let x = (bounds.left + bounds.right) / 2;
let y = (bounds.top + bounds.bottom) / 2;

click(x, y);  // 普通点击

3. 权限检查

确保你的脚本已经获得了必要的权限,特别是无障碍服务和屏幕截图权限。如果未获取权限,某些控件将无法正确识别或操作。

✅ 示例:在脚本开头添加权限检查

auto.waitFor();
if (!requestScreenCapture()) {
    toastLog("需要授予屏幕截图权限");
    hamibot.exit();
}

4. 控件状态检查与等待

在某些情况下,控件可能尚未加载完成,或被其他元素遮挡。可以使用 waitFor() 等方法确保控件可见后再进行操作。

✅ 示例:使用 waitFor() 等待控件出现

let plusBtn = className("android.widget.Button").text("+").waitFor();

5. 日志与调试

建议在脚本中添加日志输出,帮助定位问题是否出在控件识别或点击操作上。

✅ 示例:增强日志输出

log("尝试查找 + 按钮");
let plusBtn = className("android.widget.Button").text("+").findOne(1000);
if (plusBtn) {
    log("找到按钮,准备点击");
    let bounds = plusBtn.bounds();
    let x = (bounds.left + bounds.right) / 2;
    let y = (bounds.top + bounds.bottom) / 2;
    click(x, y);
    log("按钮点击完成");
} else {
    log("未找到 + 按钮");
}

6. 总结建议

问题点 建议
控件类型不明确 使用 textdesc 等属性精确定位
操作方式不匹配 优先使用 click(x, y) 实现点击
权限未获取 检查无障碍服务和截图权限
控件未加载完成 使用 waitFor() 或增加等待时间
缺乏调试信息 添加日志输出,确认控件状态

最终改进代码示例

auto.waitFor();
if (!requestScreenCapture()) {
    toastLog("需要授予屏幕截图权限");
    hamibot.exit();
}

function setQuantity() {
    if (purchaseConfig.quantity <= 1) {
        return;
    }

    log("设置购买数量:" + purchaseConfig.quantity);

    let beforeQuantity = getCurrentQuantity();
    if (beforeQuantity === null) {
        log("❌ 无法获取当前数量,跳过数量设置");
        return;
    }

    let clicksNeeded = purchaseConfig.quantity - beforeQuantity;
    if (clicksNeeded <= 0) {
        log("当前数量已满足要求,无需调整");
        return;
    }

    log("尝试查找 + 按钮");
    let plusBtn = className("android.widget.Button").text("+").waitFor();
    if (!plusBtn) {
        log("未找到 + 按钮");
        return;
    }

    let bounds = plusBtn.bounds();
    let x = (bounds.left + bounds.right) / 2;
    let y = (bounds.top + bounds.bottom) / 2;

    for (let i = 0; i < clicksNeeded; i++) {
        click(x, y);
        sleep(200);
        let currentQuantity = getCurrentQuantity();
        if (currentQuantity > beforeQuantity)
ℹ️ 本回答由 AI 生成,内容仅供参考