自动发帖软件

标题: AIWROK软件自动找图利用agent代理模式删除应用版示例 [打印本页]

作者: 发帖软件    时间: 15 小时前
标题: AIWROK软件自动找图利用agent代理模式删除应用版示例
AIWROK软件自动找图利用agent代理模式删除应用版示例
AIWROK软件自动找图利用agent代理模式删除应用版示例 群发软件发帖工具
AIWROK软件自动找图利用agent代理模式删除应用版示例 群发软件发帖工具

  1. //// AIWROK软件自动找图利用agent代理模式删除应用版示例
  2. // 使用图色功能实现桌面应用删除流程

  3. // ========== 配置区(修改这里即可适配不同场景)==========
  4. var CV_FILE_APP_1 = '图色1.cv';
  5. var CV_FILE_APP_2 = '图色2.cv';
  6. var CV_FILE_TRASH = '垃圾箱.cv';

  7. print.log("===== agent 代理 API 删除应用版示例 =====");

  8. print.log("📌 配置信息:应用1CV=" + CV_FILE_APP_1 + ",应用2CV=" + CV_FILE_APP_2 + ",垃圾箱CV=" + CV_FILE_TRASH);
  9. print.log("📌 重要提示:请确保手机屏幕当前显示桌面!");

  10. var 屏幕宽 = screen.getScreenWidth();
  11. var 屏幕高 = screen.getScreenHeight();
  12. print.log("当前屏幕:" + 屏幕宽 + " x " + 屏幕高);

  13. // ========== 核心找图函数 ==========
  14. function 调用找图(cv文件名) {
  15.     var detects = null;
  16.     try {
  17.         detects = opencv.findImagesEx(cv文件名);
  18.         if (detects != null) {
  19.             var len = 0;
  20.             try { len = detects.length; } catch (e) { len = 0; }
  21.             if (len > 0) {
  22.                 print.log("✓ 使用 '" + cv文件名 + "' 格式调用成功");
  23.                 return detects;
  24.             }
  25.         }
  26.     } catch (e) {
  27.         print.log("⚠ '" + cv文件名 + "' 格式调用异常:" + e.message);
  28.     }
  29.     var 纯数字ID = cv文件名.replace(/[^0-9]/g, "");
  30.     if (纯数字ID !== "" && 纯数字ID !== cv文件名) {
  31.         try {
  32.             detects = opencv.findImagesEx(纯数字ID);
  33.             if (detects != null) {
  34.                 var len2 = 0;
  35.                 try { len2 = detects.length; } catch (e) { len2 = 0; }
  36.                 if (len2 > 0) {
  37.                     print.log("✓ 使用纯数字ID '" + 纯数字ID + "' 格式调用成功");
  38.                     return detects;
  39.                 }
  40.             }
  41.         } catch (e) {
  42.             print.log("⚠ 纯数字ID '" + 纯数字ID + "' 格式调用异常:" + e.message);
  43.         }
  44.     }
  45.     return null;
  46. }

  47. function 找图获取坐标(cv文件名) {
  48.     var detects = 调用找图(cv文件名);
  49.     if (detects == null) return null;
  50.     var 长度 = 0;
  51.     try {
  52.         长度 = detects.length;
  53.     } catch (e) {
  54.         长度 = 0;
  55.     }
  56.     if (长度 === 0) return null;
  57.     var dStr = "";
  58.     try {
  59.         dStr = "" + detects[0];
  60.     } catch (e) {
  61.         return null;
  62.     }
  63.     if (dStr === "null" || dStr === "" || dStr === "undefined") return null;
  64.     var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  65.     if (m) {
  66.         var left = parseFloat(m[1]);
  67.         var top = parseFloat(m[2]);
  68.         var right = parseFloat(m[3]);
  69.         var bottom = parseFloat(m[4]);
  70.         return {
  71.             left: left,
  72.             top: top,
  73.             right: right,
  74.             bottom: bottom,
  75.             centerX: (left + right) / 2,
  76.             centerY: (top + bottom) / 2,
  77.             width: right - left,
  78.             height: bottom - top
  79.         };
  80.     }
  81.     return null;
  82. }

  83. function 找图点击(cv文件名, 描述) {
  84.     var 坐标 = 找图获取坐标(cv文件名);
  85.     if (!坐标) {
  86.         print.log("✗ 未找到【" + 描述 + "】的图色匹配");
  87.         return false;
  88.     }
  89.     agent.clickPercent(坐标.centerX, 坐标.centerY);
  90.     print.log("✓ 已点击【" + 描述 + "】(图色匹配),百分比坐标(" + 坐标.centerX.toFixed(4) + "," + 坐标.centerY.toFixed(4) + ")");
  91.     return true;
  92. }

  93. function 等待找图成功(cv文件名, 描述, 超时秒) {
  94.     var 开始时间 = Date.now();
  95.     var 超时毫秒 = 超时秒 * 1000;

  96.     while (Date.now() - 开始时间 < 超时毫秒) {
  97.         var 坐标 = 找图获取坐标(cv文件名);
  98.         if (坐标) {
  99.             var 已等待 = Math.floor((Date.now() - 开始时间) / 1000);
  100.             print.log("✓ 在 " + 已等待 + " 秒后找到【" + 描述 + "】");
  101.             return 坐标;
  102.         }
  103.         sleep.second(秒 = 1);
  104.     }
  105.     print.log("✗ 等待 " + 超时秒 + " 秒后未找到【" + 描述 + "】");
  106.     return null;
  107. }

  108. // ========== 获取UI源码函数 ==========
  109. function 获取UI() {
  110.     var 临时文件 = "/sdcard/ui_dump.xml";
  111.     agent.shell("uiautomator dump --compressed " + 临时文件 + " 2>/dev/null");
  112.     var 结果 = agent.shell("cat " + 临时文件);
  113.    
  114.     if (!结果) return "";
  115.    
  116.     var 结果字符串 = "";
  117.     if (typeof 结果 === "string") {
  118.         结果字符串 = 结果;
  119.     } else if (结果.toString) {
  120.         结果字符串 = 结果.toString();
  121.     } else {
  122.         结果字符串 = "" + 结果;
  123.     }
  124.    
  125.     var startIdx = -1;
  126.     if (typeof 结果字符串.indexOf === "function") {
  127.         startIdx = 结果字符串.indexOf("successMsg:");
  128.     }
  129.    
  130.     var content = "";
  131.     if (startIdx !== -1) {
  132.         var afterSuccess = 结果字符串.substring(startIdx + 11);
  133.         var errorIdx = afterSuccess.indexOf(",errorMsg:");
  134.         if (errorIdx !== -1) {
  135.             content = afterSuccess.substring(0, errorIdx);
  136.             var endMarker = content.indexOf("UI hierchary dumped to:");
  137.             if (endMarker !== -1) {
  138.                 content = content.substring(0, endMarker);
  139.             }
  140.         } else {
  141.             content = afterSuccess;
  142.         }
  143.         content = content.trim();
  144.     } else {
  145.         content = 结果字符串;
  146.     }
  147.    
  148.     return "" + content;
  149. }

  150. // ========== 删除应用函数(使用touchDown/touchMove/touchUp正确用法)==========
  151. function 删除应用(appCvFile, trashCvFile, appName) {
  152.     print.log("\n--- 开始删除【" + appName + "】---");
  153.    
  154.     var app坐标 = 找图获取坐标(appCvFile);
  155.     if (!app坐标) {
  156.         print.log("✗ 未找到【" + appName + "】图标");
  157.         return false;
  158.     }
  159.     print.log("✓ 找到【" + appName + "】图标,中心坐标(" + app坐标.centerX.toFixed(4) + ", " + app坐标.centerY.toFixed(4) + ")");
  160.    
  161.     var appX = Math.floor(app坐标.centerX * 屏幕宽);
  162.     var appY = Math.floor(app坐标.centerY * 屏幕高);
  163.    
  164.     var trashX = Math.floor(屏幕宽 * 0.15);
  165.     var trashY = 60;
  166.     print.log("&#128204; 使用垃圾桶中心点坐标:(" + trashX + ", " + trashY + ")");
  167.    
  168.     var 触摸id = 0;
  169.    
  170.     print.log("&#128260; touchDown(" + 触摸id + ", " + appX + ", " + appY + ")");
  171.     agent.touchDown(触摸id, appX, appY);
  172.    
  173.     print.log("&#128260; 长按3秒触发编辑模式...");
  174.     for (var i = 0; i < 30; i++) {
  175.         agent.touchMove(触摸id, appX, appY);
  176.         sleep.millisecond(毫秒 = 100);
  177.     }
  178.    
  179.     print.log("&#128260; 直接拖动到顶部卸载按钮...");
  180.     var stepX = (trashX - appX) / 30;
  181.     var stepY = (trashY - appY) / 30;
  182.     for (var i = 1; i <= 30; i++) {
  183.         var currX = Math.floor(appX + stepX * i);
  184.         var currY = Math.floor(appY + stepY * i);
  185.         agent.touchMove(触摸id, currX, currY);
  186.         sleep.millisecond(毫秒 = 50);
  187.     }
  188.    
  189.     print.log("&#128260; 在卸载区域停留2秒等待变红...");
  190.     for (var i = 0; i < 20; i++) {
  191.         agent.touchMove(触摸id, trashX, trashY);
  192.         sleep.millisecond(毫秒 = 100);
  193.     }
  194.    
  195.     print.log("&#128260; touchUp(" + 触摸id + ")");
  196.     agent.touchUp(触摸id);
  197.    
  198.     sleep.second(秒 = 3);
  199.    
  200.     print.log("✓ 【" + appName + "】删除操作完成");
  201.     return true;
  202. }

  203. // ========== 获取桌面游戏包名 ==========
  204. print.log("\n--- 步骤1:获取桌面UI源码 ---");
  205. var xml = 获取UI();
  206. print.log("✓ 获取UI源码成功,长度:" + xml.length);

  207. print.log("\n--- 步骤2:提取桌面应用包名 ---");
  208. var packageRegex = /package="([^"]+)"/g;
  209. var packages = [];
  210. var match;
  211. while ((match = packageRegex.exec(xml)) !== null) {
  212.     var pkg = match[1];
  213.     if (pkg.indexOf("launcher") === -1 && pkg.indexOf("system") === -1 && packages.indexOf(pkg) === -1) {
  214.         packages.push(pkg);
  215.     }
  216. }

  217. print.log("&#128241; 桌面应用包名列表:");
  218. for (var i = 0; i < packages.length; i++) {
  219.     print.log("  " + (i + 1) + ". " + packages[i]);
  220. }

  221. // ========== 删除第一个应用(图色1.cv)==========
  222. print.log("\n--- 步骤3:删除应用1(" + CV_FILE_APP_1 + ")---");

  223. print.log("\n&#128204; 子步骤3.1:打开应用1");
  224. if (找图点击(CV_FILE_APP_1, "应用1图标")) {
  225.     sleep.second(秒 = 3);
  226.     print.log("✓ 应用1已打开");
  227.    
  228.     print.log("\n&#128204; 子步骤3.2:返回桌面");
  229.     agent.home();
  230.     sleep.second(秒 = 2);
  231.     print.log("✓ 已返回桌面");
  232. } else {
  233.     print.log("⚠ 应用1未找到,跳过打开步骤");
  234. }

  235. print.log("\n&#128204; 子步骤3.3:长按应用1图标拖到垃圾箱");
  236. 删除应用(CV_FILE_APP_1, CV_FILE_TRASH, "应用1");

  237. sleep.second(秒 = 3);

  238. // ========== 删除第二个应用(图色2.cv)==========
  239. print.log("\n--- 步骤4:删除应用2(" + CV_FILE_APP_2 + ")---");

  240. print.log("\n&#128204; 子步骤4.1:打开应用2");
  241. if (找图点击(CV_FILE_APP_2, "应用2图标")) {
  242.     sleep.second(秒 = 3);
  243.     print.log("✓ 应用2已打开");
  244.    
  245.     print.log("\n&#128204; 子步骤4.2:关闭应用2并返回桌面");
  246.     agent.home();
  247.     sleep.second(秒 = 2);
  248.     print.log("✓ 已返回桌面");
  249. } else {
  250.     print.log("⚠ 应用2未找到,跳过打开步骤");
  251. }

  252. print.log("\n&#128204; 子步骤4.3:长按应用2图标拖到垃圾箱");
  253. 删除应用(CV_FILE_APP_2, CV_FILE_TRASH, "应用2");

  254. sleep.second(秒 = 3);

  255. // ========== 验证删除结果 ==========
  256. print.log("\n--- 步骤5:验证删除结果 ---");

  257. var app1存在 = false;
  258. var app2存在 = false;

  259. try {
  260.     app1存在 = 调用找图(CV_FILE_APP_1) != null;
  261. } catch (e) {}

  262. try {
  263.     app2存在 = 调用找图(CV_FILE_APP_2) != null;
  264. } catch (e) {}

  265. print.log("&#128269; 验证结果:");
  266. print.log("  应用1(" + CV_FILE_APP_1 + "):" + (app1存在 ? "✗ 仍存在" : "✓ 已删除"));
  267. print.log("  应用2(" + CV_FILE_APP_2 + "):" + (app2存在 ? "✗ 仍存在" : "✓ 已删除"));

  268. print.log("\n===== 删除应用示例结束 =====");
复制代码


AIWROK软件自动找图利用agent代理模式删除应用版示例 群发软件发帖工具





欢迎光临 自动发帖软件 (http://www.fatiegongju.com/) Powered by Discuz! X3.2