 | |  |  | 启动极速版任务页看小说赚钱自动阅读
- // AIWROK 完整自动化流程:启动极速版任务页看小说赚钱自动阅读
- // 全程使用 agent 方式操作,不依赖无障碍权限
- print.log("===== 极速版看小说做任务流程启动 =====");
- print.time();
- // ========== 工具函数 ==========
- function 执行Shell(命令) {
- var 结果 = agent.shell(命令);
- if (!结果) return "";
-
- var 结果字符串 = "";
- if (typeof 结果 === "string") {
- 结果字符串 = 结果;
- } else if (结果.toString) {
- 结果字符串 = 结果.toString();
- } else {
- 结果字符串 = "" + 结果;
- }
-
- var startIdx = -1;
- if (typeof 结果字符串.indexOf === "function") {
- startIdx = 结果字符串.indexOf("successMsg:");
- }
-
- if (startIdx !== -1) {
- var afterSuccess = 结果字符串.substring(startIdx + 11);
- var errorIdx = afterSuccess.indexOf(",errorMsg:");
- if (errorIdx !== -1) {
- var content = afterSuccess.substring(0, errorIdx);
- var endMarker = content.indexOf("UI hierchary dumped to:");
- if (endMarker !== -1) {
- content = content.substring(0, endMarker);
- }
- return "" + content.trim();
- }
- return "" + afterSuccess.trim();
- }
-
- return "" + 结果字符串;
- }
- function 获取UI() {
- var 临时文件 = "/sdcard/ui_dump.xml";
- agent.shell("uiautomator dump --compressed " + 临时文件 + " 2>/dev/null");
- var 结果 = agent.shell("cat " + 临时文件);
-
- if (!结果) return "";
-
- var 结果字符串 = "";
- if (typeof 结果 === "string") {
- 结果字符串 = 结果;
- } else if (结果.toString) {
- 结果字符串 = 结果.toString();
- } else {
- 结果字符串 = "" + 结果;
- }
-
- var startIdx = -1;
- if (typeof 结果字符串.indexOf === "function") {
- startIdx = 结果字符串.indexOf("successMsg:");
- }
-
- var content = "";
- if (startIdx !== -1) {
- var afterSuccess = 结果字符串.substring(startIdx + 11);
- var errorIdx = afterSuccess.indexOf(",errorMsg:");
- if (errorIdx !== -1) {
- content = afterSuccess.substring(0, errorIdx);
- var endMarker = content.indexOf("UI hierchary dumped to:");
- if (endMarker !== -1) {
- content = content.substring(0, endMarker);
- }
- } else {
- content = afterSuccess;
- }
- content = content.trim();
- } else {
- content = 结果字符串;
- }
-
- return "" + content;
- }
- function 字符串长度(str) {
- if (typeof str.length === "function") {
- return str.length();
- }
- return str.length || 0;
- }
- function 获取当前包名() {
- var uiXml = 获取UI();
- var m = uiXml.match(/package="([^"]+)"/);
- if (m) {
- return "" + m[1];
- }
- return "";
- }
- function 查找包含文字的节点(xml, 关键词) {
- var 节点列表 = [];
- for (var i = 0; i < 关键词.length; i++) {
- var 词 = 关键词[i];
- var pos = 0;
- while (true) {
- pos = xml.indexOf('text="' + 词 + '"', pos);
- if (pos < 0) break;
- var boundsStart = xml.indexOf('bounds="', pos);
- if (boundsStart >= 0) {
- var boundsEnd = xml.indexOf('"', boundsStart + 8);
- if (boundsEnd >= 0) {
- var boundsStr = xml.substring(boundsStart + 8, boundsEnd);
- var m = boundsStr.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);
- if (m) {
- var node = {
- text: 词,
- x1: parseInt(m[1]),
- y1: parseInt(m[2]),
- x2: parseInt(m[3]),
- y2: parseInt(m[4]),
- cx: (parseInt(m[1]) + parseInt(m[3])) / 2,
- cy: (parseInt(m[2]) + parseInt(m[4])) / 2
- };
- 节点列表.push(node);
- }
- }
- }
- pos += 字符串长度(词);
- }
- }
- return 节点列表;
- }
- function 模拟阅读(持续时间秒) {
- print.log("开始模拟阅读,持续 " + 持续时间秒 + " 秒");
- var 剩余时间 = 持续时间秒;
- while (剩余时间 > 0) {
- agent.swip(Math.floor(屏幕宽 * 0.8), Math.floor(屏幕高 * 0.5), Math.floor(屏幕宽 * 0.2), Math.floor(屏幕高 * 0.5), 300);
- sleep.second(秒 = 1);
- 剩余时间 -= 1;
- print.log("剩余阅读时间:" + 剩余时间 + " 秒");
- }
- print.log("模拟阅读结束");
- }
- // ========== 配置区 ==========
- var APP包名 = "com.ss.android.article.lite";
- var 循环次数 = 5;
- var 当前循环 = 0;
- var 任务TabX = 0.5;
- var 任务TabY = 0.9656;
- // ========== 获取设备信息 (agent模式) ==========
- var wm结果 = 执行Shell("wm size");
- var m = wm结果.match(/(\d+)x(\d+)/);
- var 屏幕宽 = m ? parseInt(m[1]) : 1080;
- var 屏幕高 = m ? parseInt(m[2]) : 2400;
- print.log("屏幕尺寸:" + 屏幕宽 + " x " + 屏幕高);
- print.log("代理状态:" + (agent.isOpen() ? "已开启" : "未开启"));
- print.log("目标APP:" + APP包名 + " (今日头条极速版)");
- // ========================================
- // 主循环开始
- // ========================================
- for (当前循环 = 1; 循环次数 == 0 || 当前循环 <= 循环次数; 当前循环++) {
- if (循环次数 > 0) {
- print.log("\n======================================");
- print.log("===== 第 " + 当前循环 + " / " + 循环次数 + " 次循环 =====");
- print.log("======================================");
- } else {
- print.log("\n======================================");
- print.log("===== 第 " + 当前循环 + " 次循环(无限模式)=====");
- print.log("======================================");
- }
- // ========================================
- // 步骤1:启动今日头条极速版
- // ========================================
- print.log("\n========== 步骤1:启动今日头条极速版 ==========");
-
- var 启动成功 = false;
- var 启动尝试次数 = 0;
- var 最大启动尝试 = 3;
-
- while (!启动成功 && 启动尝试次数 < 最大启动尝试) {
- 启动尝试次数++;
- try {
- agent.shell("monkey -p " + APP包名 + " -c android.intent.category.LAUNCHER 1");
- print.log("✓ 第" + 启动尝试次数 + "次尝试启动今日头条极速版");
- } catch (e) {
- print.log("⚠ 第" + 启动尝试次数 + "次启动失败:" + e.message);
- }
-
- sleep.second(秒 = 5);
-
- var 当前页面包名 = 获取当前包名();
- print.log("当前页面包名:" + 当前页面包名);
-
- if (当前页面包名 === APP包名) {
- 启动成功 = true;
- print.log("✓ APP启动成功");
- } else {
- print.log("⚠ 当前页面不是今日头条极速版,准备重新启动");
- }
- }
-
- if (!启动成功) {
- print.log("✗ 多次尝试启动失败,跳过本次循环");
- continue;
- }
- // ========================================
- // 步骤2:通过UI解析点击底部「任务」Tab
- // ========================================
- print.log("\n========== 步骤2:点击任务Tab ==========");
-
- var 找到任务Tab = false;
- var 尝试次数2 = 0;
- var 最大尝试次数2 = 3;
-
- while (!找到任务Tab && 尝试次数2 < 最大尝试次数2) {
- 尝试次数2++;
- var 首页UI = 获取UI();
- var xml长度2 = 字符串长度(首页UI);
-
- print.log("第 " + 尝试次数2 + " 次尝试获取首页UI,长度:" + xml长度2);
-
- if (xml长度2 < 100) {
- print.log("UI数据过短,重试");
- sleep.second(秒 = 1);
- continue;
- }
-
- var 任务Tab节点 = 查找包含文字的节点(首页UI, ["任务"]);
-
- if (任务Tab节点.length > 0) {
- var 任务Tab = 任务Tab节点[0];
- var 任务X = (任务Tab.x1 + 任务Tab.x2) / 2 / 屏幕宽;
- var 任务Y = (任务Tab.y1 + 任务Tab.y2) / 2 / 屏幕高;
- agent.clickPercent(任务X, 任务Y);
- print.log("✓ 已点击任务Tab,百分比坐标:(" + 任务X.toFixed(4) + ", " + 任务Y.toFixed(4) + ")");
- 找到任务Tab = true;
- } else {
- print.log("⚠ 未找到任务Tab,尝试使用默认坐标");
- agent.clickPercent(0.5, 0.9656);
- print.log("✓ 使用默认坐标点击任务Tab");
- 找到任务Tab = true;
- }
- }
- sleep.second(秒 = 3);
- // ========================================
- // 步骤3:使用opencv找图点击「看小说赚钱」
- // ========================================
- print.log("\n========== 步骤3:使用opencv找图识别「看小说赚钱」入口 ==========");
-
- var 找到看小说入口 = false;
- var 尝试次数 = 0;
- var 最大尝试次数 = 3;
-
- while (!找到看小说入口 && 尝试次数 < 最大尝试次数) {
- 尝试次数++;
- print.log("第 " + 尝试次数 + " 次尝试找图识别");
-
- try {
- var detects = opencv.findImagesEx('图色577630.cv');
-
- if (detects != null && detects.length > 0) {
- var 目标字符串 = "" + detects[0];
- print.log("✓ 找图成功,找到目标:" + 目标字符串);
-
- var rectMatch = 目标字符串.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
- if (rectMatch) {
- var x1 = parseFloat(rectMatch[1]);
- var y1 = parseFloat(rectMatch[2]);
- var x2 = parseFloat(rectMatch[3]);
- var y2 = parseFloat(rectMatch[4]);
- var cx = (x1 + x2) / 2;
- var cy = (y1 + y2) / 2;
- agent.clickPercent(cx, cy);
- print.log("✓ 已点击「看小说赚钱」,百分比坐标:(" + cx.toFixed(4) + ", " + cy.toFixed(4) + ")");
- 找到看小说入口 = true;
- } else {
- print.log("⚠ 无法解析矩形区域坐标");
- }
- } else {
- print.log("⚠ 未找到目标图片,尝试向上滑动");
- agent.swip(Math.floor(屏幕宽 * 0.5), Math.floor(屏幕高 * 0.8), Math.floor(屏幕宽 * 0.5), Math.floor(屏幕高 * 0.2), 500);
- sleep.second(秒 = 2);
- }
- } catch (e) {
- print.log("⚠ 找图失败:" + e.message);
- sleep.second(秒 = 1);
- }
- }
-
- if (!找到看小说入口) {
- print.log("✗ 多次尝试未找到「看小说赚钱」入口,跳过本次循环");
- continue;
- }
-
- sleep.second(秒 = 3);
- // ========================================
- // 步骤4:进入小说页面后,通过UI解析点击第一本小说
- // ========================================
- print.log("\n========== 步骤4:选择小说开始阅读 ==========");
-
- var 找到小说 = false;
- var 尝试次数4 = 0;
- var 最大尝试次数4 = 3;
-
- while (!找到小说 && 尝试次数4 < 最大尝试次数4) {
- 尝试次数4++;
- var 小说页面UI = 获取UI();
- var xml长度4 = 字符串长度(小说页面UI);
-
- print.log("第 " + 尝试次数4 + " 次尝试获取小说页面UI,长度:" + xml长度4);
-
- if (xml长度4 < 100) {
- print.log("UI数据过短,重试");
- sleep.second(秒 = 1);
- continue;
- }
-
- var 排行榜节点 = 查找包含文字的节点(小说页面UI, ["排行榜", "免费小说"]);
-
- if (排行榜节点.length > 0) {
- print.log("✓ 检测到小说页面,查找第一本小说");
- var 小说列表 = 查找包含文字的节点(小说页面UI, ["热度", "阅读", "1.", "1 "]);
-
- if (小说列表.length > 0) {
- var 第一本小说 = 小说列表[0];
- var 小说X = (第一本小说.x1 + 第一本小说.x2) / 2 / 屏幕宽;
- var 小说Y = (第一本小说.y1 + 第一本小说.y2) / 2 / 屏幕高;
- agent.clickPercent(小说X, 小说Y);
- print.log("✓ 已点击第一本小说,百分比坐标:(" + 小说X.toFixed(4) + ", " + 小说Y.toFixed(4) + ")");
- 找到小说 = true;
- } else {
- agent.clickPercent(0.25, 0.45);
- print.log("✓ 未找到具体小说节点,使用默认坐标点击");
- 找到小说 = true;
- }
- } else {
- agent.clickPercent(0.25, 0.45);
- print.log("✓ 未检测到排行榜,使用默认坐标点击");
- 找到小说 = true;
- }
- }
-
- sleep.second(秒 = 3);
- // ========================================
- // 步骤5:60秒倒计时阅读(自动翻页)
- // ========================================
- print.log("\n========== 步骤5:60秒倒计时阅读 ==========");
- 模拟阅读(60);
- // ========================================
- // 步骤6:关闭APP,准备重新启动
- // ========================================
- print.log("\n========== 步骤6:关闭APP ==========");
- try {
- agent.shell("am force-stop " + APP包名);
- print.log("✓ 已关闭今日头条极速版");
- } catch (e) {
- print.log("⚠ 关闭APP失败:" + e.message);
- }
- sleep.second(秒 = 2);
- print.log("本次循环完成");
- // ========================================
- // 循环间隔
- // ========================================
- if (循环次数 == 0 || 当前循环 < 循环次数) {
- print.log("\n========== 等待下一次循环 ==========");
- sleep.second(秒 = 5);
- }
- }
- // ========================================
- // 结果汇总
- // ========================================
- print.timeEnd();
- print.log("\n======================================");
- print.log("===== 所有循环执行完成 =====");
- if (循环次数 > 0) {
- print.log("总计执行:" + 循环次数 + " 次");
- } else {
- print.log("无限循环模式,已执行:" + (当前循环 - 1) + " 次");
- }
- print.log("======================================");
复制代码
| |  | |  |
|