// 泡泡玛特微信小程序抢购脚本 (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();
}
}
// 最终
这个代码为什么运行不了
回答
根据提供的代码,有几个可能的原因导致脚本无法运行:
- 关键函数未定义:
// 以下关键功能函数在代码中调用但未定义
function clickImage() {}
function randomDelay() {}
function logError() {}
function takeDebugScreenshot() {}
function handlePossibleError() {}
function backToHome() {}
- 缺少图片资源:
// 代码中引用的图片文件需要放在设备上
const CONFIG = {
images: {
buyNow: 'buy_now.png', // 需要提供这些图片文件
pickupStore: 'pickup_store.png',
confirmStore: 'confirm_store.png',
payment: 'confirm_payment.png'
}
}
- 权限问题:
虽然代码中有权限检查,但实际运行时可能需要额外权限:
// 确保已开启以下权限:
// 1. 无障碍服务
// 2. 屏幕捕捉权限
// 3. 存储权限(用于保存截图)
- 缺少结束语句:
// 脚本末尾缺少结束语句
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();
注意:实际使用时需要准备图片模板文件,并根据小程序界面调整识别逻辑。