 | |  |  | 苹果脚本屏幕事件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: [0, 0, 1, 1], // 默认全屏
- 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[i].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[i].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[i].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[i].x + ", y=" + detects[i].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([cvFile], 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("🚀 启动应用:" + 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("📦 批量启动应用");
- printl("========================================");
-
- var successCount = 0;
-
- for (var i = 0; i < appList.length; i++) {
- printl("\n正在启动 (" + (i + 1) + "/" + appList.length + "): " + appList[i]);
-
- if (this.launchApp(appList[i])) {
- successCount++;
- sleep(2000); // 应用切换等待
- }
-
- sleep(500);
- }
-
- printl("\n批量启动完成:成功 " + successCount + "/" + appList.length + " 个");
- }
- };
- /**
- * 实战案例 2: 自动化导航系统
- */
- var AutoNavigator = {
- /**
- * 执行多步导航
- */
- navigate: function(steps) {
- printl("\n========================================");
- printl("🧭 开始自动化导航");
- printl("========================================");
-
- for (var i = 0; i < steps.length; i++) {
- var step = steps[i];
- 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("📝 开始填写表单");
- printl("========================================");
-
- for (var fieldName in formData) {
- var fieldValue = formData[fieldName];
- 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[0].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("║ 🍎 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();
复制代码
| |  | |  |
|