// ========================
// Auto.js 循环任务自动化脚本 (智能界面判断版)
// 优化要点: 智能界面识别/自适应流程/错误恢复
// ========================
auto.waitFor();
console.show();
// 1. 通用函数:点击包含特定文本的控件
function clickText(text, timeout) {
timeout = timeout || 5000;
var target = text(text).findOne(timeout);
if (target && target.clickable()) {
target.click();
console.log("已点击: " + text);
return true;
} else {
console.log("未找到或不可点击: " + text);
return false;
}
}
// 2. 通用函数:查找并点击目标文本旁的特定按钮
function clickSiblingButton(targetText, buttonText, timeout) {
console.log("开始任务: 查找'" + targetText + "'旁的'" + buttonText + "'");
timeout = timeout || 5000;
var targetButton = textContains(targetText).findOne(timeout);
if (!targetButton) {
console.log("未找到目标文本: " + targetText);
return false;
}
var parentLayout = targetButton.parent();
if (!parentLayout) {
console.log("目标控件没有父控件,无法查找同级");
return false;
}
var found = false;
parentLayout.children().forEach(function(sibling) {
if (sibling.text() === buttonText && sibling.clickable()) {
sibling.click();
console.log("已点击: " + buttonText);
found = true;
}
});
return found;
}
// 定义一个函数来执行点击操作
function clickOnTarget(textToFind) {
var target = text(textToFind).findOne();
if (target) {
var bounds = target.bounds();
var centerX = bounds.centerX();
var centerY = bounds.centerY();
click(centerX, centerY);
sleep(1000); // 等待1秒以确保页面加载完成
return true;
} else {
console.log("未找到文本为: " + textToFind + " 的元素");
return false;
}
}
// 生成指定范围内的随机整数
function randomInRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
// 从文本中提取数字的函数(原代码中缺失此函数)
function extractNumbers(text) {
if (!text) return null;
// 提取数字,支持时间格式如"05:30"或纯数字
var numbers = text.match(/\d+/g);
if (numbers && numbers.length > 0) {
// 如果是时间格式,转换为总秒数
if (text.match(/^\d{1,2}:\d{2}$/)) {
var parts = text.split(':');
return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}
return parseInt(numbers.join(''));
}
return null;
}
// 2. 屏幕坐标计算(固定点+随机偏移)
// 获取屏幕的宽度和高度
var screenWidth = device.width;
var screenHeight = device.height;
// 生成随机的起始和结束坐标,确保在屏幕范围内
var startX = Math.min(Math.max(500 + randomInRange(-100, 100), 0), screenWidth);
var startY = Math.min(Math.max(1700 + randomInRange(-100, 100), 0), screenHeight);
var endX = Math.min(Math.max(700 - randomInRange(-100, 100), 0), screenWidth);
var endY = Math.min(Math.max(700 - randomInRange(-100, 100), 0), screenHeight);
// 3. 关键修改:先执行第一次滑动,触发倒计时显示
function mainSlideTask() {
if (textStartsWith("滑动浏览").exists() ||
textContains("浏览得肥料").exists()) {
console.log("执行首次滑动,触发倒计时显示...");
swipe(startX, startY, endX, endY, 1010);
sleep(2000); // 等待内容加载完成
// 4. 滑动后获取倒计时数值
var countdownText = findCountdownTextByIndex();
var seconds = extractFirstNumber(countdownText);
console.log("首次滑动后获取的倒计时文本:", countdownText);
console.log("转换后的秒数:", seconds);
// 5. 根据第一次获取的倒计时决定后续滑动策略
if (seconds > 15) {
toastLog("倒计时较长(" + seconds + "s),执行双向滑动5次");
performBidirectionalSwipes(5, startX, startY, endX, endY);
} else {
toastLog("倒计时较短(" + seconds + "s),执行单向滑动4次");
performUnidirectionalSwipes(4, startX, startY, endX, endY);
}
back();
sleep(2000);
// 滑动结束后,根据"搜索后浏览立得奖励"是否存在决定返回次数
if (text("搜索后浏览立得奖励").exists()) {
console.log("检测到'搜索后浏览立得奖励',执行两次返回操作");
back();
sleep(2000);
}
}
}
// 专用函数:通过索引定位查找倒计时文本
function findCountdownTextByIndex() {
var anchorWidget = textContains("滑动浏览").findOne(5000);
if (!anchorWidget) {
console.log("未找到锚点控件'滑动浏览'");
return null;
}
var parentLayout = anchorWidget.parent();
var siblingWidgets = parentLayout.children();
var anchorIndex = -1;
for (var i = 0; i < siblingWidgets.length; i++) {
if (siblingWidgets[i].equals(anchorWidget)) {
anchorIndex = i;
break;
}
}
// 方法A:通过相对索引定位(锚点上方相邻控件)
if (anchorIndex > 0) {
var targetIndex = anchorIndex - 1;
var countdownWidget = siblingWidgets[targetIndex];
var widgetText = countdownWidget.text();
console.log("通过索引定位找到倒计时控件:", widgetText);
return widgetText;
}
console.log("锚点位于第一个位置,上方无相邻控件");
return null;
}
// 专用函数:提取第一个数字
function extractFirstNumber(text) {
if (!text) {
console.log("提取数字: 输入文本为空");
return 0;
}
console.log("提取数字: 原始文本 =", text);
// 只提取第一个连续数字序列
var numbers = text.match(/\d+/);
if (numbers && numbers.length > 0) {
var result = parseInt(numbers[0]);
console.log("提取数字: 找到第一个数字 =", result);
return result;
}
console.log("提取数字: 未找到数字, 返回默认值0");
return 0;
}
// 专用函数:执行双向滑动
function performBidirectionalSwipes(times, startX, startY, endX, endY) {
for (var i = 0; i < times; i++) {
swipe(startX, startY, endX, endY, 1010);
sleep(2000);
swipe(endX, endY, startX, startY, 1010);
sleep(2000);
}
}
// 专用函数:执行单向滑动
function performUnidirectionalSwipes(times, startX, startY, endX, endY) {
for (var i = 0; i < times; i++) {
swipe(startX, startY, endX, endY, 1010);
sleep(3000);
}
}
// 最后,调用这个主函数来执行任务
//mainSlideTask();
// 修改后的 handleLoopTask 函数
function handleLoopTask(taskConfig) {
console.log("开始处理循环任务: " + taskConfig.name);
var maxAttempts = taskConfig.maxAttempts || 8;
var attempts = 0;
while (attempts < maxAttempts) {
attempts++;
console.log("尝试第 " + attempts + " 次");
if (text("当前页下单").exists()) {
sleep(1000);
console.log("未返回主任务页面,再次返回");
back();
}
// 首先检查任务项是否还存在
var targetButton = textContains(taskConfig.targetText).findOne(5000);
if (!targetButton) {
console.log("未找到任务项: " + taskConfig.targetText + ",任务可能已完成");
break; // 任务项不存在,退出循环
}
var parentLayout = targetButton.parent();
if (parentLayout) {
parentLayout = parentLayout.parent();
if (parentLayout) {
parentLayout = parentLayout.parent();
} else {
console.log("任务项无三级父控件");
break;
}
} else {
console.log("任务项无父控件");
break;
}
// 尝试点击"去完成"
var completeClicked = false;
var children = parentLayout.children();
for (var j = 0; j < children.length; j++) {
var sibling = children[j];
if (sibling.text() === taskConfig.completeText && sibling.clickable()) {
console.log("点击'" + taskConfig.completeText + "'");
sibling.click();
completeClicked = true;
sleep(2500);
}
}
if (!completeClicked) {
console.log("未能点击'" + taskConfig.completeText + "'");
sleep(2000);
continue; // 跳过本次循环的剩余部分,直接下一次尝试
}
// 执行滑动任务
if (text("搜索后浏览立得奖励").exists()) {
var inputField = className("android.widget.EditText").findOne(); // 获取输入框
if (inputField) {
inputField.setText("抽纸");
sleep(500);
text("搜索").findOne().click();
}
sleep(3000);
mainSlideTask();
} else {
if (textStartsWith("滑动浏览").exists() ||
textContains("浏览得肥料").exists()) {
mainSlideTask();
}
}
// 关键修改:再次检查任务项是否还存在
var taskItemStillExists = textContains(taskConfig.targetText).findOne(1000);
if (!taskItemStillExists) {
console.log("任务项已消失,任务可能已完成,继续下一个任务");
break; // 退出循环,移动到下一个任务
} else {
console.log("任务项仍存在,任务可能未完成,继续尝试");
}
sleep(1000);
}
console.log("退出任务: " + taskConfig.name + ",尝试次数: " + attempts);
return attempts >= maxAttempts; // 返回是否达到最大尝试次数
}
/**
* 查找指定任务并点击“去完成”按钮
* @param {string} taskText - 任务关键词
* @param {string} btnText - 按钮文本,默认为"去完成"
* @returns {boolean} 是否成功点击
*/
function clickTask(taskText, btnText) {
btnText = "去完成";
// 快速预检
if (!textContains(taskText).exists() || !text(btnText).exists()) {
console.warn(`⚠️ 未找到任务或按钮: "${taskText}" / "${btnText}"`);
return false;
}
try {
let taskCells = textContains(taskText).find();
if (taskCells.empty()) return false;
for (let i = 0; i < taskCells.size(); i++) {
let cell = taskCells.get(i);
let parent = cell.parent();
// 向上查找包含按钮的共同父容器
while (parent) {
let button = parent.findOne(text(btnText));
if (button && button.visibleToUser() && (button.clickable() || button.enabled())) {
let b = button.bounds();
click(b.centerX(), b.centerY());
console.log(`👉 成功点击【${btnText}】按钮,任务:“${taskText}”`);
return true; // 成功点击 → 返回 true
}
parent = parent.parent();
}
}
console.warn(`⚠️ 找到了任务但未找到可点击的【${btnText}】按钮`);
return false;
} catch (e) {
console.error(`[clickTask] 错误: ${e.message}`);
return false;
}
}
// 任务配置
var loopTasks = [
{
name: "浏览15秒得奖励",
targetText: "浏览15秒",
completeText: "去完成",
maxAttempts: 10
},
{
name: "浏览得奖励",
targetText: "浏览得奖励",
completeText: "去完成",
maxAttempts: 10
}
];
// ========================
// 主程序
// ========================
console.log("脚本启动,开始执行任务...");
var maxMainLoops = 10;
for (var mainLoopCount = 1; mainLoopCount <= maxMainLoops; mainLoopCount++) {
console.log("\n===== 主循环第 " + mainLoopCount + " 次开始 =====");
// 执行循环任务 - 每个任务会内部循环直到完成
for (var k = 0; k < loopTasks.length; k++) {
var task = loopTasks[k];
handleLoopTask(task);
sleep(2000);
}
console.log("===== 主循环第 " + mainLoopCount + " 次完成 =====");
sleep(1000);
}
console.log("脚本执行完成");
toast("任务脚本执行完成");
以上脚本可以找到循环任务“浏览15秒得”可不可以替换到现在的脚本中