// 泡泡玛特微信小程序抢购脚本 (Hamibot版)
// 版本: 1.1 - 修复权限问题
// 作者: AI助手

// ======== 权限检查与修复 ========
toastLog("=== 权限检查 ===");

// 检查无障碍服务
if (!auto.service) {
alert("请开启Hamibot的无障碍服务");
app.startActivity({
action: "android.settings.ACCESSIBILITY_SETTINGS"
});
exit();
}

// 请求屏幕捕捉权限
if (!requestScreenCapture()) {
toastLog("需要屏幕捕捉权限");
app.startActivity({
action: "android.settings.ACTION_MANAGE_OVERLAY_PERMISSION",
data: "package:" + context.getPackageName()
});
toastLog("请授予'在其他应用上层显示'权限");
exit();
}

toastLog("权限检查通过");

// ======== 配置区域 ========
const CONFIG = {
// 图片识别配置
images: {
buyNow: 'buy_now.png', // 立即购买按钮
pickupStore: 'pickup_store.png', // 门店自提选项
confirmStore: 'confirm_store.png', // 确认门店按钮
payment: 'confirm_payment.png' // 确认支付按钮
},

// 操作参数
maxRetry: 5,                     // 最大重试次数
findTimeout: 5000,               // 查找元素超时时间(毫秒)
stepDelay: [800, 1500],          // 操作延迟范围(毫秒)
retryDelay: 2000,                // 重试延迟(毫秒)

// 调试设置
debug: true,                     // 调试模式开关
screenshotOnError: true,         // 出错时截屏
screenshotPath: '/sdcard/Pictures/PopMart/' // 截屏保存路径

};

// ======== 主程序 ========
toastLog("=== 泡泡玛特抢购脚本启动 ===");
log("初始化配置...");

// 创建必要的目录
files.ensureDir(CONFIG.screenshotPath);

// 主循环
let retryCount = 0;
let success = false;

while (retryCount < CONFIG.maxRetry && !success) {
log(\n===== 尝试 #${retryCount + 1} =====);

try {
    // 步骤1: 点击"立即购买"按钮
    if (!clickImage(CONFIG.images.buyNow, "立即购买")) {
        throw new Error("未找到立即购买按钮");
    }
    
    // 步骤2: 选择"门店自提"
    randomDelay();
    if (!clickImage(CONFIG.images.pickupStore, "门店自提")) {
        throw new Error("未找到门店自提选项");
    }
    
    // 步骤3: 确认门店
    randomDelay();
    if (!clickImage(CONFIG.images.confirmStore, "确认门店")) {
        throw new Error("未找到确认门店按钮");
    }
    
    // 步骤4: 点击"确认支付"
    randomDelay();
    if (clickImage(CONFIG.images.payment, "确认支付")) {
        log("抢购成功!请尽快完成支付");
        success = true;
        break;
    }
    
    // 如果未找到支付按钮,可能是其他页面
    handlePossibleError();
    
} catch (e) {
    logError(e.message);
    takeDebugScreenshot("error_" + retryCount);
}

// 重试逻辑
retryCount++;
if (retryCount < CONFIG.maxRetry && !success) {
    log(`将在 ${CONFIG.retryDelay/1000} 秒后重试...`);
    sleep(CONFIG.retryDelay);
    
    // 返回首页准备下一次尝试
    backToHome();
}

}

// 最终
这个代码为什么运行不了

已存档
hahlx78288 · 1 个月前

回答

Hamibot AI
1
· 1 个月前

根据提供的代码,有几个可能的原因导致脚本无法运行:

  1. 关键函数未定义
// 以下关键功能函数在代码中调用但未定义
function clickImage() {}
function randomDelay() {}
function logError() {}
function takeDebugScreenshot() {}
function handlePossibleError() {}
function backToHome() {}
  1. 缺少图片资源
// 代码中引用的图片文件需要放在设备上
const CONFIG = {
    images: {
        buyNow: 'buy_now.png',        // 需要提供这些图片文件
        pickupStore: 'pickup_store.png',
        confirmStore: 'confirm_store.png',
        payment: 'confirm_payment.png'
    }
}
  1. 权限问题
    虽然代码中有权限检查,但实际运行时可能需要额外权限:
// 确保已开启以下权限:
// 1. 无障碍服务
// 2. 屏幕捕捉权限
// 3. 存储权限(用于保存截图)
  1. 缺少结束语句
// 脚本末尾缺少结束语句
hamibot.exit();  // 必须添加

建议修改方案:

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

// 添加缺失的函数实现(示例)
function clickImage(imgName, desc) {
    let img = images.read(imgName);
    if (!img) {
        log("无法读取图片: " + imgName);
        return false;
    }
    let point = findImage(captureScreen(), img);
    if (point) {
        click(point.x, point.y);
        log("点击成功: " + desc);
        return true;
    }
    return false;
}

function randomDelay() {
    sleep(random(CONFIG.stepDelay[0], CONFIG.stepDelay[1]));
}

// 其他函数也需要类似实现...

// 脚本结束时必须调用
hamibot.exit();

注意:实际使用时需要准备图片模板文件,并根据小程序界面调整识别逻辑。

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