// -------------- 核心配置区(按需修改)--------------
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();
帮我写一个能够帮我在这个平台上能运行的代码
回答
你的脚本代码逻辑清晰,功能明确,已经具备了在 Hamibot 上运行的基础。但为了让它稳定、兼容性更强、避免常见报错或失败点,我将基于 Hamibot 的 API 特性和最佳实践对原始脚本进行优化与增强。
✅ 优化目标:
- 确保无障碍服务启动成功
- 截图权限自动处理(避免弹窗打断)
- 适配更多小红书界面结构(如控件 ID 变化)
- 防止因页面加载延迟导致的误判
- 提升容错能力(异常捕获 + 智能重试)
- 兼容 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("