// ========================
// Auto.js 循环任务自动化脚本 (智能界面判断版)
// 优化要点: 智能界面识别/自适应流程/错误恢复
// ========================
auto.waitFor();
console.show();
// 1. 通用函数:点击包含特定文本的控件
function clickText(text, timeout) {
timeout = timeout || 5000;
let 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;
let targetButton = textContains(targetText).findOne(timeout);
if (!targetButton) {
console.log("未找到目标文本: " + targetText);
return false;
}
let parentLayout = targetButton.parent();
if (!parentLayout) {
console.log("目标控件没有父控件,无法查找同级");
return false;
}
let found = false;
parentLayout.children().forEach(sibling => {
if (sibling.text() === buttonText && sibling.clickable()) {
sibling.click();
console.log("已点击: " + buttonText);
found = true;
}
});
return found;
}
// 定义一个函数来执行点击操作
function clickOnTarget(textToFind) {
let target = text(textToFind).findOne();
if (target) {
let bounds = target.bounds();
let centerX = bounds.centerX();
let 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"或纯数字
let numbers = text.match(/\d+/g);
if (numbers && numbers.length > 0) {
// 如果是时间格式,转换为总秒数
if (text.match(/^\d{1,2}:\d{2}$/)) {
let parts = text.split(':');
return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}
return parseInt(numbers.join(''));
}
return null;
}
// 2. 屏幕坐标计算(固定点+随机偏移)
// 获取屏幕的宽度和高度
let screenWidth = device.width;
let screenHeight = device.height;
var success1 = executeSingleTask(
"去淘金币",
"浏览15秒得",
"去完成"
);
if (success1) {
sleep(8000);
back();
console.log("单任务执行成功!");
} else {
console.log("单任务执行失败或未完成");
}
var success2 = executeSingleTask(
"去微博看看热搜",
"去微博看看热搜",
"去完成"
);
if (success2) {
sleep(8000);
launchApp("淘宝"); // 字符串形式
console.log("去微博任务完成,已返回淘宝");
} else {
console.log("去微博任务执行失败");
}
var success3 = executeSingleTask(
"领百亿红包",
"浏览5秒得",
"去完成"
);
if (success3) {
sleep(8000);
back();
console.log("领百亿红包任务完成");
} else {
console.log("领百亿红包任务失败");
}
// 专用函数:通过索引定位查找倒计时文本
function findCountdownTextByIndex() {
let anchorWidget = textContains("滑动浏览").findOne(5000);
if (!anchorWidget) {
console.log("未找到锚点控件'滑动浏览'");
return null;
}
let parentLayout = anchorWidget.parent();
let siblingWidgets = parentLayout.children();
let anchorIndex = siblingWidgets.indexOf(anchorWidget);
// 方法A:通过相对索引定位(锚点上方相邻控件)
if (anchorIndex > 0) {
let targetIndex = anchorIndex - 1;
let countdownWidget = siblingWidgets[targetIndex];
let widgetText = countdownWidget.text();
console.log("通过索引定位找到倒计时控件:", widgetText);
return widgetText;
}
console.log("锚点位于第一个位置,上方无相邻控件");
return null;
}
// 专用函数:提取第一个数字
function extractFirstNumber(text) {
if (!text) {
console.log("提取数字: 输入文本为空");
return 0;
}
console.log("提取数字: 原始文本 =", text);
// 只提取第一个连续数字序列
let numbers = text.match(/\d+/);
if (numbers && numbers.length > 0) {
let result = parseInt(numbers[0]);
console.log("提取数字: 找到第一个数字 =", result);
return result;
}
console.log("提取数字: 未找到数字, 返回默认值0");
return 0;
}
// 专用函数:执行双向滑动
function performBidirectionalSwipes(times, startX, startY, endX, endY) {
for (let 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 (let i = 0; i < times; i++) {
swipe(startX, startY, endX, endY, 1010);
sleep(3000);
}
}
// 最后,调用这个主函数来执行任务
//mainSlideTask();
// 修改后的 handleLoopTask 函数
function handleLoopTask(taskConfig) {
console.log("开始处理循环任务: " + taskConfig.name);
let maxAttempts = taskConfig.maxAttempts || 8;
let attempts = 0;
while (attempts < maxAttempts) {
attempts++;
console.log("尝试第 " + attempts + " 次");
if (text("当前页下单").exists()) {
sleep(1000);
console.log("未返回主任务页面,再次返回");
back();
}
// 首先检查任务项是否还存在
let targetButton = textContains(taskConfig.targetText).findOne(5000);
if (!targetButton) {
console.log("未找到任务项: " + taskConfig.targetText + ",任务可能已完成");
break; // 任务项不存在,退出循环[6,7](@ref)
}
let parentLayout = targetButton.parent().parent().parent();
if (!parentLayout) {
console.log("任务项无父控件");
break;
}
// 尝试点击"去完成"
let completeClicked = false;
parentLayout.children().forEach(sibling => {
if (sibling.text() === taskConfig.completeText && sibling.clickable()) {
console.log("点击'" + taskConfig.completeText + "'");
sibling.click();
completeClicked = true;
sleep(2500);
}
});
if (!completeClicked) {
console.log("未能点击'" + taskConfig.completeText + "'");
// 不立即break,可能重试[6](@ref)
sleep(2000);
continue; // 跳过本次循环的剩余部分,直接下一次尝试
}
// 执行滑动任务
if (text("搜索后浏览立得奖励").exists()) {
//sleep(2000);
//click(619,376);
var inputField = className("android.widget.EditText").findOne();// 获取当前获得焦点控件focusedWidget();
if (inputField) {
// 直接设置文本,这是最可靠的方式
inputField.setText("抽纸");
// 将需要粘贴的文本"抽纸"设置到系统剪贴板
//setClip("抽纸");
sleep(500);
//paste();
sleep(500);
text("搜索").findOne().click();
}
sleep(3000);
mainSlideTask()
}else {
if(textStartsWith("滑动浏览") ||
textContains("浏览得肥料").exists()){
mainSlideTask();
//clickOnTarget("抽纸");
}
}
// 等待页面稳定
//sleep(2000);
// 关键修改:再次检查任务项是否还存在[2](@ref)
let taskItemStillExists = textContains(taskConfig.targetText).findOne(1000);
if (!taskItemStillExists) {
console.log("任务项已消失,任务可能已完成,继续下一个任务");
break; // 退出循环,移动到下一个任务
} else {
console.log("任务项仍存在,任务可能未完成,继续尝试");
}
// 如果任务项还存在,但可能需要等待,可以添加延迟
sleep(1000);
}
console.log("退出任务: " + taskConfig.name + ",尝试次数: " + attempts);
return attempts >= maxAttempts; // 返回是否达到最大尝试次数
}
// ========================
// 新增函数:执行单次任务 (ES5 语法)
// ========================
function executeSingleTask(taskName, targetText, completeButtonText) {
// 参数校验
if (!taskName || !targetText || !completeButtonText) {
console.log("executeSingleTask 错误: 缺少必要参数");
return false;
}
console.log("开始执行单任务: " + taskName);
// 1. 查找包含目标文本的任务项
var targetWidget = textContains(targetText).findOne(5000);
if (!targetWidget) {
console.log("未找到任务关键词: " + targetText);
return false;
}
// 2. 获取父布局以便查找同级控件(如“去完成”按钮)
var parent = targetWidget.parent();
if (!parent) {
console.log("目标控件无父布局,无法查找按钮");
return false;
}
// 3. 遍历同级控件查找可点击的“去完成”按钮
var clicked = false;
parent.children().forEach(function(child) {
if (child.text() === completeButtonText && child.clickable()) {
console.log("点击按钮: " + completeButtonText);
child.click();
clicked = true;
sleep(2500); // 等待页面跳转
}
});
if (!clicked) {
console.log("未能点击: " + completeButtonText);
return false;
}
// 4. 判断是否进入搜索浏览类任务(根据界面特征决定行为)
if (text("搜索后浏览立得奖励").exists()) {
console.log("检测到搜索浏览任务,执行搜索操作");
// 等待输入框出现并输入内容
var inputField = className("android.widget.EditText").findOne(3000);
if (inputField) {
inputField.setText("抽纸");
console.log("已输入搜索词: 抽纸");
sleep(800);
// 点击搜索按钮
if (text("搜索").exists()) {
text("搜索").findOne().click();
console.log("点击搜索按钮");
sleep(3000);
}
} else {
console.log("未找到输入框,跳过搜索");
sleep(2000);
}
// 执行滑动任务
mainSlideTask();
} else if (textStartsWith("滑动浏览").exists() || textContains("浏览得肥料").exists()) {
console.log("进入滑动浏览任务");
mainSlideTask();
} else {
console.log("未知任务类型,等待3秒观察");
sleep(3000);
}
// 5. 完成后返回主任务页
console.log("任务完成,返回...");
back();
sleep(2000);
// 检查任务是否完成(任务项消失)
if (!textContains(targetText).exists()) {
console.log("✅ 任务已完成: " + taskName);
return true;
} else {
console.log("⚠️ 任务可能未完成: " + taskName);
return false;
}
}
var success1 = executeSingleTask(
"去淘金币",
"浏览15秒得",
"去完成"
);
if (success1) {
sleep(8000);
back();
console.log("单任务执行成功!");
} else {
console.log("单任务执行失败或未完成");
}
var success2 = executeSingleTask(
"去微博看看热搜",
"去微博看看热搜",
"去完成"
);
if (success2) {
sleep(8000);
launchApp("淘宝"); // 字符串形式
console.log("去微博任务完成,已返回淘宝");
} else {
console.log("去微博任务执行失败");
}
var success3 = executeSingleTask(
"领百亿红包",
"浏览5秒得",
"去完成"
);
if (success3) {
sleep(8000);
back();
console.log("领百亿红包任务完成");
} else {
console.log("领百亿红包任务失败");
}
// 任务配置
var loopTasks = [
{
name: "浏览15秒得奖励",
targetText: "浏览15秒",
completeText: "去完成",
maxAttempts: 10
},
{
name: "浏览得奖励",
targetText: "浏览得奖励",
completeText: "去完成",
maxAttempts: 10
}
];
// ========================
// 主程序
// ========================
console.log("脚本启动,开始执行任务...");
let maxMainLoops = 10;
for (let mainLoopCount = 1; mainLoopCount <= maxMainLoops; mainLoopCount++) {
console.log(`\n===== 主循环第 ${mainLoopCount} 次开始 =====`);
// 执行循环任务 - 每个任务会内部循环直到完成
for (let task of loopTasks) {
handleLoopTask(task);
sleep(2000);
}
console.log(`===== 主循环第 ${mainLoopCount} 次完成 =====`);
sleep(1000);
}
console.log("脚本执行完成");
toast("任务脚本执行完成");
这是我当前的脚本,配置任务能运行,单任务直接显示未找到就直接跳过了