 | |  |  | AIWROK软件自动找图利用agent代理模式删除应用版示例
- //// AIWROK软件自动找图利用agent代理模式删除应用版示例
- // 使用图色功能实现桌面应用删除流程
- // ========== 配置区(修改这里即可适配不同场景)==========
- var CV_FILE_APP_1 = '图色1.cv';
- var CV_FILE_APP_2 = '图色2.cv';
- var CV_FILE_TRASH = '垃圾箱.cv';
- print.log("===== agent 代理 API 删除应用版示例 =====");
- print.log("📌 配置信息:应用1CV=" + CV_FILE_APP_1 + ",应用2CV=" + CV_FILE_APP_2 + ",垃圾箱CV=" + CV_FILE_TRASH);
- print.log("📌 重要提示:请确保手机屏幕当前显示桌面!");
- var 屏幕宽 = screen.getScreenWidth();
- var 屏幕高 = screen.getScreenHeight();
- print.log("当前屏幕:" + 屏幕宽 + " x " + 屏幕高);
- // ========== 核心找图函数 ==========
- function 调用找图(cv文件名) {
- var detects = null;
- try {
- detects = opencv.findImagesEx(cv文件名);
- if (detects != null) {
- var len = 0;
- try { len = detects.length; } catch (e) { len = 0; }
- if (len > 0) {
- print.log("✓ 使用 '" + cv文件名 + "' 格式调用成功");
- return detects;
- }
- }
- } catch (e) {
- print.log("⚠ '" + cv文件名 + "' 格式调用异常:" + e.message);
- }
- var 纯数字ID = cv文件名.replace(/[^0-9]/g, "");
- if (纯数字ID !== "" && 纯数字ID !== cv文件名) {
- try {
- detects = opencv.findImagesEx(纯数字ID);
- if (detects != null) {
- var len2 = 0;
- try { len2 = detects.length; } catch (e) { len2 = 0; }
- if (len2 > 0) {
- print.log("✓ 使用纯数字ID '" + 纯数字ID + "' 格式调用成功");
- return detects;
- }
- }
- } catch (e) {
- print.log("⚠ 纯数字ID '" + 纯数字ID + "' 格式调用异常:" + e.message);
- }
- }
- return null;
- }
- function 找图获取坐标(cv文件名) {
- var detects = 调用找图(cv文件名);
- if (detects == null) return null;
- var 长度 = 0;
- try {
- 长度 = detects.length;
- } catch (e) {
- 长度 = 0;
- }
- if (长度 === 0) return null;
- var dStr = "";
- try {
- dStr = "" + detects[0];
- } catch (e) {
- return null;
- }
- if (dStr === "null" || dStr === "" || dStr === "undefined") return null;
- var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
- if (m) {
- var left = parseFloat(m[1]);
- var top = parseFloat(m[2]);
- var right = parseFloat(m[3]);
- var bottom = parseFloat(m[4]);
- return {
- left: left,
- top: top,
- right: right,
- bottom: bottom,
- centerX: (left + right) / 2,
- centerY: (top + bottom) / 2,
- width: right - left,
- height: bottom - top
- };
- }
- return null;
- }
- function 找图点击(cv文件名, 描述) {
- var 坐标 = 找图获取坐标(cv文件名);
- if (!坐标) {
- print.log("✗ 未找到【" + 描述 + "】的图色匹配");
- return false;
- }
- agent.clickPercent(坐标.centerX, 坐标.centerY);
- print.log("✓ 已点击【" + 描述 + "】(图色匹配),百分比坐标(" + 坐标.centerX.toFixed(4) + "," + 坐标.centerY.toFixed(4) + ")");
- return true;
- }
- function 等待找图成功(cv文件名, 描述, 超时秒) {
- var 开始时间 = Date.now();
- var 超时毫秒 = 超时秒 * 1000;
- while (Date.now() - 开始时间 < 超时毫秒) {
- var 坐标 = 找图获取坐标(cv文件名);
- if (坐标) {
- var 已等待 = Math.floor((Date.now() - 开始时间) / 1000);
- print.log("✓ 在 " + 已等待 + " 秒后找到【" + 描述 + "】");
- return 坐标;
- }
- sleep.second(秒 = 1);
- }
- print.log("✗ 等待 " + 超时秒 + " 秒后未找到【" + 描述 + "】");
- return null;
- }
- // ========== 获取UI源码函数 ==========
- 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;
- }
- // ========== 删除应用函数(使用touchDown/touchMove/touchUp正确用法)==========
- function 删除应用(appCvFile, trashCvFile, appName) {
- print.log("\n--- 开始删除【" + appName + "】---");
-
- var app坐标 = 找图获取坐标(appCvFile);
- if (!app坐标) {
- print.log("✗ 未找到【" + appName + "】图标");
- return false;
- }
- print.log("✓ 找到【" + appName + "】图标,中心坐标(" + app坐标.centerX.toFixed(4) + ", " + app坐标.centerY.toFixed(4) + ")");
-
- var appX = Math.floor(app坐标.centerX * 屏幕宽);
- var appY = Math.floor(app坐标.centerY * 屏幕高);
-
- var trashX = Math.floor(屏幕宽 * 0.15);
- var trashY = 60;
- print.log("📌 使用垃圾桶中心点坐标:(" + trashX + ", " + trashY + ")");
-
- var 触摸id = 0;
-
- print.log("🔄 touchDown(" + 触摸id + ", " + appX + ", " + appY + ")");
- agent.touchDown(触摸id, appX, appY);
-
- print.log("🔄 长按3秒触发编辑模式...");
- for (var i = 0; i < 30; i++) {
- agent.touchMove(触摸id, appX, appY);
- sleep.millisecond(毫秒 = 100);
- }
-
- print.log("🔄 直接拖动到顶部卸载按钮...");
- var stepX = (trashX - appX) / 30;
- var stepY = (trashY - appY) / 30;
- for (var i = 1; i <= 30; i++) {
- var currX = Math.floor(appX + stepX * i);
- var currY = Math.floor(appY + stepY * i);
- agent.touchMove(触摸id, currX, currY);
- sleep.millisecond(毫秒 = 50);
- }
-
- print.log("🔄 在卸载区域停留2秒等待变红...");
- for (var i = 0; i < 20; i++) {
- agent.touchMove(触摸id, trashX, trashY);
- sleep.millisecond(毫秒 = 100);
- }
-
- print.log("🔄 touchUp(" + 触摸id + ")");
- agent.touchUp(触摸id);
-
- sleep.second(秒 = 3);
-
- print.log("✓ 【" + appName + "】删除操作完成");
- return true;
- }
- // ========== 获取桌面游戏包名 ==========
- print.log("\n--- 步骤1:获取桌面UI源码 ---");
- var xml = 获取UI();
- print.log("✓ 获取UI源码成功,长度:" + xml.length);
- print.log("\n--- 步骤2:提取桌面应用包名 ---");
- var packageRegex = /package="([^"]+)"/g;
- var packages = [];
- var match;
- while ((match = packageRegex.exec(xml)) !== null) {
- var pkg = match[1];
- if (pkg.indexOf("launcher") === -1 && pkg.indexOf("system") === -1 && packages.indexOf(pkg) === -1) {
- packages.push(pkg);
- }
- }
- print.log("📱 桌面应用包名列表:");
- for (var i = 0; i < packages.length; i++) {
- print.log(" " + (i + 1) + ". " + packages[i]);
- }
- // ========== 删除第一个应用(图色1.cv)==========
- print.log("\n--- 步骤3:删除应用1(" + CV_FILE_APP_1 + ")---");
- print.log("\n📌 子步骤3.1:打开应用1");
- if (找图点击(CV_FILE_APP_1, "应用1图标")) {
- sleep.second(秒 = 3);
- print.log("✓ 应用1已打开");
-
- print.log("\n📌 子步骤3.2:返回桌面");
- agent.home();
- sleep.second(秒 = 2);
- print.log("✓ 已返回桌面");
- } else {
- print.log("⚠ 应用1未找到,跳过打开步骤");
- }
- print.log("\n📌 子步骤3.3:长按应用1图标拖到垃圾箱");
- 删除应用(CV_FILE_APP_1, CV_FILE_TRASH, "应用1");
- sleep.second(秒 = 3);
- // ========== 删除第二个应用(图色2.cv)==========
- print.log("\n--- 步骤4:删除应用2(" + CV_FILE_APP_2 + ")---");
- print.log("\n📌 子步骤4.1:打开应用2");
- if (找图点击(CV_FILE_APP_2, "应用2图标")) {
- sleep.second(秒 = 3);
- print.log("✓ 应用2已打开");
-
- print.log("\n📌 子步骤4.2:关闭应用2并返回桌面");
- agent.home();
- sleep.second(秒 = 2);
- print.log("✓ 已返回桌面");
- } else {
- print.log("⚠ 应用2未找到,跳过打开步骤");
- }
- print.log("\n📌 子步骤4.3:长按应用2图标拖到垃圾箱");
- 删除应用(CV_FILE_APP_2, CV_FILE_TRASH, "应用2");
- sleep.second(秒 = 3);
- // ========== 验证删除结果 ==========
- print.log("\n--- 步骤5:验证删除结果 ---");
- var app1存在 = false;
- var app2存在 = false;
- try {
- app1存在 = 调用找图(CV_FILE_APP_1) != null;
- } catch (e) {}
- try {
- app2存在 = 调用找图(CV_FILE_APP_2) != null;
- } catch (e) {}
- print.log("🔍 验证结果:");
- print.log(" 应用1(" + CV_FILE_APP_1 + "):" + (app1存在 ? "✗ 仍存在" : "✓ 已删除"));
- print.log(" 应用2(" + CV_FILE_APP_2 + "):" + (app2存在 ? "✗ 仍存在" : "✓ 已删除"));
- print.log("\n===== 删除应用示例结束 =====");
复制代码
| |  | |  |
|