// 文档地址 https://docs.hamibot.com/ "auto"; function main() { // 1. 启动淘宝应用 app.launchApp("淘宝"); sleep(3000); // 等待首页基础加载 // 2. 定位签到/红包入口(名称可能随版本更新变化) var entry = textContains("签到").findOne(5000) || textContains("领红包").findOne(5000) || descContains("签到").findOne(5000); if (entry) { entry.click(); sleep(2000); } else { toast("未找到签到入口,请检查当前页面或更新选择器"); return; } // 3. 点击签到按钮 var signBtn = text("签到").findOne(3000) || text("立即签到").findOne(3000) || desc("签到").findOne(3000); if (signBtn) { signBtn.click(); toast("已执行签到"); sleep(2000); } else { toast("未找到签到按钮,可能今日已签到或页面未完全加载"); } // 4. 处理常见弹窗干扰 handlePopups(); } function handlePopups() { var closeBtn = text("关闭").findOne(2000) || text("我知道了").findOne(2000) || desc("关闭").findOne(2000) || text("暂不").findOne(2000); if (closeBtn) { closeBtn.click(); sleep(1000); } } main();
这段代码可以打开淘宝,但是打不开"红包签到"
回答
这段代码无法打开“红包签到”入口,主要受以下因素影响:淘宝首页元素加载存在网络延迟、目标控件可能被遮挡或位于屏幕外、选择器匹配过于宽泛导致误触或漏触、以及启动弹窗未及时处理阻塞了点击操作。
以下是优化后的脚本,已针对Rhino 1.7.15引擎兼容,并强化了元素查找、滚动定位与弹窗拦截逻辑:
// 文档地址 https://docs.hamibot.com/
"auto";
function main() {
app.launchApp("淘宝");
waitForHomePage();
// 启动后台弹窗监控线程
startPopupMonitor();
var entry = findRedPacketEntry();
if (entry) {
entry.click();
sleep(2000);
clickSignButton();
} else {
toast("未找到红包签到入口");
log("未找到红包签到入口,请使用Inspector检查当前页面控件属性");
}
// 脚本结束前关闭监控线程
threads.shutDownAll();
}
// 等待首页基础框架加载完成
function waitForHomePage() {
var timeout = 15000;
var start = new Date().getTime();
while (new Date().getTime() - start < timeout) {
if (text("首页").findOne(500) || text("我的淘宝").findOne(500)) {
return;
}
sleep(500);
}
log("首页加载超时");
}
// 查找红包签到入口(支持多选择器降级与滚动查找)
function findRedPacketEntry() {
var selectors = [
text("签到领红包"),
text("领红包"),
desc("签到领红包"),
desc("领红包"),
textContains("签到").className("android.widget.TextView"),
descContains("签到").className("android.widget.TextView")
];
// 优先在当前可视区域查找
for (var i = 0; i < selectors.length; i++) {
var target = selectors[i].findOne(1000);
if (target) return target;
}
// 未找到则向下滚动查找
log("未直接找到入口,尝试滚动查找...");
for (var j = 0; j < 3; j++) {
swipe(device.width / 2, device.height * 0.8, device.width / 2, device.height * 0.3, 500);
sleep(1000);
for (var k = 0; k < selectors.length; k++) {
var target = selectors[k].findOne(1000);
if (target) return target;
}
}
return null;
}
// 点击签到按钮
function clickSignButton() {
var signBtn = text("签到").findOne(3000) || text("立即签到").findOne(3000) || desc("签到").findOne(3000);
if (signBtn) {
signBtn.click();
toast("已执行签到");
} else {
toast("未找到签到按钮,可能今日已签到");
}
}
// 后台持续处理弹窗
function startPopupMonitor() {
threads.start(function() {
while (true) {
var closeBtn = text("关闭").findOne(1000) ||
text("我知道了").findOne(1000) ||
desc("关闭").findOne(1000) ||
text("暂不").findOne(1000) ||
text("取消").findOne(1000);
if (closeBtn) {
closeBtn.click();
sleep(500);
}
sleep(1000);
}
});
}
main();
关键改进说明
- 动态加载等待:使用
waitForHomePage()替代固定sleep(3000),通过检测底部导航栏特征元素判断页面是否就绪,避免网络延迟导致的选择器失效。 - 滚动查找机制:淘宝首页活动入口常位于首屏下方。脚本在直接匹配失败后,自动执行3次下滑操作,扩大控件搜索范围。
- 弹窗并发处理:将
handlePopups()改为threads.start()后台线程运行。淘宝启动后常伴随营销弹窗,后台线程可实时拦截,避免阻塞主流程的点击逻辑。 - 选择器降级策略:按精确文本 → 模糊文本 → 控件类型组合的顺序匹配,提高不同淘宝版本下的兼容性。
调试与最佳实践建议
- 使用 Hamibot Inspector(设备调试工具:https://hamibot.cn/inspector)连接手机,实时查看“红包签到”按钮的
text、desc、id或bounds属性,替换脚本中的选择器。 - 在关键节点添加
log()输出当前currentActivity()和控件状态,便于定位是页面未跳转还是元素未渲染。 - 若入口为纯图片按钮,可改用
className("android.widget.ImageView").boundsInside(x1, y1, x2, y2).findOne()或结合images.findColor()进行图像识别定位。 - 自动化任务建议添加重试机制与异常捕获,避免因单次网络波动导致脚本中断。