帮我写一个Hamibot脚本,实现:


1. 自动打开美团APP

2. 进入「外卖」页面

3. 自动点击「领券」按钮,领取所有可用优惠券

4. 操作完成后自动返回桌面

HAMI_6289526741 · 6 小时前

回答

Hamibot AI
1
· 6 小时前
// 文档地址 https://docs.hamibot.com/
auto.waitFor();

// ============== 配置参数 ==============
var APP_NAME = "美团";
var APP_PACKAGE = "com.sankuai.meituan";
var WAIT_TIME = 3000; // 页面加载等待时间(毫秒)
// =====================================

toastLog("🚀 美团领券脚本启动");

// ============== 工具函数 ==============

/**
 * 随机等待
 */
function randomSleep(min, max) {
    var time = random(min, max);
    sleep(time);
}

/**
 * 安全点击控件
 */
function safeClick(selector) {
    try {
        var w = selector.findOne(2000);
        if (w && w.clickable()) {
            w.click();
            log("✅ 点击成功");
            return true;
        } else if (w) {
            var b = w.bounds();
            click(b.centerX(), b.centerY());
            log("✅ 坐标点击成功");
            return true;
        }
        log("⚠️ 未找到控件");
        return false;
    } catch (e) {
        log("❌ 点击错误:" + e);
        return false;
    }
}

/**
 * 检查并关闭弹窗
 */
function closePopups() {
    var closeBtns = [
        text("关闭"),
        text("取消"),
        text("稍后再说"),
        text("知道了"),
        desc("关闭")
    ];
    
    for (var i = 0; i < closeBtns.length; i++) {
        var btn = closeBtns[i].findOne(500);
        if (btn) {
            btn.click();
            log("已关闭弹窗");
            sleep(500);
        }
    }
}

// ============== 主流程 ==============

try {
    // 1. 打开美团 APP
    toastLog("📱 正在打开美团 APP...");
    launchApp(APP_NAME);
    sleep(WAIT_TIME);
    
    // 检查是否成功启动
    var meituan = text("美团").findOne(3000) || text("外卖").findOne(3000);
    if (!meituan) {
        toastLog("⚠️ 未检测到美团界面,请手动打开");
        sleep(5000);
    }
    
    // 关闭可能的启动弹窗
    closePopups();
    
    // 2. 进入外卖页面
    toastLog("🍔 正在进入外卖页面...");
    var waimaiBtn = text("外卖").findOne(5000);
    if (waimaiBtn) {
        waimaiBtn.click();
        log("✅ 已点击外卖入口");
        sleep(WAIT_TIME);
    } else {
        // 尝试通过坐标点击(备用方案)
        var waimaiBtn2 = desc("外卖").findOne(3000);
        if (waimaiBtn2) {
            waimaiBtn2.click();
            log("✅ 已通过描述点击外卖");
            sleep(WAIT_TIME);
        } else {
            toastLog("⚠️ 未找到外卖入口,请手动点击");
            sleep(3000);
        }
    }
    
    closePopups();
    
    // 3. 点击领券按钮
    toastLog("🎫 正在领取优惠券...");
    
    // 方案 1:查找领券入口
    var couponBtn = textContains("领券").findOne(5000) || 
                    textContains("红包").findOne(3000) ||
                    descContains("领券").findOne(3000);
    
    if (couponBtn) {
        couponBtn.click();
        log("✅ 已进入领券页面");
        sleep(WAIT_TIME);
        
        // 领取所有可用优惠券
        var claimCount = 0;
        var maxAttempts = 10;
        
        for (var i = 0; i < maxAttempts; i++) {
            closePopups();
            
            // 查找可领取的券
            var claimBtn = text("领取").findOne(2000) || 
                          text("立即领取").findOne(2000) ||
                          text("去使用").findOne(2000);
            
            if (claimBtn && claimBtn.clickable()) {
                claimBtn.click();
                claimCount++;
                log("✅ 已领取第 " + claimCount + " 张券");
                sleep(1500);
            } else {
                log("ℹ️ 未发现可领取的券");
                break;
            }
        }
        
        toastLog("🎉 共领取 " + claimCount + " 张优惠券");
    } else {
        toastLog("⚠️ 未找到领券入口");
    }
    
    // 4. 返回桌面
    toastLog("🏠 正在返回桌面...");
    home();
    sleep(1000);
    
    toastLog("✅ 脚本执行完成");
    
} catch (e) {
    toastLog("❌ 脚本出错:" + e);
    home();
}

// ============== 结束 ==============

使用说明

  1. 权限配置

    • 开启 Hamibot「无障碍服务」
    • 授予「悬浮窗权限」
    • 关闭电池优化,允许后台运行
  2. 界面适配
    美团 APP 版本更新可能导致元素选择器失效。如脚本无法找到元素,请使用 Hamibot 客户端的「布局分析」工具重新获取按钮的真实 textdescid 特征。

  3. 运行建议

    • 首次运行建议在屏幕开启状态下观察,确认流程正常
    • 可根据需要调整 WAIT_TIME 等待时间
    • 建议在 WiFi 环境下运行,避免网络延迟
  4. 注意事项

    • 部分优惠券可能需要手动验证或满足条件才能领取
    • 账号异常行为可能触发风控,建议合理设置运行频率
    • 脚本仅用于个人辅助,请勿用于商业批量操作

调试技巧

如脚本执行失败,查看 Hamibot 客户端日志,根据报错信息调整选择器:

// 打印当前界面元素
var widgets = className("android.widget.TextView").find();
log("当前页面元素数量:" + widgets.size());
for (var i = 0; i < widgets.size(); i++) {
    log("元素 " + i + ": " + widgets.get(i).text());
}

如需进一步优化,可提供具体界面截图或日志信息。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实