// 文档地址 https://docs.hamibot.com/ "auto"; function main() { // 1. 启动淘宝应用 app.launchApp("淘宝"); sleep(3000); // 等待首页基础加载 // 2. 定位签到/红包入口(名称可能随版本更新变化) var entry = textContains("签到").findOne(5000) || textContains("领红包").findOne(5000) || descContains("签到").findOne(5000); if (entry) { entry.click(); sleep(2000); } else { toast("未找到签到入口,请检查当前页面或更新选择器"); return; } // 3. 点击签到按钮 var signBtn = text("签到").findOne(3000) || text("立即签到").findOne(3000) || desc("签到").findOne(3000); if (signBtn) { signBtn.click(); toast("已执行签到"); sleep(2000); } else { toast("未找到签到按钮,可能今日已签到或页面未完全加载"); } // 4. 处理常见弹窗干扰 handlePopups(); } function handlePopups() { var closeBtn = text("关闭").findOne(2000) || text("我知道了").findOne(2000) || desc("关闭").findOne(2000) || text("暂不").findOne(2000); if (closeBtn) { closeBtn.click(); sleep(1000); } } main();
这段代码可以打开淘宝,但是打不开"红包签到"

HAMI_9773440657 · 12 小时前

回答

Hamibot AI
1
· 12 小时前

这段代码无法打开“红包签到”入口,主要受以下因素影响:淘宝首页元素加载存在网络延迟、目标控件可能被遮挡或位于屏幕外、选择器匹配过于宽泛导致误触或漏触、以及启动弹窗未及时处理阻塞了点击操作。

以下是优化后的脚本,已针对Rhino 1.7.15引擎兼容,并强化了元素查找、滚动定位与弹窗拦截逻辑:

// 文档地址 https://docs.hamibot.com/
"auto";

function main() {
    app.launchApp("淘宝");
    waitForHomePage();
    
    // 启动后台弹窗监控线程
    startPopupMonitor();
    
    var entry = findRedPacketEntry();
    if (entry) {
        entry.click();
        sleep(2000);
        clickSignButton();
    } else {
        toast("未找到红包签到入口");
        log("未找到红包签到入口,请使用Inspector检查当前页面控件属性");
    }
    
    // 脚本结束前关闭监控线程
    threads.shutDownAll();
}

// 等待首页基础框架加载完成
function waitForHomePage() {
    var timeout = 15000;
    var start = new Date().getTime();
    while (new Date().getTime() - start < timeout) {
        if (text("首页").findOne(500) || text("我的淘宝").findOne(500)) {
            return;
        }
        sleep(500);
    }
    log("首页加载超时");
}

// 查找红包签到入口(支持多选择器降级与滚动查找)
function findRedPacketEntry() {
    var selectors = [
        text("签到领红包"),
        text("领红包"),
        desc("签到领红包"),
        desc("领红包"),
        textContains("签到").className("android.widget.TextView"),
        descContains("签到").className("android.widget.TextView")
    ];

    // 优先在当前可视区域查找
    for (var i = 0; i < selectors.length; i++) {
        var target = selectors[i].findOne(1000);
        if (target) return target;
    }

    // 未找到则向下滚动查找
    log("未直接找到入口,尝试滚动查找...");
    for (var j = 0; j < 3; j++) {
        swipe(device.width / 2, device.height * 0.8, device.width / 2, device.height * 0.3, 500);
        sleep(1000);
        for (var k = 0; k < selectors.length; k++) {
            var target = selectors[k].findOne(1000);
            if (target) return target;
        }
    }
    return null;
}

// 点击签到按钮
function clickSignButton() {
    var signBtn = text("签到").findOne(3000) || text("立即签到").findOne(3000) || desc("签到").findOne(3000);
    if (signBtn) {
        signBtn.click();
        toast("已执行签到");
    } else {
        toast("未找到签到按钮,可能今日已签到");
    }
}

// 后台持续处理弹窗
function startPopupMonitor() {
    threads.start(function() {
        while (true) {
            var closeBtn = text("关闭").findOne(1000) || 
                           text("我知道了").findOne(1000) || 
                           desc("关闭").findOne(1000) || 
                           text("暂不").findOne(1000) || 
                           text("取消").findOne(1000);
            if (closeBtn) {
                closeBtn.click();
                sleep(500);
            }
            sleep(1000);
        }
    });
}

main();

关键改进说明

  1. 动态加载等待:使用 waitForHomePage() 替代固定 sleep(3000),通过检测底部导航栏特征元素判断页面是否就绪,避免网络延迟导致的选择器失效。
  2. 滚动查找机制:淘宝首页活动入口常位于首屏下方。脚本在直接匹配失败后,自动执行3次下滑操作,扩大控件搜索范围。
  3. 弹窗并发处理:将 handlePopups() 改为 threads.start() 后台线程运行。淘宝启动后常伴随营销弹窗,后台线程可实时拦截,避免阻塞主流程的点击逻辑。
  4. 选择器降级策略:按精确文本 → 模糊文本 → 控件类型组合的顺序匹配,提高不同淘宝版本下的兼容性。

调试与最佳实践建议

  • 使用 Hamibot Inspector(设备调试工具:https://hamibot.cn/inspector)连接手机,实时查看“红包签到”按钮的 textdescidbounds 属性,替换脚本中的选择器。
  • 在关键节点添加 log() 输出当前 currentActivity() 和控件状态,便于定位是页面未跳转还是元素未渲染。
  • 若入口为纯图片按钮,可改用 className("android.widget.ImageView").boundsInside(x1, y1, x2, y2).findOne() 或结合 images.findColor() 进行图像识别定位。
  • 自动化任务建议添加重试机制与异常捕获,避免因单次网络波动导致脚本中断。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实