回答
以下是实现该自动化流程的完整脚本示例。代码已针对 Hamibot 的 Rhino 1.7.15 引擎进行兼容处理,并包含关键步骤的容错与日志输出。
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
// 1. 获取页面所有文本节点(需根据目标APP的实际UI结构调整选择器)
var texts = className("android.widget.TextView").find();
var maxAmount = -1;
var targetNode = null;
// 2. 遍历文本,提取数字并对比找出金额最大的券
for (var i = 0; i < texts.length; i++) {
var txt = texts[i].text();
// 匹配金额中的数字部分(支持整数与小数)
var match = txt.match(/(\d+(\.\d+)?)/);
if (match) {
var amount = parseFloat(match[1]);
if (amount > maxAmount) {
maxAmount = amount;
targetNode = texts[i];
}
}
}
if (targetNode == null) {
log("未找到包含金额的券元素");
exit();
}
log("已定位最大金额券: " + maxAmount);
// 3. 点击该券区域,使“立即抢券”按钮可见或触发页面跳转
targetNode.click();
sleep(800);
// 4. 查找并点击“立即抢券”按钮
var grabBtn = text("立即抢券").findOne(2000);
if (grabBtn) {
grabBtn.click();
log("已点击立即抢券");
} else {
log("未找到立即抢券按钮,请检查按钮文本或UI层级");
exit();
}
// 5. 等待验证码输入框出现并填入
sleep(1000);
var inputBox = className("android.widget.EditText").findOne(3000);
if (inputBox) {
var verifyCode = "123456"; // 替换为实际验证码获取逻辑
inputBox.setText(verifyCode);
log("验证码已输入: " + verifyCode);
// 可选:点击确认/提交按钮
var submitBtn = text("确认").findOne(2000) || text("提交").findOne(2000);
if (submitBtn) {
submitBtn.click();
log("已点击提交");
}
} else {
log("未检测到验证码输入框,请检查弹窗是否被拦截或延迟");
}
关键实现说明
- 选择器适配:脚本使用
className("android.widget.TextView")作为基础查找范围。不同APP的券金额可能使用id、desc或特定className。请使用 Hamibot 客户端的布局分析工具,替换为精确选择器以提升稳定性。 - 金额解析逻辑:通过正则
/(\d+(\.\d+)?)/提取文本中的首个数字序列,并转为浮点数对比。若金额格式特殊(如¥50.00或50元),该正则仍可正确捕获。 - 超时控制:所有
findOne()均附带毫秒级超时参数(如2000),避免脚本因元素未加载而永久阻塞。 - 验证码输入:
setText()适用于标准EditText。若目标APP使用自定义键盘或安全输入框,需改用click()定位输入框后,通过input()或按键模拟输入。
最佳实践建议
- 动态页面处理:抢券页面常伴随网络加载或动画。在关键操作前加入
sleep()或使用waitFor()等待特定元素出现,可大幅降低误触率。 - 验证码合规性:自动读取或输入短信验证码可能触发目标APP的风控机制。建议通过 Hamibot 的
events.on("sms", callback)监听短信(需授权),或改为手动输入后由脚本继续执行后续步骤。 - 异常恢复:在循环或定时任务中,建议在外层包裹
try...catch,并在失败时执行back()或home()返回安全状态,避免脚本卡死。
如需针对特定APP的UI结构优化选择器,或需要实现验证码自动监听逻辑,可提供该页面的布局分析截图或节点树信息,我将为你调整精确匹配方案。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实