YYPOST群发软件 发表于 2026-3-24 08:28:18

苹果脚本屏幕事件EVENT示例

苹果脚本屏幕事件EVENT示例








/**
* ============================================
* AIWROK 屏幕自动化实战案例教学
* 版本:1.0.0
* 平台:iOS (AIWROK)
* QQ 群:711841924 群一,苹果内测群 528816639
* ============================================
*
* 教学目标:
* 1. 📖 掌握 OCR 文本识别与点击
* 2. 🎯 学会找图定位与交互
* 3. 🖱️ 理解多种点击方式的应用场景
* 4. ⚙️ 构建完整的自动化流程
* 5. 🛡️ 错误处理与稳定性优化
*/

// ==================== 第一部分:基础准备 ====================

/**
* 工具函数定义
*/
function sleep(ms) {
    var start = Date.now();
    while (Date.now() - start < ms) {
      // 阻塞等待
    }
}

function printl(msg) {
    console.log(msg);
}

/**
* 全局配置对象
*/
var Config = {
    appName: "屏幕自动化实战教学",
    version: "1.0.0",
    debugMode: true,
    defaultRegion: , // 默认全屏
    clickDelay: 500, // 点击延迟 (ms)
    retryTimes: 3, // 默认重试次数
    ocrLockEnabled: false // OCR 锁定开关
};

// ==================== 第二部分:核心技能模块 ====================

/**
* 模块 1: OCR 文本识别基础
*/
var OCRModule = {
    /**
   * 任务 1.1: 获取屏幕所有文本
   */
    getAllText: function() {
      printl("\n【任务 1.1】获取屏幕所有文本");
      try {
            // 方式 1: 使用 screen.ocr() (快捷方式)
            var ocrResult = screen.ocr(0, 0, 1, 1);
            var allText = ocrResult.getAllString();
            printl("识别到的文本内容:\n" + allText);
            printl("文本长度:" + allText.length);
            return allText;
      } catch (e) {
            printl("错误:" + e);
            return "";
      }
    },
   
    /**
   * 任务 1.2: 查找特定文本(使用 findIncludeText)
   */
    findText: function(targetText) {
      printl("\n【任务 1.2】查找特定文本:" + targetText);
      try {
            var ocrResult = screen.ocr(0, 0, 1, 1);
            // 使用 findIncludeText 代替 findText
            var detect = ocrResult.findIncludeText(targetText, Config.defaultRegion);
            
            if (detect != null) {
                printl("✓ 找到目标对象");
                // 使用 getRect() 获取位置
                var rect = detect.getRect();
                printl("位置信息:左=" + rect.getLeft() + ", 上=" + rect.getTop());
                printl("尺寸信息:宽=" + rect.getWidth() + ", 高=" + rect.getHeight());
                printl("中心点:(" + rect.getCenterX() + ", " + rect.getCenterY() + ")");
                return detect;
            } else {
                printl("✗ 未找到文本:" + targetText);
                return null;
            }
      } catch (e) {
            printl("错误:" + e);
            return null;
      }
    },
   
    /**
   * 任务 1.3: 查找包含特定文本的多个目标
   */
    findIncludeTexts: function(keyword) {
      printl("\n【任务 1.3】查找包含关键词的所有目标:" + keyword);
      try {
            var ocrResult = screen.ocr(0, 0, 1, 1);
            var targets = ocrResult.findIncludeTexts(keyword, Config.defaultRegion);
            
            if (targets && targets.length > 0) {
                printl("找到 " + targets.length + " 个包含 '" + keyword + "' 的目标对象");
                for (var i = 0; i < Math.min(5, targets.length); i++) {
                  var rect = targets.getRect();
                  printl("[" + (i+1) + "] 位置:(" + rect.getCenterX().toFixed(3) + ", " + rect.getCenterY().toFixed(3) + ")");
                }
                return targets;
            } else {
                printl("未找到包含 '" + keyword + "' 的目标");
                return [];
            }
      } catch (e) {
            printl("错误:" + e);
            return [];
      }
    },
   
    /**
   * 任务 1.4: 使用正则表达式查找
   */
    findWithRegex: function(regex) {
      printl("\n【任务 1.4】使用正则表达式查找:" + regex);
      try {
            var ocrResult = screen.ocr(0, 0, 1, 1);
            var targets = ocrResult.findTextWithRegex(regex, Config.defaultRegion);
            
            if (targets && targets.length > 0) {
                printl("✓ 找到 " + targets.length + " 个匹配项");
                for (var i = 0; i < Math.min(3, targets.length); i++) {
                  var rect = targets.getRect();
                  printl("[" + (i+1) + "] 位置:(" + rect.getCenterX().toFixed(3) + ", " + rect.getCenterY().toFixed(3) + ")");
                }
                return targets;
            } else {
                printl("✗ 未找到匹配项");
                return [];
            }
      } catch (e) {
            printl("错误:" + e);
            return [];
      }
    }
};

/**
* 模块 2: 点击操作核心
*/
var ClickModule = {
    /**
   * 任务 2.1: 绝对坐标点击
   */
    clickAbsolute: function(x, y) {
      printl("\n【任务 2.1】绝对坐标点击:(" + x + ", " + y + ")");
      try {
            hid.click(x, y);
            sleep(Config.clickDelay);
            printl("✓ 点击成功");
      } catch (e) {
            printl("错误:" + e);
      }
    },
   
    /**
   * 任务 2.2: 百分比坐标点击
   */
    clickPercent: function(xPercent, yPercent) {
      printl("\n【任务 2.2】百分比坐标点击:(" + xPercent + ", " + yPercent + ")");
      try {
            hid.clickPercent(xPercent, yPercent);
            sleep(Config.clickDelay);
            printl("✓ 点击成功");
      } catch (e) {
            printl("错误:" + e);
      }
    },
   
    /**
   * 任务 2.3: 双击操作
   */
    doubleClick: function(x, y) {
      printl("\n【任务 2.3】双击操作:(" + x + ", " + y + ")");
      try {
            hid.doubleClick(x, y);
            sleep(Config.clickDelay * 2);
            printl("✓ 双击成功");
      } catch (e) {
            printl("错误:" + e);
      }
    },
   
    /**
   * 任务 2.4: 点击 OCR 识别目标
   */
    clickOcrTarget: function(detect, clickType) {
      printl("\n【任务 2.4】点击 OCR 识别目标");
      if (!detect) {
            printl("✗ 目标为空或无效,无法点击");
            return false;
      }
      
      try {
            if (clickType === "center") {
                // 使用 getRect() 获取中心点
                var rect = detect.getRect();
                var centerX = rect.getCenterX();
                var centerY = rect.getCenterY();
                printl("点击中心点:(" + centerX + ", " + centerY + ")");
                hid.click(centerX, centerY);
            } else {
                printl("随机点击文本区域");
                detect.clickRandom();
            }
            
            sleep(Config.clickDelay);
            printl("✓ 点击成功");
            return true;
      } catch (e) {
            printl("错误:" + e);
            return false;
      }
    },
   
    /**
   * 任务 2.5: 批量点击
   */
    clickMultipleTargets: function(detects) {
      printl("\n【任务 2.5】批量点击多个目标");
      if (!detects || detects.length === 0) {
            printl("✗ 没有可点击的目标");
            return;
      }
      
      printl("准备点击 " + detects.length + " 个目标");
      for (var i = 0; i < detects.length; i++) {
            printl("点击目标 " + (i + 1) + "/" + detects.length);
            detects.clickRandom();
            sleep(300);
      }
      printl("✓ 批量点击完成");
    }
};

/**
* 模块 3: 图像识别进阶
*/
var ImageModule = {
    /**
   * 任务 3.1: 基础找图
   */
    findImage: function(cvFile) {
      printl("\n【任务 3.1】基础找图:" + cvFile);
      try {
            var detects = opencv.findImagesEx(cvFile);
            
            if (detects && detects.length > 0) {
                printl("✓ 找到 " + detects.length + " 个目标");
                for (var i = 0; i < Math.min(3, detects.length); i++) {
                  printl("[" + (i+1) + "] x=" + detects.x + ", y=" + detects.y);
                }
                return detects;
            } else {
                printl("✗ 未找到目标");
                return [];
            }
      } catch (e) {
            printl("错误:" + e);
            return [];
      }
    },
   
    /**
   * 任务 3.2: 区域找图
   */
    findImageInRegion: function(cvFile, region) {
      printl("\n【任务 3.2】区域找图:" + cvFile);
      printl("识别区域:[" + region.join(", ") + "]");
      try {
            var detects = opencv.findImages(, 0.8, 3000, 1, region);
            
            if (detects && detects.length > 0) {
                printl("✓ 在区域内找到 " + detects.length + " 个目标");
                return detects;
            } else {
                printl("✗ 区域内未找到目标");
                return [];
            }
      } catch (e) {
            printl("错误:" + e);
            return [];
      }
    }
};

// ==================== 第三部分:综合实战案例 ====================

/**
* 实战案例 1: 智能应用启动器
*/
var AppLauncher = {
    /**
   * 启动单个应用
   */
    launchApp: function(appName) {
      printl("\n========================================");
      printl("&#128640; 启动应用:" + appName);
      printl("========================================");
      
      for (var retry = 0; retry < Config.retryTimes; retry++) {
            try {
                printl("第 " + (retry + 1) + " 次尝试...");
               
                // 1. OCR 识别
                var ocrResult = screen.ocr(0, 0, 1, 1);
               
                // 2. 查找应用名称
                var appDetect = ocrResult.findIncludeText(appName, Config.defaultRegion);
               
                if (appDetect && typeof appDetect === 'object' && appDetect.x) {
                  printl("✓ 找到应用图标");
                  
                  // 3. 点击应用
                  ClickModule.clickOcrTarget(appDetect, "center");
                  
                  printl("✓✓ 应用启动成功!");
                  return true;
                } else {
                  printl("✗ 未找到应用,准备重试...");
                  sleep(1000);
                }
            } catch (e) {
                printl("错误:" + e);
                sleep(1000);
            }
      }
      
      printl("✗✗ 应用启动失败(已重试 " + Config.retryTimes + " 次)");
      return false;
    },
   
    /**
   * 批量启动应用
   */
    launchMultipleApps: function(appList) {
      printl("\n========================================");
      printl("&#128230; 批量启动应用");
      printl("========================================");
      
      var successCount = 0;
      
      for (var i = 0; i < appList.length; i++) {
            printl("\n正在启动 (" + (i + 1) + "/" + appList.length + "): " + appList);
            
            if (this.launchApp(appList)) {
                successCount++;
                sleep(2000); // 应用切换等待
            }
            
            sleep(500);
      }
      
      printl("\n批量启动完成:成功 " + successCount + "/" + appList.length + " 个");
    }
};

/**
* 实战案例 2: 自动化导航系统
*/
var AutoNavigator = {
    /**
   * 执行多步导航
   */
    navigate: function(steps) {
      printl("\n========================================");
      printl("&#129517; 开始自动化导航");
      printl("========================================");
      
      for (var i = 0; i < steps.length; i++) {
            var step = steps;
            printl("\n步骤 " + (i + 1) + "/" + steps.length + ": " + step.action);
            
            try {
                if (step.action === "findAndClick") {
                  var ocrResult = screen.ocr(0, 0, 1, 1);
                  var target = ocrResult.findIncludeText(step.target, Config.defaultRegion);
                  
                  if (target && typeof target === 'object' && target.x) {
                        ClickModule.clickOcrTarget(target, step.clickType || "random");
                        printl("✓ 步骤完成");
                        sleep(step.delay || 1000);
                  } else {
                        printl("✗ 未找到目标,导航中断");
                        return false;
                  }
                } else if (step.action === "waitFor") {
                  printl("等待 " + step.duration + "ms...");
                  sleep(step.duration);
                } else if (step.action === "swipe") {
                  this.swipe(step.direction);
                  printl("✓ 滑动完成");
                }
            } catch (e) {
                printl("错误:" + e);
                return false;
            }
      }
      
      printl("\n✓✓ 导航完成!");
      return true;
    },
   
    /**
   * 滑动操作
   */
    swipe: function(direction) {
      try {
            if (direction === "up") {
                hid.swipePercent(0.5, 0.8, 0.5, 0.2);
            } else if (direction === "down") {
                hid.swipePercent(0.5, 0.2, 0.5, 0.8);
            } else if (direction === "left") {
                hid.swipePercent(0.8, 0.5, 0.2, 0.5);
            } else if (direction === "right") {
                hid.swipePercent(0.2, 0.5, 0.8, 0.5);
            }
            sleep(500);
      } catch (e) {
            printl("滑动错误:" + e);
      }
    }
};

/**
* 实战案例 3: 智能表单填写器
*/
var FormFiller = {
    /**
   * 自动填写表单
   */
    fillForm: function(formData) {
      printl("\n========================================");
      printl("&#128221; 开始填写表单");
      printl("========================================");
      
      for (var fieldName in formData) {
            var fieldValue = formData;
            printl("\n填写字段:" + fieldName);
            
            try {
                // 1. 查找字段标签
                var labelDetect = OCRModule.findText(fieldName, Config.defaultRegion);
                           
                if (labelDetect != null) {
                  // 2. 点击输入框(假设在标签下方)
                  var rect = labelDetect.getRect();
                  var inputX = rect.getCenterX();
                  var inputY = rect.getBottom() + 50;
                              
                  ClickModule.clickAbsolute(inputX, inputY);
                  sleep(300);
                              
                  // 3. 输入内容(需要使用输入模块)
                  printl("输入内容:" + fieldValue);
                  // 这里可以扩展输入功能
                              
                  sleep(500);
                } else {
                  printl("✗ 未找到字段标签:" + fieldName);
                }
            } catch (e) {
                printl("错误:" + e);
            }
      }
      
      printl("\n✓ 表单填写完成");
    }
};

// ==================== 第四部分:高级技巧与优化 ====================

/**
* 技巧 1: OCR 锁定优化
*/
function demoOcrLock() {
    printl("\n========================================");
    printl("⚡ 技巧演示:OCR 锁定优化");
    printl("========================================");
   
    try {
      // 锁定 OCR
      OCR.lockOCR();
      printl("✓ OCR 已锁定");
      
      // 截图
      var image = screen.screenShotFull();
      
      // 多次识别(使用同一张截图)
      printl("\n第一次识别...");
      var result1 = image.ocr(0, 0, 1, 1);
      var text1 = result1.getAllString();
      printl("识别到文本长度:" + text1.length);
      
      printl("\n第二次查找...");
      var target = result1.findIncludeText("设置", Config.defaultRegion);
      if (target != null) {
            printl("✓ 找到目标");
      }
      
      // 释放资源
      image.close();
      
      // 解锁 OCR
      OCR.unLock();
      printl("✓ OCR 已解锁");
      
    } catch (e) {
      printl("错误:" + e);
      try {
            OCR.unLock();
      } catch (unlockError) {
            // 忽略解锁错误
      }
    }
}

/**
* 技巧 2: 安全查找(带重试机制)
*/
function safeFindText(targetText, maxRetries) {
    printl("\n安全查找文本:" + targetText);
   
    for (var retry = 0; retry < maxRetries; retry++) {
      try {
            printl("第 " + (retry + 1) + " 次尝试...");
            var ocrResult = screen.ocr(0, 0, 1, 1);
            var detect = ocrResult.findIncludeText(targetText, Config.defaultRegion);
            
            if (detect != null) {
                printl("✓ 找到目标");
                return detect;
            }
            
            if (retry < maxRetries - 1) {
                printl("未找到,等待重试...");
                sleep(1000);
            }
      } catch (e) {
            printl("查找出错:" + e);
            if (retry < maxRetries - 1) {
                sleep(2000);
            }
      }
    }
   
    printl("✗ 未找到目标");
    return null;
}

/**
* 技巧 3: 等待目标出现
*/
function waitForTarget(targetText, maxWaitTime) {
    printl("\n等待目标出现:" + targetText);
    printl("最大等待时间:" + maxWaitTime + "ms");
   
    var startTime = Date.now();
   
    while (Date.now() - startTime < maxWaitTime) {
      try {
            var ocrResult = screen.ocr(0, 0, 1, 1);
            var target = ocrResult.findIncludeText(targetText, Config.defaultRegion);
            
            if (target != null) {
                printl("✓ 目标出现!");
                return target;
            }
            
            sleep(500);
      } catch (e) {
            printl("查找出错:" + e);
            sleep(500);
      }
    }
   
    printl("✗ 超时,目标未出现");
    return null;
}

// ==================== 第五部分:完整演示流程 ====================

/**
* 演示流程 1: 基础技能综合演练
*/
function runBasicDemo() {
    printl("\n");
    printl("╔════════════════════════════════════════╗");
    printl("║   基础技能综合演练                     ║");
    printl("╚════════════════════════════════════════╝");
   
    // 1. OCR 识别
    var allText = OCRModule.getAllText();
   
    // 2. 查找文本(示例:查找"设置")
    var settingBtn = OCRModule.findText("设置");
    if (settingBtn != null) {
      printl("✓ 找到设置按钮,准备点击");
      ClickModule.clickOcrTarget(settingBtn, "center");
    } else {
      printl("✗ 未找到设置按钮,跳过点击");
    }
   
    sleep(1000);
   
    // 3. 查找多个目标(示例:查找包含"屏"的文本)
    var screens = OCRModule.findIncludeTexts("屏");
    if (screens && screens.length > 0) {
      printl("找到 " + screens.length + " 个包含'屏'的文本,演示前 3 个");
      ClickModule.clickMultipleTargets(screens.slice(0, Math.min(3, screens.length)));
    }
   
    // 4. 正则查找(示例:查找数字)
    var numbers = OCRModule.findWithRegex("\\d+");
    if (numbers && numbers.length > 0) {
      printl("\n找到 " + numbers.length + " 个包含数字的目标");
      var rect = numbers.getRect();
      printl("第一个目标位置:(" + rect.getCenterX().toFixed(3) + ", " + rect.getCenterY().toFixed(3) + ")");
    }
}

/**
* 演示流程 2: 应用启动实战
*/
function runAppLauncherDemo() {
    printl("\n");
    printl("╔════════════════════════════════════════╗");
    printl("║   应用启动器实战                     ║");
    printl("╚════════════════════════════════════════╝");
   
    // 启动单个应用
    AppLauncher.launchApp("微信");
   
    sleep(2000);
   
    // 批量启动
    AppLauncher.launchMultipleApps(["QQ", "支付宝"]);
}

/**
* 演示流程 3: 自动化导航实战
*/
function runNavigatorDemo() {
    printl("\n");
    printl("╔════════════════════════════════════════╗");
    printl("║   自动化导航实战                     ║");
    printl("╚════════════════════════════════════════╝");
   
    // 定义导航步骤
    var steps = [
      { action: "findAndClick", target: "设置", clickType: "center", delay: 1500 },
      { action: "waitFor", duration: 1000 },
      { action: "findAndClick", target: "通用", clickType: "random", delay: 1500 },
      { action: "swipe", direction: "up" },
      { action: "waitFor", duration: 500 },
      { action: "findAndClick", target: "关于", clickType: "center" }
    ];
   
    AutoNavigator.navigate(steps);
}

/**
* 演示流程 4: 高级技巧演练
*/
function runAdvancedDemo() {
    printl("\n");
    printl("╔════════════════════════════════════════╗");
    printl("║   高级技巧演练                         ║");
    printl("╚════════════════════════════════════════╝");
   
    // 1. OCR 锁定
    demoOcrLock();
   
    // 2. 安全查找
    safeFindText("确定", 3);
   
    // 3. 等待目标
    waitForTarget("取消", 5000);
}

// ==================== 主程序入口 ====================

/**
* 运行所有演示
*/
function runAllDemos() {
    printl("\n");
    printl("╔═══════════════════════════════════════════╗");
    printl("║&#127822; AIWROK 屏幕自动化实战案例教学          ║");
    printl("║版本:" + Config.version + "                              ║");
    printl("║QQ 群:711841924 | 内测群:528816639      ║");
    printl("╚═══════════════════════════════════════════╝");
   
    sleep(1000);
   
    // 基础技能演示
    runBasicDemo();
   
    sleep(2000);
   
    // 应用启动器演示(注释掉,避免实际执行)
    // runAppLauncherDemo();
   
    sleep(2000);
   
    // 导航系统演示(注释掉,避免实际执行)
    // runNavigatorDemo();
   
    sleep(2000);
   
    // 高级技巧演示
    runAdvancedDemo();
   
    printl("\n");
    printl("╔═══════════════════════════════════════════╗");
    printl("║✓ 所有演示完成!                         ║");
    printl("║祝你学习愉快!                           ║");
    printl("╚═══════════════════════════════════════════╝");
}

/**
* 单独运行某个演示(取消注释即可)
*/
function main() {
    // 运行所有演示
    runAllDemos();
   
    // 或者单独运行某个演示:
    // runBasicDemo();
    // runAppLauncherDemo();
    // runNavigatorDemo();
    // runAdvancedDemo();
}

// 执行主程序
main();


页: [1]
查看完整版本: 苹果脚本屏幕事件EVENT示例