YYPOST群发软件 发表于 3 天前

苹果脚本智能OCR自动化助手


苹果脚本智能OCR自动化助手




/*
🍎 AIWROK 智能OCR自动化助手系统 Pro
🍎 交流 QQ 群 711841924 群一,苹果内测群 528816639
🍎 功能:整合OCR识别、图像处理、配置管理、日志记录的完整自动化解决方案
*/

printl("========================================");
printl("🍎 AIWROK 智能OCR自动化助手系统 Pro");
printl("========================================\n");

// ==================== 工具函数 ====================
function printl(msg) {
    console.log(msg);
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

// ==================== 配置管理器 ====================
class OCRConfigManager {
    constructor() {
      this.configPrefix = "OCR_ASSISTANT_";
      this.defaultConfigs = {
            "ocr_language": "zh-CN",
            "ocr_confidence": "80",
            "ocr_timeout": "5000",
            "retry_times": "3",
            "enable_cache": "true",
            "enable_log": "true",
            "auto_save_images": "true",
            "image_save_path": "/ocr_images/",
            "click_delay": "500",
            "enable_smart_click": "true"
      };
      this.initConfig();
    }
   
    initConfig() {
      for (var key in this.defaultConfigs) {
            if (!this.hasConfig(key)) {
                this.setConfig(key, this.defaultConfigs);
            }
      }
      printl("✓ 配置管理器初始化完成");
    }
   
    setConfig(key, value) {
      config.setConfig(this.configPrefix + key, String(value));
    }
   
    getConfig(key, defaultValue) {
      return config.getConfig(this.configPrefix + key, defaultValue);
    }
   
    hasConfig(key) {
      var value = this.getConfig(key, null);
      return value !== null && value !== "";
    }
   
    getAllConfigs() {
      var result = {};
      for (var key in this.defaultConfigs) {
            result = this.getConfig(key, this.defaultConfigs);
      }
      return result;
    }
}

// ==================== 日志记录器 ====================
class OCRLogger {
    constructor(enableLog) {
      this.enableLog = enableLog;
      this.logs = [];
      this.maxLogs = 100;
    }
   
    log(level, message, data) {
      if (!this.enableLog) return;
      
      var timestamp = new Date().toISOString();
      var logEntry = {
            timestamp: timestamp,
            level: level,
            message: message,
            data: data || null
      };
      
      this.logs.push(logEntry);
      if (this.logs.length > this.maxLogs) {
            this.logs.shift();
      }
      
      var logMsg = "[" + timestamp + "] [" + level + "] " + message;
      if (data) {
            logMsg += " - " + JSON.stringify(data);
      }
      printl(logMsg);
    }
   
    info(message, data) {
      this.log("INFO", message, data);
    }
   
    warn(message, data) {
      this.log("WARN", message, data);
    }
   
    error(message, data) {
      this.log("ERROR", message, data);
    }
   
    debug(message, data) {
      this.log("DEBUG", message, data);
    }
   
    getLogs() {
      return this.logs;
    }
   
    exportLogs() {
      return JSON.stringify(this.logs, null, 2);
    }
}

// ==================== 图像处理器 ====================
class OCRImageProcessor {
    constructor(logger, configManager) {
      this.logger = logger;
      this.config = configManager;
      this.currentImage = null;
      this.currentMat = null;
    }
   
    captureFullScreenshot() {
      try {
            this.logger.info("开始全屏截图");
            this.currentImage = screen.screenShotFull();
            this.logger.debug("全屏截图完成");
            return this.currentImage;
      } catch (e) {
            this.logger.error("全屏截图失败", e.message);
            return null;
      }
    }
   
    captureRegionScreenshot(left, top, right, bottom) {
      try {
            this.logger.info("开始区域截图", { region: });
            var width = Math.floor((right - left) * screen.getScreenWidth());
            var height = Math.floor((bottom - top) * screen.getScreenHeight());
            var x = Math.floor(left * screen.getScreenWidth());
            var y = Math.floor(top * screen.getScreenHeight());
            
            this.currentImage = screen.screenShot(x, y, Math.min(width, height));
            this.logger.debug("区域截图完成");
            return this.currentImage;
      } catch (e) {
            this.logger.error("区域截图失败", e.message);
            return null;
      }
    }
   
    loadImageFromFile(filePath) {
      try {
            this.logger.info("从文件加载图像", { path: filePath });
            this.currentImage = new Image();
            this.currentImage.readFile(filePath);
            this.logger.debug("图像加载完成");
            return this.currentImage;
      } catch (e) {
            this.logger.error("图像加载失败", e.message);
            return null;
      }
    }
   
    loadImageFromBase64(base64String) {
      try {
            this.logger.info("从Base64加载图像", { length: base64String.length });
            this.currentImage = new Image();
            this.currentImage.readBase64(base64String);
            this.logger.debug("图像加载完成");
            return this.currentImage;
      } catch (e) {
            this.logger.error("Base64图像加载失败", e.message);
            return null;
      }
    }
   
    getMat() {
      try {
            if (!this.currentImage) {
                this.logger.warn("当前没有图像,无法获取Mat");
                return null;
            }
            this.currentMat = this.currentImage.getMat();
            this.logger.debug("Mat对象获取成功");
            return this.currentMat;
      } catch (e) {
            this.logger.error("获取Mat失败", e.message);
            return null;
      }
    }
   
    processImageWithOpenCV() {
      try {
            if (!this.currentMat) {
                this.currentMat = this.getMat();
            }
            
            if (!this.currentMat) {
                this.logger.warn("无法进行图像处理,Mat对象为空");
                return false;
            }
            
            this.logger.info("开始OpenCV图像处理");
            
            opencv.toGray(this.currentMat);
            this.logger.debug("灰度化完成");
            
            opencv.threshold(this.currentMat, 100, 255);
            this.logger.debug("二值化完成");
            
            this.logger.info("图像处理完成");
            return true;
      } catch (e) {
            this.logger.error("图像处理失败", e.message);
            return false;
      }
    }
   
    getBase64() {
      try {
            if (!this.currentImage) {
                this.logger.warn("当前没有图像,无法获取Base64");
                return null;
            }
            var base64 = this.currentImage.base64();
            this.logger.debug("Base64获取成功", { length: base64.length });
            return base64;
      } catch (e) {
            this.logger.error("获取Base64失败", e.message);
            return null;
      }
    }
   
    saveImage(filePath) {
      try {
            if (!this.currentImage) {
                this.logger.warn("当前没有图像,无法保存");
                return false;
            }
            this.logger.info("保存图像", { path: filePath });
            return true;
      } catch (e) {
            this.logger.error("保存图像失败", e.message);
            return false;
      }
    }
   
    close() {
      try {
            if (this.currentImage) {
                this.currentImage.close();
                this.currentImage = null;
            }
            if (this.currentMat) {
                this.currentMat.close();
                this.currentMat = null;
            }
            this.logger.debug("图像资源已释放");
      } catch (e) {
            this.logger.error("释放图像资源失败", e.message);
      }
    }
}

// ==================== OCR识别引擎 ====================
class OCREngine {
    constructor(logger, configManager) {
      this.logger = logger;
      this.config = configManager;
      this.currentResult = null;
      this.isLocked = false;
    }
   
    recognizeFullScreen() {
      try {
            this.logger.info("开始全屏OCR识别");
            this.currentResult = screen.ocr(0, 0, 1, 1);
            this.logger.debug("全屏OCR识别完成");
            return this.currentResult;
      } catch (e) {
            this.logger.error("全屏OCR识别失败", e.message);
            return null;
      }
    }
   
    recognizeRegion(left, top, right, bottom) {
      try {
            this.logger.info("开始区域OCR识别", { region: });
            this.currentResult = screen.ocr(left, top, right, bottom);
            this.logger.debug("区域OCR识别完成");
            return this.currentResult;
      } catch (e) {
            this.logger.error("区域OCR识别失败", e.message);
            return null;
      }
    }
   
    recognizeImage(image) {
      try {
            this.logger.info("开始图像OCR识别");
            this.currentResult = image.ocr(0, 0, 1, 1);
            this.logger.debug("图像OCR识别完成");
            return this.currentResult;
      } catch (e) {
            this.logger.error("图像OCR识别失败", e.message);
            return null;
      }
    }
   
    recognizeWithOpenCV(templatePath) {
      try {
            this.logger.info("开始OpenCV OCR识别", { template: templatePath });
            this.currentResult = opencv.OCREx(templatePath);
            if (this.currentResult) {
                this.logger.debug("OpenCV OCR识别完成");
            } else {
                this.logger.warn("OpenCV OCR识别返回空结果");
            }
            return this.currentResult;
      } catch (e) {
            this.logger.error("OpenCV OCR识别失败", e.message);
            return null;
      }
    }
   
    getAllText() {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return "";
            }
            var text = this.currentResult.getAllString();
            this.logger.debug("获取所有文本", { length: text.length });
            return text;
      } catch (e) {
            this.logger.error("获取所有文本失败", e.message);
            return "";
      }
    }
   
    getAllDetects() {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return [];
            }
            var detects = this.currentResult.getAllDetect();
            // 处理detects中的text可能是函数的情况
            for (var i = 0; i < detects.length; i++) {
                var detect = detects;
                if (detect) {
                  // 尝试多种方式获取文本
                  var detectText = null;
                  try {
                        if (typeof detect.text === "function") {
                            // 避免直接调用可能的 native 方法
                            detectText = String(detect.text);
                        } else if (detect.text) {
                            detectText = String(detect.text);
                        } else if (detect.getText) {
                            detectText = String(detect.getText());
                        }
                  } catch (e) {
                        this.logger.warn("获取文本失败", e.message);
                  }
                  if (detectText) {
                        detect.text = detectText;
                  }
                }
            }
            this.logger.debug("获取所有检测对象", { count: detects.length });
            return detects;
      } catch (e) {
            this.logger.error("获取所有检测对象失败", e.message);
            return [];
      }
    }
   
    findText(text, region) {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return null;
            }
            var target = this.currentResult.findText(text, region || );
            if (target) {
                this.logger.info("找到精确文本", { text: text });
                // 确保目标对象有正确的格式
                if (typeof target === 'object' && target !== null) {
                  // 确保 target 有必要的属性
                  if (target.x === undefined) target.x = 0;
                  if (target.y === undefined) target.y = 0;
                  if (target.width === undefined) target.width = 0;
                  if (target.height === undefined) target.height = 0;
                  // 添加 clickRandom 方法作为后备
                  if (typeof target.clickRandom !== 'function') {
                        target.clickRandom = function() {
                            var centerX = this.x + (this.width || 0) / 2;
                            var centerY = this.y + (this.height || 0) / 2;
                            hid.mouseMove(centerX * 100, centerY * 100);
                            sleep(100);
                            hid.clickPercent(centerX, centerY);
                        };
                  }
                }
            } else {
                this.logger.debug("未找到精确文本", { text: text });
            }
            return target;
      } catch (e) {
            this.logger.error("查找精确文本失败", e.message);
            return null;
      }
    }
   
    findIncludeText(text, region) {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return null;
            }
            var target = this.currentResult.findIncludeText(text, region || );
            if (target) {
                this.logger.info("找到包含文本", { text: text });
                // 确保目标对象有正确的格式
                if (typeof target === 'object' && target !== null) {
                  // 确保 target 有必要的属性
                  if (target.x === undefined) target.x = 0;
                  if (target.y === undefined) target.y = 0;
                  if (target.width === undefined) target.width = 0;
                  if (target.height === undefined) target.height = 0;
                  // 添加 clickRandom 方法作为后备
                  if (typeof target.clickRandom !== 'function') {
                        target.clickRandom = function() {
                            var centerX = this.x + (this.width || 0) / 2;
                            var centerY = this.y + (this.height || 0) / 2;
                            hid.mouseMove(centerX * 100, centerY * 100);
                            sleep(100);
                            hid.clickPercent(centerX, centerY);
                        };
                  }
                }
            } else {
                this.logger.debug("未找到包含文本", { text: text });
            }
            return target;
      } catch (e) {
            this.logger.error("查找包含文本失败", e.message);
            return null;
      }
    }
   
    findIncludeTexts(text, region) {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return [];
            }
            var targets = this.currentResult.findIncludeTexts(text, region || );
            this.logger.debug("查找包含文本结果", { text: text, count: targets.length });
            return targets;
      } catch (e) {
            this.logger.error("查找包含文本失败", e.message);
            return [];
      }
    }
   
    findWithRegex(regex, region) {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return [];
            }
            var targets = this.currentResult.findTextWithRegex(regex, region || );
            this.logger.debug("正则表达式查找结果", { regex: regex, count: targets.length });
            return targets;
      } catch (e) {
            this.logger.error("正则表达式查找失败", e.message);
            return [];
      }
    }
   
    getJSON() {
      try {
            if (!this.currentResult) {
                this.logger.warn("当前没有OCR结果");
                return "{}";
            }
            var json = this.currentResult.getJSON();
            this.logger.debug("获取JSON结果", { length: json.length });
            return json;
      } catch (e) {
            this.logger.error("获取JSON结果失败", e.message);
            return "{}";
      }
    }
   
    lock() {
      try {
            if (!this.isLocked) {
                OCR.lockOCR();
                this.isLocked = true;
                this.logger.info("OCR结果已锁定");
            }
      } catch (e) {
            this.logger.error("锁定OCR失败", e.message);
      }
    }
   
    unlock() {
      try {
            if (this.isLocked) {
                OCR.unLock();
                this.isLocked = false;
                this.logger.info("OCR结果已解锁");
            }
      } catch (e) {
            this.logger.error("解锁OCR失败", e.message);
      }
    }
}

// ==================== 智能点击器 ====================
class SmartClicker {
    constructor(logger, configManager) {
      this.logger = logger;
      this.config = configManager;
    }
   
    clickTarget(target) {
      try {
            if (!target) {
                this.logger.warn("点击目标为空");
                return false;
            }
            
            var enableSmartClick = this.config.getConfig("enable_smart_click", "true") === "true";
            var clickDelay = parseInt(this.config.getConfig("click_delay", "500"));
            
            if (enableSmartClick && typeof target.clickRandom === 'function') {
                this.logger.info("使用智能随机点击");
                target.clickRandom();
            } else if (target.x !== undefined && target.y !== undefined) {
                var centerX = target.x + (target.width || 0) / 2;
                var centerY = target.y + (target.height || 0) / 2;
                this.logger.info("使用坐标点击", { x: centerX, y: centerY });
               
                // 添加鼠标移动效果
                this.logger.debug("移动鼠标到目标位置");
                hid.mouseMove(centerX * 100, centerY * 100);
               
                // 短暂延迟,模拟真实鼠标移动
                sleep(100);
               
                hid.clickPercent(centerX, centerY);
            } else {
                this.logger.warn("无法点击,没有可用的点击方法或坐标");
                return false;
            }
            
            if (clickDelay > 0) {
                sleep(clickDelay);
            }
            
            this.logger.info("点击执行成功");
            return true;
      } catch (e) {
            this.logger.error("点击执行失败", e.message);
            return false;
      }
    }
   
    clickCoordinates(x, y) {
      try {
            this.logger.info("点击坐标", { x: x, y: y });
            
            // 添加鼠标移动效果
            this.logger.debug("移动鼠标到目标位置");
            hid.mouseMove(x * 100, y * 100);
            
            // 短暂延迟,模拟真实鼠标移动
            sleep(100);
            
            hid.clickPercent(x, y);
            var clickDelay = parseInt(this.config.getConfig("click_delay", "500"));
            if (clickDelay > 0) {
                sleep(clickDelay);
            }
            this.logger.info("坐标点击成功");
            return true;
      } catch (e) {
            this.logger.error("坐标点击失败", e.message);
            return false;
      }
    }
}

// ==================== OCR自动化助手主类 ====================
class OCRAutomationAssistant {
    constructor() {
      this.configManager = new OCRConfigManager();
      var enableLog = this.configManager.getConfig("enable_log", "true") === "true";
      this.logger = new OCRLogger(enableLog);
      this.imageProcessor = new OCRImageProcessor(this.logger, this.configManager);
      this.ocrEngine = new OCREngine(this.logger, this.configManager);
      this.smartClicker = new SmartClicker(this.logger, this.configManager);
      
      this.logger.info("OCR自动化助手初始化完成");
      this.displayConfig();
    }
   
    displayConfig() {
      printl("\n=== 当前配置 ===");
      var configs = this.configManager.getAllConfigs();
      for (var key in configs) {
            printl("" + key + ": " + configs);
      }
      printl("================\n");
    }
   
    findAndClick(text, options) {
      options = options || {};
      var region = options.region || ;
      var exactMatch = options.exactMatch || false;
      var retryTimes = options.retryTimes || parseInt(this.configManager.getConfig("retry_times", "3"));
      
      this.logger.info("开始查找并点击文本", { text: text, exactMatch: exactMatch });
      
      for (var i = 0; i < retryTimes; i++) {
            try {
                // 先执行OCR识别
                this.logger.debug("执行OCR识别", { region: region });
                if (region === 0 && region === 0 && region === 1 && region === 1) {
                  this.ocrEngine.recognizeFullScreen();
                } else {
                  this.ocrEngine.recognizeRegion(region, region, region, region);
                }
               
                var target = null;
                if (exactMatch) {
                  target = this.ocrEngine.findText(text, region);
                } else {
                  target = this.ocrEngine.findIncludeText(text, region);
                }
               
                if (target) {
                  this.logger.info("找到目标文本,准备点击", { text: text, attempt: i + 1 });
                  if (this.smartClicker.clickTarget(target)) {
                        return { success: true, target: target };
                  }
                } else {
                  this.logger.debug("未找到目标文本", { text: text, attempt: i + 1 });
                }
               
                if (i < retryTimes - 1) {
                  sleep(1000);
                }
            } catch (e) {
                this.logger.error("查找点击过程出错", e.message);
            }
      }
      
      this.logger.warn("未找到目标文本或点击失败", { text: text });
      return { success: false, target: null };
    }
   
    findAndClickAll(text, options) {
      options = options || {};
      var region = options.region || ;
      var exactMatch = options.exactMatch || false;
      var clickDelay = options.clickDelay || 500;
      
      this.logger.info("开始查找并点击所有匹配文本", { text: text });
      
      // 先执行OCR识别
      this.logger.debug("执行OCR识别", { region: region });
      if (region === 0 && region === 0 && region === 1 && region === 1) {
            this.ocrEngine.recognizeFullScreen();
      } else {
            this.ocrEngine.recognizeRegion(region, region, region, region);
      }
      
      var targets = [];
      if (exactMatch) {
            var allDetects = this.ocrEngine.getAllDetects();
            for (var i = 0; i < allDetects.length; i++) {
                var detect = allDetects;
                if (!detect) continue;
               
                // 尝试多种方式获取文本
                var detectText = null;
                try {
                  if (typeof detect.text === "function") {
                        // 避免直接调用可能的 native 方法
                        detectText = String(detect.text);
                  } else if (detect.text) {
                        detectText = String(detect.text);
                  } else if (detect.getText) {
                        detectText = String(detect.getText());
                  } else {
                        continue;
                  }
                } catch (e) {
                  this.logger.warn("获取文本失败", e.message);
                  continue;
                }
               
                if (detectText === text) {
                  targets.push(detect);
                }
            }
      } else {
            targets = this.ocrEngine.findIncludeTexts(text, region);
      }
      
      this.logger.info("找到匹配目标", { count: targets.length });
      
      var results = [];
      for (var i = 0; i < targets.length; i++) {
            this.logger.info("点击第 " + (i + 1) + " 个目标");
            var result = this.smartClicker.clickTarget(targets);
            results.push({ success: result, target: targets });
            
            if (i < targets.length - 1 && clickDelay > 0) {
                sleep(clickDelay);
            }
      }
      
      return results;
    }
   
    extractNumbers(options) {
      options = options || {};
      var region = options.region || ;
      var regex = options.regex || "\\d+";
      
      this.logger.info("开始提取数字");
      
      // 先执行OCR识别
      this.logger.debug("执行OCR识别", { region: region });
      if (region === 0 && region === 0 && region === 1 && region === 1) {
            this.ocrEngine.recognizeFullScreen();
      } else {
            this.ocrEngine.recognizeRegion(region, region, region, region);
      }
      
      var targets = this.ocrEngine.findWithRegex(regex, region);
      var numbers = [];
      
      for (var i = 0; i < targets.length; i++) {
            var target = targets;
            if (!target) continue;
            
            // 尝试多种方式获取文本
            var targetText = null;
            try {
                if (typeof target.text === "function") {
                  // 避免直接调用可能的 native 方法
                  targetText = String(target.text);
                } else if (target.text) {
                  targetText = String(target.text);
                } else if (target.getText) {
                  targetText = String(target.getText());
                } else {
                  continue;
                }
            } catch (e) {
                this.logger.warn("获取文本失败", e.message);
                continue;
            }
            
            if (!targetText) continue;
            
            var numStr = targetText.match(regex);
            if (numStr) {
                numbers.push({
                  text: targetText,
                  number: numStr,
                  position: {
                        x: target.x || 0,
                        y: target.y || 0,
                        width: target.width || 0,
                        height: target.height || 0
                  }
                });
            }
      }
      
      this.logger.info("数字提取完成", { count: numbers.length });
      return numbers;
    }
   
    extractTextWithPattern(pattern, options) {
      options = options || {};
      var region = options.region || ;
      
      this.logger.info("开始按模式提取文本", { pattern: pattern });
      
      // 先执行OCR识别
      this.logger.debug("执行OCR识别", { region: region });
      if (region === 0 && region === 0 && region === 1 && region === 1) {
            this.ocrEngine.recognizeFullScreen();
      } else {
            this.ocrEngine.recognizeRegion(region, region, region, region);
      }
      
      var targets = this.ocrEngine.findWithRegex(pattern, region);
      var texts = [];
      
      for (var i = 0; i < targets.length; i++) {
            var target = targets;
            if (!target) continue;
            
            // 尝试多种方式获取文本
            var targetText = null;
            try {
                if (typeof target.text === "function") {
                  // 避免直接调用可能的 native 方法
                  targetText = String(target.text);
                } else if (target.text) {
                  targetText = String(target.text);
                } else if (target.getText) {
                  targetText = String(target.getText());
                } else {
                  continue;
                }
            } catch (e) {
                this.logger.warn("获取文本失败", e.message);
                continue;
            }
            
            if (!targetText) continue;
            
            texts.push({
                text: targetText,
                position: {
                  x: target.x || 0,
                  y: target.y || 0,
                  width: target.width || 0,
                  height: target.height || 0
                }
            });
      }
      
      this.logger.info("文本提取完成", { count: texts.length });
      return texts;
    }
   
    verifyTextExists(text, options) {
      options = options || {};
      var region = options.region || ;
      var exactMatch = options.exactMatch || false;
      
      this.logger.info("验证文本是否存在", { text: text, exactMatch: exactMatch });
      
      // 先执行OCR识别
      this.logger.debug("执行OCR识别", { region: region });
      if (region === 0 && region === 0 && region === 1 && region === 1) {
            this.ocrEngine.recognizeFullScreen();
      } else {
            this.ocrEngine.recognizeRegion(region, region, region, region);
      }
      
      var target = null;
      if (exactMatch) {
            target = this.ocrEngine.findText(text, region);
      } else {
            target = this.ocrEngine.findIncludeText(text, region);
      }
      
      var exists = target !== null;
      this.logger.info("文本验证结果", { text: text, exists: exists });
      return exists;
    }
   
    waitForText(text, options) {
      options = options || {};
      var timeout = options.timeout || 10000;
      var interval = options.interval || 1000;
      var exactMatch = options.exactMatch || false;
      var region = options.region || ;
      
      this.logger.info("等待文本出现", { text: text, timeout: timeout });
      
      var startTime = Date.now();
      while (Date.now() - startTime < timeout) {
            var exists = this.verifyTextExists(text, { exactMatch: exactMatch, region: region });
            if (exists) {
                this.logger.info("文本已出现", { text: text });
                return true;
            }
            sleep(interval);
      }
      
      this.logger.warn("等待文本超时", { text: text });
      return false;
    }
   
    captureAndRecognize(options) {
      options = options || {};
      var region = options.region || null;
      var processImage = options.processImage || false;
      
      this.logger.info("开始截图并识别");
      
      if (region) {
            this.imageProcessor.captureRegionScreenshot(region, region, region, region);
      } else {
            this.imageProcessor.captureFullScreenshot();
      }
      
      if (processImage) {
            this.imageProcessor.processImageWithOpenCV();
      }
      
      var image = this.imageProcessor.currentImage;
      if (!image) {
            this.logger.error("截图失败");
            return null;
      }
      
      var result = this.ocrEngine.recognizeImage(image);
      if (!result) {
            this.logger.error("OCR识别失败");
            return null;
      }
      
      var allText = this.ocrEngine.getAllText();
      var allDetects = this.ocrEngine.getAllDetects();
      
      // 确保detects中的text字段已正确处理
      for (var i = 0; i < allDetects.length; i++) {
            var detect = allDetects;
            if (detect && typeof detect.text === "function") {
                detect.text = detect.text();
            } else if (detect && detect.text) {
                detect.text = String(detect.text);
            }
      }
      
      this.logger.info("截图识别完成", { textLength: allText.length, detectCount: allDetects.length });
      
      return {
            text: allText,
            detects: allDetects,
            image: image,
            base64: this.imageProcessor.getBase64()
      };
    }
   
    copyTextToClipboard(text) {
      try {
            this.logger.info("复制文本到剪贴板", { length: text.length });
            clipboard.copyToClipboard(text);
            this.logger.info("文本复制成功");
            return true;
      } catch (e) {
            this.logger.error("复制文本失败", e.message);
            return false;
      }
    }
   
    readTextFromClipboard() {
      try {
            this.logger.info("从剪贴板读取文本");
            var text = clipboard.readFromClipboard();
            this.logger.info("文本读取成功", { length: text ? text.length : 0 });
            return text;
      } catch (e) {
            this.logger.error("读取文本失败", e.message);
            return null;
      }
    }
   
    getLogs() {
      return this.logger.getLogs();
    }
   
    exportLogs() {
      return this.logger.exportLogs();
    }
   
    cleanup() {
      try {
            this.logger.info("开始清理资源");
            this.imageProcessor.close();
            this.ocrEngine.unlock();
            this.logger.info("资源清理完成");
      } catch (e) {
            this.logger.error("资源清理失败", e.message);
      }
    }
}

// ==================== 使用示例 ====================
function example1_basicUsage() {
    printl("\n【示例1】基础使用 - 查找并点击文本");
   
    var assistant = new OCRAutomationAssistant();
   
    var result = assistant.findAndClick("设置");
    if (result.success) {
      printl("✓ 成功找到并点击 '设置'");
    } else {
      printl("✗ 未找到 '设置'");
    }
   
    assistant.cleanup();
}

function example2_advancedSearch() {
    printl("\n【示例2】高级搜索 - 提取屏幕上的所有数字");
   
    var assistant = new OCRAutomationAssistant();
   
    var numbers = assistant.extractNumbers();
    printl("找到 " + numbers.length + " 个数字:");
    for (var i = 0; i < Math.min(5, numbers.length); i++) {
      printl("数字" + (i + 1) + ": " + numbers.number + " (完整文本: " + numbers.text + ")");
    }
   
    assistant.cleanup();
}

function example3_automationFlow() {
    printl("\n【示例3】自动化流程 - 模拟登录流程");
   
    var assistant = new OCRAutomationAssistant();
   
    var steps = [
      { text: "登录", action: "click" },
      { text: "用户名", action: "click" },
      { text: "密码", action: "click" },
      { text: "确定", action: "click" }
    ];
   
    for (var i = 0; i < steps.length; i++) {
      var step = steps;
      printl("步骤 " + (i + 1) + ": " + step.text);
      
      var result = assistant.findAndClick(step.text);
      if (result.success) {
            printl("✓ 成功");
            sleep(1000);
      } else {
            printl("✗ 失败");
            break;
      }
    }
   
    assistant.cleanup();
}

function example4_imageProcessing() {
    printl("\n【示例4】图像处理 - 截图、处理、识别");
   
    var assistant = new OCRAutomationAssistant();
   
    var result = assistant.captureAndRecognize({ processImage: true });
    if (result) {
      printl("✓ 截图识别成功");
      printl("识别文本长度: " + result.text.length);
      printl("识别目标数量: " + result.detects.length);
      printl("Base64编码长度: " + (result.base64 ? result.base64.length : 0));
      
      if (result.detects.length > 0) {
            printl("第一个识别目标: " + result.detects.text);
      }
    } else {
      printl("✗ 截图识别失败");
    }
   
    assistant.cleanup();
}

function example5_clipboardIntegration() {
    printl("\n【示例5】剪贴板集成 - 识别文本并复制到剪贴板");
   
    var assistant = new OCRAutomationAssistant();
   
    var result = assistant.captureAndRecognize();
    if (result && result.text.length > 0) {
      printl("✓ 识别到文本: " + result.text.substring(0, 50) + "...");
      
      if (assistant.copyTextToClipboard(result.text)) {
            printl("✓ 文本已复制到剪贴板");
            
            var clipboardText = assistant.readTextFromClipboard();
            if (clipboardText === result.text) {
                printl("✓ 剪贴板验证成功");
            } else {
                printl("✗ 剪贴板验证失败");
            }
      }
    } else {
      printl("✗ 识别失败或无文本");
    }
   
    assistant.cleanup();
}

function example6_multiRegionSearch() {
    printl("\n【示例6】多区域搜索 - 在不同区域查找文本");
   
    var assistant = new OCRAutomationAssistant();
   
    var regions = [
      { name: "顶部区域", region: },
      { name: "中间区域", region: },
      { name: "底部区域", region: }
    ];
   
    for (var i = 0; i < regions.length; i++) {
      var region = regions;
      printl("在 " + region.name + " 查找文本...");
      
      var result = assistant.findAndClick("确定", { region: region.region });
      if (result.success) {
            printl("✓ 在 " + region.name + " 找到并点击");
            break;
      } else {
            printl("✗ 在 " + region.name + " 未找到");
      }
    }
   
    assistant.cleanup();
}

function example7_patternExtraction() {
    printl("\n【示例7】模式提取 - 提取特定格式的文本");
   
    var assistant = new OCRAutomationAssistant();
   
    var patterns = [
      { name: "手机号", pattern: "1\\d{9}" },
      { name: "邮箱", pattern: "+@+\\.{2,}" },
      { name: "金额", pattern: "\\d+\\.\\d{2}" }
    ];
   
    for (var i = 0; i < patterns.length; i++) {
      var pattern = patterns;
      printl("提取 " + pattern.name + "...");
      
      var texts = assistant.extractTextWithPattern(pattern.pattern);
      printl("找到 " + texts.length + " 个" + pattern.name);
      
      for (var j = 0; j < Math.min(3, texts.length); j++) {
            printl("    " + (j + 1) + ": " + texts.text);
      }
    }
   
    assistant.cleanup();
}

function example8_waitForText() {
    printl("\n【示例8】等待文本 - 等待特定文本出现");
   
    var assistant = new OCRAutomationAssistant();
   
    printl("等待 '加载完成' 文本出现(最多10秒)...");
    var found = assistant.waitForText("加载完成", { timeout: 10000 });
   
    if (found) {
      printl("✓ 文本已出现");
    } else {
      printl("✗ 等待超时");
    }
   
    assistant.cleanup();
}

function example9_logExport() {
    printl("\n【示例9】日志导出 - 导出操作日志");
   
    var assistant = new OCRAutomationAssistant();
   
    assistant.findAndClick("设置");
    assistant.extractNumbers();
   
    printl("\n=== 操作日志 ===");
    var logs = assistant.getLogs();
    for (var i = 0; i < Math.min(5, logs.length); i++) {
      var log = logs;
      printl("[" + log.level + "] " + log.message);
    }
   
    printl("\n=== 导出JSON日志 ===");
    var jsonLogs = assistant.exportLogs();
    printl(jsonLogs.substring(0, 200) + "...");
   
    assistant.cleanup();
}

function example10_comprehensiveDemo() {
    printl("\n【示例10】综合演示 - 完整的自动化任务");
   
    var assistant = new OCRAutomationAssistant();
   
    printl("步骤1: 截图并识别");
    var result = assistant.captureAndRecognize();
    if (!result) {
      printl("✗ 截图识别失败");
      assistant.cleanup();
      return;
    }
    printl("✓ 识别到 " + result.detects.length + " 个文本元素");
   
    printl("\n步骤2: 查找并点击 '开始'");
    var startResult = assistant.findAndClick("开始");
    if (startResult.success) {
      printl("✓ 点击成功");
    } else {
      printl("✗ 未找到 '开始'");
    }
   
    printl("\n步骤3: 等待 '加载完成'");
    var loaded = assistant.waitForText("加载完成", { timeout: 5000 });
    if (loaded) {
      printl("✓ 加载完成");
    } else {
      printl("✗ 加载超时");
    }
   
    printl("\n步骤4: 提取所有数字");
    var numbers = assistant.extractNumbers();
    printl("✓ 提取到 " + numbers.length + " 个数字");
   
    printl("\n步骤5: 复制识别结果到剪贴板");
    if (result.text) {
      assistant.copyTextToClipboard(result.text);
      printl("✓ 已复制到剪贴板");
    }
   
    printl("\n步骤6: 导出操作日志");
    var jsonLogs = assistant.exportLogs();
    printl("✓ 日志已导出,长度: " + jsonLogs.length);
   
    assistant.cleanup();
    printl("\n✓ 综合演示完成");
}

function example11_buttonDemo() {
    printl("\n【示例11】按钮演示 - 轮流点击三个按钮");
   
    var assistant = new OCRAutomationAssistant();
   
    var buttons = ["投屏", "快捷指令", "激活模式"];
   
    for (var i = 0; i < buttons.length; i++) {
      var button = buttons;
      printl("点击按钮: " + button);
      
      var result = assistant.findAndClick(button);
      if (result && result.success) {
            printl("✓ 成功点击 '" + button + "'");
      } else {
            printl("✗ 未能找到或点击 '" + button + "'");
      }
      
      // 等待2秒,让界面有时间响应
      sleep(2000);
    }
   
    assistant.cleanup();
    printl("\n✓ 按钮演示完成");
}

function example12_configCenterDemo() {
    printl("\n【示例12】配置中心演示 - 点击配置管理中心页面元素");
   
    var assistant = new OCRAutomationAssistant();
   
    var elements = [
      "全部",
      "游戏配置",
      "OCR配置",
      "重置",
      "保存"
    ];
   
    for (var i = 0; i < elements.length; i++) {
      var element = elements;
      printl("点击元素: " + element);
      
      var result = assistant.findAndClick(element);
      if (result && result.success) {
            printl("✓ 成功点击 '" + element + "'");
      } else {
            printl("✗ 未能找到或点击 '" + element + "'");
      }
      
      // 等待1秒,让界面有时间响应
      sleep(1000);
    }
   
    assistant.cleanup();
    printl("\n✓ 配置中心演示完成");
}

// ==================== 主函数 ====================
function main() {
    printl("&#127822; 开始执行OCR自动化助手示例\n");
   
    example1_basicUsage();
    example2_advancedSearch();
    example3_automationFlow();
    example4_imageProcessing();
    example5_clipboardIntegration();
    example6_multiRegionSearch();
    example7_patternExtraction();
    example8_waitForText();
    example9_logExport();
    example10_comprehensiveDemo();
    example11_buttonDemo();
    example12_configCenterDemo();
   
    printl("\n&#127822; 所有示例执行完毕");
}

main();



页: [1]
查看完整版本: 苹果脚本智能OCR自动化助手