// -------------- 核心配置区(按需修改)--------------
const KEYWORDS = ["泡泡玛特 新品", "潮玩 限量", "盲盒 首发"]; // 监控的商品关键词(多词用逗号分隔)
const CHECK_INTERVAL = 800; // 监控间隔(ms,数值越小越快,建议≥500)
const MAX_BUY_RETRY = 3; // 抢购失败重试次数
const WAIT_TIME = 1500; // 页面加载等待时间(ms)
// ---------------------------------------------------

auto.waitFor(); // 等待无障碍权限
if (!requestScreenCapture()) {
toastLog("请授予「屏幕捕捉」权限,脚本即将退出");
sleep(2000);
exit();
}
toastLog("✅ 小红书抢购脚本启动,开始监控关键词");

// 1. 关键词搜索监控:循环匹配目标商品
function keywordMonitor() {
launchApp("小红书"); // 启动/唤醒小红书
sleep(WAIT_TIME * 1.5);
// 点击顶部搜索框(适配大部分小红书版本)
let searchBtn = id("com.xingin.xhs:id/search_input").findOne(WAIT_TIME) || text("搜索").findOne(WAIT_TIME);
if (!searchBtn) {
toastLog("❌ 未找到搜索框,重试中...");
sleep(WAIT_TIME);
keywordMonitor();
return;
}
searchBtn.click();
sleep(WAIT_TIME);

// 循环监控每个关键词
while (true) {
    for (let keyword of KEYWORDS) {
        // 输入关键词+搜索
        let input = id("com.xingin.xhs:id/search_input").findOne(WAIT_TIME);
        input.setText(keyword);
        sleep(500);
        press("search"); // 触发搜索(键盘搜索键)
        sleep(WAIT_TIME);

        // 匹配目标商品(优先匹配标题含关键词的商品)
        let targetGoods = textContains(keyword).className("android.view.View").find();
        if (targetGoods.length > 0) {
            toastLog(`✅ 找到目标商品:${keyword}`);
            targetGoods[0].click(); // 点击第一个匹配商品
            sleep(WAIT_TIME);
            checkStockAndBuy(); // 进入库存检查+抢购流程
            return;
        }
    }
    toastLog(`🔍 监控中...关键词:${KEYWORDS.join("、")}`);
    sleep(CHECK_INTERVAL);
    back(); // 返回上一页,重新搜索(避免页面缓存)
    sleep(500);
}

}

// 2. 库存识别+最大数量加购(自动识别可购买最大数量)
function checkStockAndBuy() {
let retryCount = 0;
while (retryCount < MAX_BUY_RETRY) {
// 等待商品详情页加载,点击「立即购买」
let buyBtn = text("立即购买").findOne(WAIT_TIME) || text("加入购物车").findOne(WAIT_TIME);
if (!buyBtn) {
toastLog("❌ 未找到购买按钮,重试中...");
retryCount++;
sleep(WAIT_TIME);
continue;
}
buyBtn.click();
sleep(WAIT_TIME);

    // 自动识别最大可购买数量(适配小红书数量选择器)
    let maxNum = getMaxBuyNum();
    if (maxNum <= 0) {
        toastLog("❌ 无库存或未识别到购买数量");
        retryCount++;
        back();
        sleep(500);
        continue;
    }
    toastLog(`📦 识别最大可购数量:${maxNum}`);

    // 确认购买/提交订单
    let confirmBtn = text("提交订单").findOne(WAIT_TIME) || text("确认").findOne(WAIT_TIME);
    if (confirmBtn) {
        confirmBtn.click();
        toastLog("🎉 抢购成功!请及时完成支付");
        exit(); // 抢购成功退出脚本
    } else {
        toastLog("❌ 未找到提交订单按钮,重试中...");
        retryCount++;
        back();
        sleep(500);
    }
}
toastLog("❌ 抢购失败,已达最大重试次数");
back();
sleep(500);
keywordMonitor(); // 返回重新监控

}

// 3. 核心:自动识别最大可购买数量(适配小红书数量选择逻辑)
function getMaxBuyNum() {
try {
// 小红书数量选择器:先点击「+」到最大,再获取数量
let addBtn = text("+").findOne(1000); // 数量增加按钮
let minusBtn = text("-").findOne(1000); // 数量减少按钮
let numText = className("android.widget.EditText").findOne(1000); // 数量显示框

    // 先把数量减到1(避免初始数量不是最小值)
    while (numText.getText() != "1") {
        minusBtn.click();
        sleep(300);
    }

    // 循环点击「+」,直到不能点击(达到最大库存)
    while (true) {
        let currentNum = parseInt(numText.getText());
        addBtn.click();
        sleep(300);
        let newNum = parseInt(numText.getText());
        if (newNum == currentNum) { // 点击后数量不变=已达最大
            return currentNum;
        }
    }
} catch (e) {
    toastLog(`⚠️ 数量识别异常:${e}`);
    return 0;
}

}

// 启动脚本核心流程
keywordMonitor();
帮我写一个能够帮我在这个平台上能运行的代码

HAMI_8240711090 · 18 小时前

回答

Hamibot AI
1
· 18 小时前

你的脚本代码逻辑清晰,功能明确,已经具备了在 Hamibot 上运行的基础。但为了让它稳定、兼容性更强、避免常见报错或失败点,我将基于 Hamibot 的 API 特性和最佳实践对原始脚本进行优化与增强。


✅ 优化目标:

  1. 确保无障碍服务启动成功
  2. 截图权限自动处理(避免弹窗打断)
  3. 适配更多小红书界面结构(如控件 ID 变化)
  4. 防止因页面加载延迟导致的误判
  5. 提升容错能力(异常捕获 + 智能重试)
  6. 兼容 Rhino 引擎语法(不使用箭头函数等)

✅ 优化版:小红书抢购监控脚本(Hamibot 兼容)

⚠️ 注意:请将此脚本保存为 .js 文件并导入 Hamibot 使用
📌 支持关键词搜索 → 商品点击 → 自动识别最大可购买数量 → 提交订单

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

// -------------- 核心配置区(按需修改)--------------
const KEYWORDS = ["泡泡玛特 新品", "潮玩 限量", "盲盒 首发"]; // 监控商品关键词
const CHECK_INTERVAL = 800;                  // 轮询间隔(建议 ≥500)
const MAX_BUY_RETRY = 3;                    // 抢购失败重试次数
const WAIT_TIME = 1500;                      // 页面加载等待时间
// ---------------------------------------------------

// 启用无障碍服务
if (!auto.service) {
    toastLog("请开启无障碍服务");
    auto.waitFor(); // 等待用户开启
}

// 请求截图权限
if (!requestScreenCapture()) {
    toastLog("❌ 未授予屏幕截图权限,脚本退出");
    sleep(2000);
    hamibot.exit();
} else {
    toastLog("✅ 屏幕截图权限已获取");
}

toastLog("🎉 小红书抢购脚本启动中...");

// 主入口
function main() {
    launchApp("小红书");
    sleep(WAIT_TIME * 1.5);

    // 查找搜索框(多种方式适配不同版本)
    var searchBtn = id("com.xingin.xhs:id/search_input").findOne(2000)
        || text("搜索").findOne(2000)
        || desc("搜索").findOne(2000);

    if (!searchBtn) {
        toastLog("⚠️ 未找到搜索框,尝试重启流程...");
        sleep(1000);
        back();
        sleep(500);
        home();
        sleep(1000);
        return main();
    }

    searchBtn.click();
    sleep(WAIT_TIME);

    // 循环检查每个关键词
    for (var i = 0; i < KEYWORDS.length; i++) {
        var keyword = KEYWORDS[i];
        performSearch(keyword);
        sleep(CHECK_INTERVAL);
    }

    // 完成一轮未命中则返回重新开始
    toastLog("🔍 当前轮次无匹配商品,继续监控...");
    back();
    sleep(500);
    return main();
}

// 执行单个关键词搜索
function performSearch(keyword) {
    toastLog("🔍 搜索关键词:" + keyword);

    var inputField = id("com.xingin.xhs:id/search_input").findOne(2000);
    if (!inputField) {
        toastLog("⚠️ 输入框失效,刷新页面");
        return;
    }
    inputField.setText(""); // 清空输入框防缓存
    sleep(500);
    inputField.setText(keyword);
    sleep(800);

    // 触发软键盘“搜索”按钮
    press("search");

    sleep(WAIT_TIME);

    // 匹配商品项(文本包含关键词且是可点击区域)
    var targets = textContains(keyword).filter(function(w) {
        return w.className() === "android.view.View" && w.bounds().width() > 100;
    }).find();

    if (targets.length > 0) {
        toastLog("✅ 发现目标商品: " + keyword);
        targets[0].click();
        sleep(WAIT_TIME);
        checkStockAndBuy(keyword);
    } else {
        toastLog("⏳ 未发现匹配商品: " + keyword);
    }
}

// 检查库存并尝试购买
function checkStockAndBuy(keyword) {
    var retryCount = 0;

    while (retryCount < MAX_BUY_RETRY) {
        var buyBtn = text("
ℹ️ 本回答由 AI 生成,内容仅供参考