|
|
Æ»¹û½Å±¾ÖÇÄÜ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[key]);
- }
- }
- 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[key] = this.getConfig(key, this.defaultConfigs[key]);
- }
- 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: [left, top, right, bottom] });
- 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: [left, top, right, bottom] });
- 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[i];
- 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 || [0, 0, 1, 1]);
- 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 || [0, 0, 1, 1]);
- 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 || [0, 0, 1, 1]);
- 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 || [0, 0, 1, 1]);
- 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[key]);
- }
- printl("================\n");
- }
-
- findAndClick(text, options) {
- options = options || {};
- var region = options.region || [0, 0, 1, 1];
- 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] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
- this.ocrEngine.recognizeFullScreen();
- } else {
- this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
- }
-
- 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 || [0, 0, 1, 1];
- 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] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
- this.ocrEngine.recognizeFullScreen();
- } else {
- this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
- }
-
- var targets = [];
- if (exactMatch) {
- var allDetects = this.ocrEngine.getAllDetects();
- for (var i = 0; i < allDetects.length; i++) {
- var detect = allDetects[i];
- 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[i]);
- results.push({ success: result, target: targets[i] });
-
- if (i < targets.length - 1 && clickDelay > 0) {
- sleep(clickDelay);
- }
- }
-
- return results;
- }
-
- extractNumbers(options) {
- options = options || {};
- var region = options.region || [0, 0, 1, 1];
- var regex = options.regex || "\\d+";
-
- this.logger.info("¿ªÊ¼ÌáÈ¡Êý×Ö");
-
- // ÏÈÖ´ÐÐOCRʶ±ð
- this.logger.debug("Ö´ÐÐOCRʶ±ð", { region: region });
- if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
- this.ocrEngine.recognizeFullScreen();
- } else {
- this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
- }
-
- var targets = this.ocrEngine.findWithRegex(regex, region);
- var numbers = [];
-
- for (var i = 0; i < targets.length; i++) {
- var target = targets[i];
- 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[0],
- 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 || [0, 0, 1, 1];
-
- this.logger.info("¿ªÊ¼°´Ä£Ê½ÌáÈ¡Îı¾", { pattern: pattern });
-
- // ÏÈÖ´ÐÐOCRʶ±ð
- this.logger.debug("Ö´ÐÐOCRʶ±ð", { region: region });
- if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
- this.ocrEngine.recognizeFullScreen();
- } else {
- this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
- }
-
- var targets = this.ocrEngine.findWithRegex(pattern, region);
- var texts = [];
-
- for (var i = 0; i < targets.length; i++) {
- var target = targets[i];
- 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 || [0, 0, 1, 1];
- var exactMatch = options.exactMatch || false;
-
- this.logger.info("ÑéÖ¤Îı¾ÊÇ·ñ´æÔÚ", { text: text, exactMatch: exactMatch });
-
- // ÏÈÖ´ÐÐOCRʶ±ð
- this.logger.debug("Ö´ÐÐOCRʶ±ð", { region: region });
- if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
- this.ocrEngine.recognizeFullScreen();
- } else {
- this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
- }
-
- 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 || [0, 0, 1, 1];
-
- 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[0], region[1], region[2], region[3]);
- } 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[i];
- 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[i].number + " (ÍêÕûÎı¾: " + numbers[i].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[i];
- 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[0].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: [0, 0, 1, 0.3] },
- { name: "ÖмäÇøÓò", region: [0, 0.3, 1, 0.7] },
- { name: "µ×²¿ÇøÓò", region: [0, 0.7, 1, 1] }
- ];
-
- for (var i = 0; i < regions.length; i++) {
- var region = regions[i];
- 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[3-9]\\d{9}" },
- { name: "ÓÊÏä", pattern: "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}" },
- { name: "½ð¶î", pattern: "\\d+\\.\\d{2}" }
- ];
-
- for (var i = 0; i < patterns.length; i++) {
- var pattern = patterns[i];
- 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[j].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[i];
- 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[i];
- 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[i];
- 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("🍎 ¿ªÊ¼Ö´ÐÐ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🍎 ËùÓÐʾÀýÖ´ÐÐÍê±Ï");
- }
- main();
¸´ÖÆ´úÂë
|
|