信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1|回复: 0
打印 上一主题 下一主题

[宣传软件网站动态] 苹果智能OCR自动化助手

[复制链接]

1894

主题

1904

帖子

1万

积分

积分
11084

资讯缩略图:

资讯发布日期:2026-03-31

资讯发布简介:苹果智能OCR自动化助手

资讯关键词:苹果智能OCR自动化助手

资讯所属分类:IT资讯 

联系:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件网站分类目录 网址:http://www.postbbs.com/

资讯详细描述
苹果智能OCR自动化助手
苹果智能OCR自动化助手 b2b软件

苹果智能OCR自动化助手 b2b软件


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

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

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

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

  16. // ==================== 配置管理器 ====================
  17. class OCRConfigManager {
  18.     constructor() {
  19.         this.configPrefix = "OCR_ASSISTANT_";
  20.         this.defaultConfigs = {
  21.             "ocr_language": "zh-CN",
  22.             "ocr_confidence": "80",
  23.             "ocr_timeout": "5000",
  24.             "retry_times": "3",
  25.             "enable_cache": "true",
  26.             "enable_log": "true",
  27.             "auto_save_images": "true",
  28.             "image_save_path": "/ocr_images/",
  29.             "click_delay": "500",
  30.             "enable_smart_click": "true"
  31.         };
  32.         this.initConfig();
  33.     }
  34.    
  35.     initConfig() {
  36.         for (var key in this.defaultConfigs) {
  37.             if (!this.hasConfig(key)) {
  38.                 this.setConfig(key, this.defaultConfigs[key]);
  39.             }
  40.         }
  41.         printl("✓ 配置管理器初始化完成");
  42.     }
  43.    
  44.     setConfig(key, value) {
  45.         config.setConfig(this.configPrefix + key, String(value));
  46.     }
  47.    
  48.     getConfig(key, defaultValue) {
  49.         return config.getConfig(this.configPrefix + key, defaultValue);
  50.     }
  51.    
  52.     hasConfig(key) {
  53.         var value = this.getConfig(key, null);
  54.         return value !== null && value !== "";
  55.     }
  56.    
  57.     getAllConfigs() {
  58.         var result = {};
  59.         for (var key in this.defaultConfigs) {
  60.             result[key] = this.getConfig(key, this.defaultConfigs[key]);
  61.         }
  62.         return result;
  63.     }
  64. }

  65. // ==================== 日志记录器 ====================
  66. class OCRLogger {
  67.     constructor(enableLog) {
  68.         this.enableLog = enableLog;
  69.         this.logs = [];
  70.         this.maxLogs = 100;
  71.     }
  72.    
  73.     log(level, message, data) {
  74.         if (!this.enableLog) return;
  75.         
  76.         var timestamp = new Date().toISOString();
  77.         var logEntry = {
  78.             timestamp: timestamp,
  79.             level: level,
  80.             message: message,
  81.             data: data || null
  82.         };
  83.         
  84.         this.logs.push(logEntry);
  85.         if (this.logs.length > this.maxLogs) {
  86.             this.logs.shift();
  87.         }
  88.         
  89.         var logMsg = "[" + timestamp + "] [" + level + "] " + message;
  90.         if (data) {
  91.             logMsg += " - " + JSON.stringify(data);
  92.         }
  93.         printl(logMsg);
  94.     }
  95.    
  96.     info(message, data) {
  97.         this.log("INFO", message, data);
  98.     }
  99.    
  100.     warn(message, data) {
  101.         this.log("WARN", message, data);
  102.     }
  103.    
  104.     error(message, data) {
  105.         this.log("ERROR", message, data);
  106.     }
  107.    
  108.     debug(message, data) {
  109.         this.log("DEBUG", message, data);
  110.     }
  111.    
  112.     getLogs() {
  113.         return this.logs;
  114.     }
  115.    
  116.     exportLogs() {
  117.         return JSON.stringify(this.logs, null, 2);
  118.     }
  119. }

  120. // ==================== 图像处理器 ====================
  121. class OCRImageProcessor {
  122.     constructor(logger, configManager) {
  123.         this.logger = logger;
  124.         this.config = configManager;
  125.         this.currentImage = null;
  126.         this.currentMat = null;
  127.     }
  128.    
  129.     captureFullScreenshot() {
  130.         try {
  131.             this.logger.info("开始全屏截图");
  132.             this.currentImage = screen.screenShotFull();
  133.             this.logger.debug("全屏截图完成");
  134.             return this.currentImage;
  135.         } catch (e) {
  136.             this.logger.error("全屏截图失败", e.message);
  137.             return null;
  138.         }
  139.     }
  140.    
  141.     captureRegionScreenshot(left, top, right, bottom) {
  142.         try {
  143.             this.logger.info("开始区域截图", { region: [left, top, right, bottom] });
  144.             var width = Math.floor((right - left) * screen.getScreenWidth());
  145.             var height = Math.floor((bottom - top) * screen.getScreenHeight());
  146.             var x = Math.floor(left * screen.getScreenWidth());
  147.             var y = Math.floor(top * screen.getScreenHeight());
  148.             
  149.             this.currentImage = screen.screenShot(x, y, Math.min(width, height));
  150.             this.logger.debug("区域截图完成");
  151.             return this.currentImage;
  152.         } catch (e) {
  153.             this.logger.error("区域截图失败", e.message);
  154.             return null;
  155.         }
  156.     }
  157.    
  158.     loadImageFromFile(filePath) {
  159.         try {
  160.             this.logger.info("从文件加载图像", { path: filePath });
  161.             this.currentImage = new Image();
  162.             this.currentImage.readFile(filePath);
  163.             this.logger.debug("图像加载完成");
  164.             return this.currentImage;
  165.         } catch (e) {
  166.             this.logger.error("图像加载失败", e.message);
  167.             return null;
  168.         }
  169.     }
  170.    
  171.     loadImageFromBase64(base64String) {
  172.         try {
  173.             this.logger.info("从Base64加载图像", { length: base64String.length });
  174.             this.currentImage = new Image();
  175.             this.currentImage.readBase64(base64String);
  176.             this.logger.debug("图像加载完成");
  177.             return this.currentImage;
  178.         } catch (e) {
  179.             this.logger.error("Base64图像加载失败", e.message);
  180.             return null;
  181.         }
  182.     }
  183.    
  184.     getMat() {
  185.         try {
  186.             if (!this.currentImage) {
  187.                 this.logger.warn("当前没有图像,无法获取Mat");
  188.                 return null;
  189.             }
  190.             this.currentMat = this.currentImage.getMat();
  191.             this.logger.debug("Mat对象获取成功");
  192.             return this.currentMat;
  193.         } catch (e) {
  194.             this.logger.error("获取Mat失败", e.message);
  195.             return null;
  196.         }
  197.     }
  198.    
  199.     processImageWithOpenCV() {
  200.         try {
  201.             if (!this.currentMat) {
  202.                 this.currentMat = this.getMat();
  203.             }
  204.             
  205.             if (!this.currentMat) {
  206.                 this.logger.warn("无法进行图像处理,Mat对象为空");
  207.                 return false;
  208.             }
  209.             
  210.             this.logger.info("开始OpenCV图像处理");
  211.             
  212.             opencv.toGray(this.currentMat);
  213.             this.logger.debug("灰度化完成");
  214.             
  215.             opencv.threshold(this.currentMat, 100, 255);
  216.             this.logger.debug("二值化完成");
  217.             
  218.             this.logger.info("图像处理完成");
  219.             return true;
  220.         } catch (e) {
  221.             this.logger.error("图像处理失败", e.message);
  222.             return false;
  223.         }
  224.     }
  225.    
  226.     getBase64() {
  227.         try {
  228.             if (!this.currentImage) {
  229.                 this.logger.warn("当前没有图像,无法获取Base64");
  230.                 return null;
  231.             }
  232.             var base64 = this.currentImage.base64();
  233.             this.logger.debug("Base64获取成功", { length: base64.length });
  234.             return base64;
  235.         } catch (e) {
  236.             this.logger.error("获取Base64失败", e.message);
  237.             return null;
  238.         }
  239.     }
  240.    
  241.     saveImage(filePath) {
  242.         try {
  243.             if (!this.currentImage) {
  244.                 this.logger.warn("当前没有图像,无法保存");
  245.                 return false;
  246.             }
  247.             this.logger.info("保存图像", { path: filePath });
  248.             return true;
  249.         } catch (e) {
  250.             this.logger.error("保存图像失败", e.message);
  251.             return false;
  252.         }
  253.     }
  254.    
  255.     close() {
  256.         try {
  257.             if (this.currentImage) {
  258.                 this.currentImage.close();
  259.                 this.currentImage = null;
  260.             }
  261.             if (this.currentMat) {
  262.                 this.currentMat.close();
  263.                 this.currentMat = null;
  264.             }
  265.             this.logger.debug("图像资源已释放");
  266.         } catch (e) {
  267.             this.logger.error("释放图像资源失败", e.message);
  268.         }
  269.     }
  270. }

  271. // ==================== OCR识别引擎 ====================
  272. class OCREngine {
  273.     constructor(logger, configManager) {
  274.         this.logger = logger;
  275.         this.config = configManager;
  276.         this.currentResult = null;
  277.         this.isLocked = false;
  278.     }
  279.    
  280.     recognizeFullScreen() {
  281.         try {
  282.             this.logger.info("开始全屏OCR识别");
  283.             this.currentResult = screen.ocr(0, 0, 1, 1);
  284.             this.logger.debug("全屏OCR识别完成");
  285.             return this.currentResult;
  286.         } catch (e) {
  287.             this.logger.error("全屏OCR识别失败", e.message);
  288.             return null;
  289.         }
  290.     }
  291.    
  292.     recognizeRegion(left, top, right, bottom) {
  293.         try {
  294.             this.logger.info("开始区域OCR识别", { region: [left, top, right, bottom] });
  295.             this.currentResult = screen.ocr(left, top, right, bottom);
  296.             this.logger.debug("区域OCR识别完成");
  297.             return this.currentResult;
  298.         } catch (e) {
  299.             this.logger.error("区域OCR识别失败", e.message);
  300.             return null;
  301.         }
  302.     }
  303.    
  304.     recognizeImage(image) {
  305.         try {
  306.             this.logger.info("开始图像OCR识别");
  307.             this.currentResult = image.ocr(0, 0, 1, 1);
  308.             this.logger.debug("图像OCR识别完成");
  309.             return this.currentResult;
  310.         } catch (e) {
  311.             this.logger.error("图像OCR识别失败", e.message);
  312.             return null;
  313.         }
  314.     }
  315.    
  316.     recognizeWithOpenCV(templatePath) {
  317.         try {
  318.             this.logger.info("开始OpenCV OCR识别", { template: templatePath });
  319.             this.currentResult = opencv.OCREx(templatePath);
  320.             if (this.currentResult) {
  321.                 this.logger.debug("OpenCV OCR识别完成");
  322.             } else {
  323.                 this.logger.warn("OpenCV OCR识别返回空结果");
  324.             }
  325.             return this.currentResult;
  326.         } catch (e) {
  327.             this.logger.error("OpenCV OCR识别失败", e.message);
  328.             return null;
  329.         }
  330.     }
  331.    
  332.     getAllText() {
  333.         try {
  334.             if (!this.currentResult) {
  335.                 this.logger.warn("当前没有OCR结果");
  336.                 return "";
  337.             }
  338.             var text = this.currentResult.getAllString();
  339.             this.logger.debug("获取所有文本", { length: text.length });
  340.             return text;
  341.         } catch (e) {
  342.             this.logger.error("获取所有文本失败", e.message);
  343.             return "";
  344.         }
  345.     }
  346.    
  347.     getAllDetects() {
  348.         try {
  349.             if (!this.currentResult) {
  350.                 this.logger.warn("当前没有OCR结果");
  351.                 return [];
  352.             }
  353.             var detects = this.currentResult.getAllDetect();
  354.             // 处理detects中的text可能是函数的情况
  355.             for (var i = 0; i < detects.length; i++) {
  356.                 var detect = detects[i];
  357.                 if (detect) {
  358.                     // 尝试多种方式获取文本
  359.                     var detectText = null;
  360.                     try {
  361.                         if (typeof detect.text === "function") {
  362.                             // 避免直接调用可能的 native 方法
  363.                             detectText = String(detect.text);
  364.                         } else if (detect.text) {
  365.                             detectText = String(detect.text);
  366.                         } else if (detect.getText) {
  367.                             detectText = String(detect.getText());
  368.                         }
  369.                     } catch (e) {
  370.                         this.logger.warn("获取文本失败", e.message);
  371.                     }
  372.                     if (detectText) {
  373.                         detect.text = detectText;
  374.                     }
  375.                 }
  376.             }
  377.             this.logger.debug("获取所有检测对象", { count: detects.length });
  378.             return detects;
  379.         } catch (e) {
  380.             this.logger.error("获取所有检测对象失败", e.message);
  381.             return [];
  382.         }
  383.     }
  384.    
  385.     findText(text, region) {
  386.         try {
  387.             if (!this.currentResult) {
  388.                 this.logger.warn("当前没有OCR结果");
  389.                 return null;
  390.             }
  391.             var target = this.currentResult.findText(text, region || [0, 0, 1, 1]);
  392.             if (target) {
  393.                 this.logger.info("找到精确文本", { text: text });
  394.                 // 确保目标对象有正确的格式
  395.                 if (typeof target === 'object' && target !== null) {
  396.                     // 确保 target 有必要的属性
  397.                     if (target.x === undefined) target.x = 0;
  398.                     if (target.y === undefined) target.y = 0;
  399.                     if (target.width === undefined) target.width = 0;
  400.                     if (target.height === undefined) target.height = 0;
  401.                     // 添加 clickRandom 方法作为后备
  402.                     if (typeof target.clickRandom !== 'function') {
  403.                         target.clickRandom = function() {
  404.                             var centerX = this.x + (this.width || 0) / 2;
  405.                             var centerY = this.y + (this.height || 0) / 2;
  406.                             hid.mouseMove(centerX * 100, centerY * 100);
  407.                             sleep(100);
  408.                             hid.clickPercent(centerX, centerY);
  409.                         };
  410.                     }
  411.                 }
  412.             } else {
  413.                 this.logger.debug("未找到精确文本", { text: text });
  414.             }
  415.             return target;
  416.         } catch (e) {
  417.             this.logger.error("查找精确文本失败", e.message);
  418.             return null;
  419.         }
  420.     }
  421.    
  422.     findIncludeText(text, region) {
  423.         try {
  424.             if (!this.currentResult) {
  425.                 this.logger.warn("当前没有OCR结果");
  426.                 return null;
  427.             }
  428.             var target = this.currentResult.findIncludeText(text, region || [0, 0, 1, 1]);
  429.             if (target) {
  430.                 this.logger.info("找到包含文本", { text: text });
  431.                 // 确保目标对象有正确的格式
  432.                 if (typeof target === 'object' && target !== null) {
  433.                     // 确保 target 有必要的属性
  434.                     if (target.x === undefined) target.x = 0;
  435.                     if (target.y === undefined) target.y = 0;
  436.                     if (target.width === undefined) target.width = 0;
  437.                     if (target.height === undefined) target.height = 0;
  438.                     // 添加 clickRandom 方法作为后备
  439.                     if (typeof target.clickRandom !== 'function') {
  440.                         target.clickRandom = function() {
  441.                             var centerX = this.x + (this.width || 0) / 2;
  442.                             var centerY = this.y + (this.height || 0) / 2;
  443.                             hid.mouseMove(centerX * 100, centerY * 100);
  444.                             sleep(100);
  445.                             hid.clickPercent(centerX, centerY);
  446.                         };
  447.                     }
  448.                 }
  449.             } else {
  450.                 this.logger.debug("未找到包含文本", { text: text });
  451.             }
  452.             return target;
  453.         } catch (e) {
  454.             this.logger.error("查找包含文本失败", e.message);
  455.             return null;
  456.         }
  457.     }
  458.    
  459.     findIncludeTexts(text, region) {
  460.         try {
  461.             if (!this.currentResult) {
  462.                 this.logger.warn("当前没有OCR结果");
  463.                 return [];
  464.             }
  465.             var targets = this.currentResult.findIncludeTexts(text, region || [0, 0, 1, 1]);
  466.             this.logger.debug("查找包含文本结果", { text: text, count: targets.length });
  467.             return targets;
  468.         } catch (e) {
  469.             this.logger.error("查找包含文本失败", e.message);
  470.             return [];
  471.         }
  472.     }
  473.    
  474.     findWithRegex(regex, region) {
  475.         try {
  476.             if (!this.currentResult) {
  477.                 this.logger.warn("当前没有OCR结果");
  478.                 return [];
  479.             }
  480.             var targets = this.currentResult.findTextWithRegex(regex, region || [0, 0, 1, 1]);
  481.             this.logger.debug("正则表达式查找结果", { regex: regex, count: targets.length });
  482.             return targets;
  483.         } catch (e) {
  484.             this.logger.error("正则表达式查找失败", e.message);
  485.             return [];
  486.         }
  487.     }
  488.    
  489.     getJSON() {
  490.         try {
  491.             if (!this.currentResult) {
  492.                 this.logger.warn("当前没有OCR结果");
  493.                 return "{}";
  494.             }
  495.             var json = this.currentResult.getJSON();
  496.             this.logger.debug("获取JSON结果", { length: json.length });
  497.             return json;
  498.         } catch (e) {
  499.             this.logger.error("获取JSON结果失败", e.message);
  500.             return "{}";
  501.         }
  502.     }
  503.    
  504.     lock() {
  505.         try {
  506.             if (!this.isLocked) {
  507.                 OCR.lockOCR();
  508.                 this.isLocked = true;
  509.                 this.logger.info("OCR结果已锁定");
  510.             }
  511.         } catch (e) {
  512.             this.logger.error("锁定OCR失败", e.message);
  513.         }
  514.     }
  515.    
  516.     unlock() {
  517.         try {
  518.             if (this.isLocked) {
  519.                 OCR.unLock();
  520.                 this.isLocked = false;
  521.                 this.logger.info("OCR结果已解锁");
  522.             }
  523.         } catch (e) {
  524.             this.logger.error("解锁OCR失败", e.message);
  525.         }
  526.     }
  527. }

  528. // ==================== 智能点击器 ====================
  529. class SmartClicker {
  530.     constructor(logger, configManager) {
  531.         this.logger = logger;
  532.         this.config = configManager;
  533.     }
  534.    
  535.     clickTarget(target) {
  536.         try {
  537.             if (!target) {
  538.                 this.logger.warn("点击目标为空");
  539.                 return false;
  540.             }
  541.             
  542.             var enableSmartClick = this.config.getConfig("enable_smart_click", "true") === "true";
  543.             var clickDelay = parseInt(this.config.getConfig("click_delay", "500"));
  544.             
  545.             if (enableSmartClick && typeof target.clickRandom === 'function') {
  546.                 this.logger.info("使用智能随机点击");
  547.                 target.clickRandom();
  548.             } else if (target.x !== undefined && target.y !== undefined) {
  549.                 var centerX = target.x + (target.width || 0) / 2;
  550.                 var centerY = target.y + (target.height || 0) / 2;
  551.                 this.logger.info("使用坐标点击", { x: centerX, y: centerY });
  552.                
  553.                 // 添加鼠标移动效果
  554.                 this.logger.debug("移动鼠标到目标位置");
  555.                 hid.mouseMove(centerX * 100, centerY * 100);
  556.                
  557.                 // 短暂延迟,模拟真实鼠标移动
  558.                 sleep(100);
  559.                
  560.                 hid.clickPercent(centerX, centerY);
  561.             } else {
  562.                 this.logger.warn("无法点击,没有可用的点击方法或坐标");
  563.                 return false;
  564.             }
  565.             
  566.             if (clickDelay > 0) {
  567.                 sleep(clickDelay);
  568.             }
  569.             
  570.             this.logger.info("点击执行成功");
  571.             return true;
  572.         } catch (e) {
  573.             this.logger.error("点击执行失败", e.message);
  574.             return false;
  575.         }
  576.     }
  577.    
  578.     clickCoordinates(x, y) {
  579.         try {
  580.             this.logger.info("点击坐标", { x: x, y: y });
  581.             
  582.             // 添加鼠标移动效果
  583.             this.logger.debug("移动鼠标到目标位置");
  584.             hid.mouseMove(x * 100, y * 100);
  585.             
  586.             // 短暂延迟,模拟真实鼠标移动
  587.             sleep(100);
  588.             
  589.             hid.clickPercent(x, y);
  590.             var clickDelay = parseInt(this.config.getConfig("click_delay", "500"));
  591.             if (clickDelay > 0) {
  592.                 sleep(clickDelay);
  593.             }
  594.             this.logger.info("坐标点击成功");
  595.             return true;
  596.         } catch (e) {
  597.             this.logger.error("坐标点击失败", e.message);
  598.             return false;
  599.         }
  600.     }
  601. }

  602. // ==================== OCR自动化助手主类 ====================
  603. class OCRAutomationAssistant {
  604.     constructor() {
  605.         this.configManager = new OCRConfigManager();
  606.         var enableLog = this.configManager.getConfig("enable_log", "true") === "true";
  607.         this.logger = new OCRLogger(enableLog);
  608.         this.imageProcessor = new OCRImageProcessor(this.logger, this.configManager);
  609.         this.ocrEngine = new OCREngine(this.logger, this.configManager);
  610.         this.smartClicker = new SmartClicker(this.logger, this.configManager);
  611.         
  612.         this.logger.info("OCR自动化助手初始化完成");
  613.         this.displayConfig();
  614.     }
  615.    
  616.     displayConfig() {
  617.         printl("\n=== 当前配置 ===");
  618.         var configs = this.configManager.getAllConfigs();
  619.         for (var key in configs) {
  620.             printl("  " + key + ": " + configs[key]);
  621.         }
  622.         printl("================\n");
  623.     }
  624.    
  625.     findAndClick(text, options) {
  626.         options = options || {};
  627.         var region = options.region || [0, 0, 1, 1];
  628.         var exactMatch = options.exactMatch || false;
  629.         var retryTimes = options.retryTimes || parseInt(this.configManager.getConfig("retry_times", "3"));
  630.         
  631.         this.logger.info("开始查找并点击文本", { text: text, exactMatch: exactMatch });
  632.         
  633.         for (var i = 0; i < retryTimes; i++) {
  634.             try {
  635.                 // 先执行OCR识别
  636.                 this.logger.debug("执行OCR识别", { region: region });
  637.                 if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
  638.                     this.ocrEngine.recognizeFullScreen();
  639.                 } else {
  640.                     this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
  641.                 }
  642.                
  643.                 var target = null;
  644.                 if (exactMatch) {
  645.                     target = this.ocrEngine.findText(text, region);
  646.                 } else {
  647.                     target = this.ocrEngine.findIncludeText(text, region);
  648.                 }
  649.                
  650.                 if (target) {
  651.                     this.logger.info("找到目标文本,准备点击", { text: text, attempt: i + 1 });
  652.                     if (this.smartClicker.clickTarget(target)) {
  653.                         return { success: true, target: target };
  654.                     }
  655.                 } else {
  656.                     this.logger.debug("未找到目标文本", { text: text, attempt: i + 1 });
  657.                 }
  658.                
  659.                 if (i < retryTimes - 1) {
  660.                     sleep(1000);
  661.                 }
  662.             } catch (e) {
  663.                 this.logger.error("查找点击过程出错", e.message);
  664.             }
  665.         }
  666.         
  667.         this.logger.warn("未找到目标文本或点击失败", { text: text });
  668.         return { success: false, target: null };
  669.     }
  670.    
  671.     findAndClickAll(text, options) {
  672.         options = options || {};
  673.         var region = options.region || [0, 0, 1, 1];
  674.         var exactMatch = options.exactMatch || false;
  675.         var clickDelay = options.clickDelay || 500;
  676.         
  677.         this.logger.info("开始查找并点击所有匹配文本", { text: text });
  678.         
  679.         // 先执行OCR识别
  680.         this.logger.debug("执行OCR识别", { region: region });
  681.         if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
  682.             this.ocrEngine.recognizeFullScreen();
  683.         } else {
  684.             this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
  685.         }
  686.         
  687.         var targets = [];
  688.         if (exactMatch) {
  689.             var allDetects = this.ocrEngine.getAllDetects();
  690.             for (var i = 0; i < allDetects.length; i++) {
  691.                 var detect = allDetects[i];
  692.                 if (!detect) continue;
  693.                
  694.                 // 尝试多种方式获取文本
  695.                 var detectText = null;
  696.                 try {
  697.                     if (typeof detect.text === "function") {
  698.                         // 避免直接调用可能的 native 方法
  699.                         detectText = String(detect.text);
  700.                     } else if (detect.text) {
  701.                         detectText = String(detect.text);
  702.                     } else if (detect.getText) {
  703.                         detectText = String(detect.getText());
  704.                     } else {
  705.                         continue;
  706.                     }
  707.                 } catch (e) {
  708.                     this.logger.warn("获取文本失败", e.message);
  709.                     continue;
  710.                 }
  711.                
  712.                 if (detectText === text) {
  713.                     targets.push(detect);
  714.                 }
  715.             }
  716.         } else {
  717.             targets = this.ocrEngine.findIncludeTexts(text, region);
  718.         }
  719.         
  720.         this.logger.info("找到匹配目标", { count: targets.length });
  721.         
  722.         var results = [];
  723.         for (var i = 0; i < targets.length; i++) {
  724.             this.logger.info("点击第 " + (i + 1) + " 个目标");
  725.             var result = this.smartClicker.clickTarget(targets[i]);
  726.             results.push({ success: result, target: targets[i] });
  727.             
  728.             if (i < targets.length - 1 && clickDelay > 0) {
  729.                 sleep(clickDelay);
  730.             }
  731.         }
  732.         
  733.         return results;
  734.     }
  735.    
  736.     extractNumbers(options) {
  737.         options = options || {};
  738.         var region = options.region || [0, 0, 1, 1];
  739.         var regex = options.regex || "\\d+";
  740.         
  741.         this.logger.info("开始提取数字");
  742.         
  743.         // 先执行OCR识别
  744.         this.logger.debug("执行OCR识别", { region: region });
  745.         if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
  746.             this.ocrEngine.recognizeFullScreen();
  747.         } else {
  748.             this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
  749.         }
  750.         
  751.         var targets = this.ocrEngine.findWithRegex(regex, region);
  752.         var numbers = [];
  753.         
  754.         for (var i = 0; i < targets.length; i++) {
  755.             var target = targets[i];
  756.             if (!target) continue;
  757.             
  758.             // 尝试多种方式获取文本
  759.             var targetText = null;
  760.             try {
  761.                 if (typeof target.text === "function") {
  762.                     // 避免直接调用可能的 native 方法
  763.                     targetText = String(target.text);
  764.                 } else if (target.text) {
  765.                     targetText = String(target.text);
  766.                 } else if (target.getText) {
  767.                     targetText = String(target.getText());
  768.                 } else {
  769.                     continue;
  770.                 }
  771.             } catch (e) {
  772.                 this.logger.warn("获取文本失败", e.message);
  773.                 continue;
  774.             }
  775.             
  776.             if (!targetText) continue;
  777.             
  778.             var numStr = targetText.match(regex);
  779.             if (numStr) {
  780.                 numbers.push({
  781.                     text: targetText,
  782.                     number: numStr[0],
  783.                     position: {
  784.                         x: target.x || 0,
  785.                         y: target.y || 0,
  786.                         width: target.width || 0,
  787.                         height: target.height || 0
  788.                     }
  789.                 });
  790.             }
  791.         }
  792.         
  793.         this.logger.info("数字提取完成", { count: numbers.length });
  794.         return numbers;
  795.     }
  796.    
  797.     extractTextWithPattern(pattern, options) {
  798.         options = options || {};
  799.         var region = options.region || [0, 0, 1, 1];
  800.         
  801.         this.logger.info("开始按模式提取文本", { pattern: pattern });
  802.         
  803.         // 先执行OCR识别
  804.         this.logger.debug("执行OCR识别", { region: region });
  805.         if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
  806.             this.ocrEngine.recognizeFullScreen();
  807.         } else {
  808.             this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
  809.         }
  810.         
  811.         var targets = this.ocrEngine.findWithRegex(pattern, region);
  812.         var texts = [];
  813.         
  814.         for (var i = 0; i < targets.length; i++) {
  815.             var target = targets[i];
  816.             if (!target) continue;
  817.             
  818.             // 尝试多种方式获取文本
  819.             var targetText = null;
  820.             try {
  821.                 if (typeof target.text === "function") {
  822.                     // 避免直接调用可能的 native 方法
  823.                     targetText = String(target.text);
  824.                 } else if (target.text) {
  825.                     targetText = String(target.text);
  826.                 } else if (target.getText) {
  827.                     targetText = String(target.getText());
  828.                 } else {
  829.                     continue;
  830.                 }
  831.             } catch (e) {
  832.                 this.logger.warn("获取文本失败", e.message);
  833.                 continue;
  834.             }
  835.             
  836.             if (!targetText) continue;
  837.             
  838.             texts.push({
  839.                 text: targetText,
  840.                 position: {
  841.                     x: target.x || 0,
  842.                     y: target.y || 0,
  843.                     width: target.width || 0,
  844.                     height: target.height || 0
  845.                 }
  846.             });
  847.         }
  848.         
  849.         this.logger.info("文本提取完成", { count: texts.length });
  850.         return texts;
  851.     }
  852.    
  853.     verifyTextExists(text, options) {
  854.         options = options || {};
  855.         var region = options.region || [0, 0, 1, 1];
  856.         var exactMatch = options.exactMatch || false;
  857.         
  858.         this.logger.info("验证文本是否存在", { text: text, exactMatch: exactMatch });
  859.         
  860.         // 先执行OCR识别
  861.         this.logger.debug("执行OCR识别", { region: region });
  862.         if (region[0] === 0 && region[1] === 0 && region[2] === 1 && region[3] === 1) {
  863.             this.ocrEngine.recognizeFullScreen();
  864.         } else {
  865.             this.ocrEngine.recognizeRegion(region[0], region[1], region[2], region[3]);
  866.         }
  867.         
  868.         var target = null;
  869.         if (exactMatch) {
  870.             target = this.ocrEngine.findText(text, region);
  871.         } else {
  872.             target = this.ocrEngine.findIncludeText(text, region);
  873.         }
  874.         
  875.         var exists = target !== null;
  876.         this.logger.info("文本验证结果", { text: text, exists: exists });
  877.         return exists;
  878.     }
  879.    
  880.     waitForText(text, options) {
  881.         options = options || {};
  882.         var timeout = options.timeout || 10000;
  883.         var interval = options.interval || 1000;
  884.         var exactMatch = options.exactMatch || false;
  885.         var region = options.region || [0, 0, 1, 1];
  886.         
  887.         this.logger.info("等待文本出现", { text: text, timeout: timeout });
  888.         
  889.         var startTime = Date.now();
  890.         while (Date.now() - startTime < timeout) {
  891.             var exists = this.verifyTextExists(text, { exactMatch: exactMatch, region: region });
  892.             if (exists) {
  893.                 this.logger.info("文本已出现", { text: text });
  894.                 return true;
  895.             }
  896.             sleep(interval);
  897.         }
  898.         
  899.         this.logger.warn("等待文本超时", { text: text });
  900.         return false;
  901.     }
  902.    
  903.     captureAndRecognize(options) {
  904.         options = options || {};
  905.         var region = options.region || null;
  906.         var processImage = options.processImage || false;
  907.         
  908.         this.logger.info("开始截图并识别");
  909.         
  910.         if (region) {
  911.             this.imageProcessor.captureRegionScreenshot(region[0], region[1], region[2], region[3]);
  912.         } else {
  913.             this.imageProcessor.captureFullScreenshot();
  914.         }
  915.         
  916.         if (processImage) {
  917.             this.imageProcessor.processImageWithOpenCV();
  918.         }
  919.         
  920.         var image = this.imageProcessor.currentImage;
  921.         if (!image) {
  922.             this.logger.error("截图失败");
  923.             return null;
  924.         }
  925.         
  926.         var result = this.ocrEngine.recognizeImage(image);
  927.         if (!result) {
  928.             this.logger.error("OCR识别失败");
  929.             return null;
  930.         }
  931.         
  932.         var allText = this.ocrEngine.getAllText();
  933.         var allDetects = this.ocrEngine.getAllDetects();
  934.         
  935.         // 确保detects中的text字段已正确处理
  936.         for (var i = 0; i < allDetects.length; i++) {
  937.             var detect = allDetects[i];
  938.             if (detect && typeof detect.text === "function") {
  939.                 detect.text = detect.text();
  940.             } else if (detect && detect.text) {
  941.                 detect.text = String(detect.text);
  942.             }
  943.         }
  944.         
  945.         this.logger.info("截图识别完成", { textLength: allText.length, detectCount: allDetects.length });
  946.         
  947.         return {
  948.             text: allText,
  949.             detects: allDetects,
  950.             image: image,
  951.             base64: this.imageProcessor.getBase64()
  952.         };
  953.     }
  954.    
  955.     copyTextToClipboard(text) {
  956.         try {
  957.             this.logger.info("复制文本到剪贴板", { length: text.length });
  958.             clipboard.copyToClipboard(text);
  959.             this.logger.info("文本复制成功");
  960.             return true;
  961.         } catch (e) {
  962.             this.logger.error("复制文本失败", e.message);
  963.             return false;
  964.         }
  965.     }
  966.    
  967.     readTextFromClipboard() {
  968.         try {
  969.             this.logger.info("从剪贴板读取文本");
  970.             var text = clipboard.readFromClipboard();
  971.             this.logger.info("文本读取成功", { length: text ? text.length : 0 });
  972.             return text;
  973.         } catch (e) {
  974.             this.logger.error("读取文本失败", e.message);
  975.             return null;
  976.         }
  977.     }
  978.    
  979.     getLogs() {
  980.         return this.logger.getLogs();
  981.     }
  982.    
  983.     exportLogs() {
  984.         return this.logger.exportLogs();
  985.     }
  986.    
  987.     cleanup() {
  988.         try {
  989.             this.logger.info("开始清理资源");
  990.             this.imageProcessor.close();
  991.             this.ocrEngine.unlock();
  992.             this.logger.info("资源清理完成");
  993.         } catch (e) {
  994.             this.logger.error("资源清理失败", e.message);
  995.         }
  996.     }
  997. }

  998. // ==================== 使用示例 ====================
  999. function example1_basicUsage() {
  1000.     printl("\n【示例1】基础使用 - 查找并点击文本");
  1001.    
  1002.     var assistant = new OCRAutomationAssistant();
  1003.    
  1004.     var result = assistant.findAndClick("设置");
  1005.     if (result.success) {
  1006.         printl("✓ 成功找到并点击 '设置'");
  1007.     } else {
  1008.         printl("✗ 未找到 '设置'");
  1009.     }
  1010.    
  1011.     assistant.cleanup();
  1012. }

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

  1026. function example3_automationFlow() {
  1027.     printl("\n【示例3】自动化流程 - 模拟登录流程");
  1028.    
  1029.     var assistant = new OCRAutomationAssistant();
  1030.    
  1031.     var steps = [
  1032.         { text: "登录", action: "click" },
  1033.         { text: "用户名", action: "click" },
  1034.         { text: "密码", action: "click" },
  1035.         { text: "确定", action: "click" }
  1036.     ];
  1037.    
  1038.     for (var i = 0; i < steps.length; i++) {
  1039.         var step = steps[i];
  1040.         printl("步骤 " + (i + 1) + ": " + step.text);
  1041.         
  1042.         var result = assistant.findAndClick(step.text);
  1043.         if (result.success) {
  1044.             printl("  ✓ 成功");
  1045.             sleep(1000);
  1046.         } else {
  1047.             printl("  ✗ 失败");
  1048.             break;
  1049.         }
  1050.     }
  1051.    
  1052.     assistant.cleanup();
  1053. }

  1054. function example4_imageProcessing() {
  1055.     printl("\n【示例4】图像处理 - 截图、处理、识别");
  1056.    
  1057.     var assistant = new OCRAutomationAssistant();
  1058.    
  1059.     var result = assistant.captureAndRecognize({ processImage: true });
  1060.     if (result) {
  1061.         printl("✓ 截图识别成功");
  1062.         printl("  识别文本长度: " + result.text.length);
  1063.         printl("  识别目标数量: " + result.detects.length);
  1064.         printl("  Base64编码长度: " + (result.base64 ? result.base64.length : 0));
  1065.         
  1066.         if (result.detects.length > 0) {
  1067.             printl("  第一个识别目标: " + result.detects[0].text);
  1068.         }
  1069.     } else {
  1070.         printl("✗ 截图识别失败");
  1071.     }
  1072.    
  1073.     assistant.cleanup();
  1074. }

  1075. function example5_clipboardIntegration() {
  1076.     printl("\n【示例5】剪贴板集成 - 识别文本并复制到剪贴板");
  1077.    
  1078.     var assistant = new OCRAutomationAssistant();
  1079.    
  1080.     var result = assistant.captureAndRecognize();
  1081.     if (result && result.text.length > 0) {
  1082.         printl("✓ 识别到文本: " + result.text.substring(0, 50) + "...");
  1083.         
  1084.         if (assistant.copyTextToClipboard(result.text)) {
  1085.             printl("✓ 文本已复制到剪贴板");
  1086.             
  1087.             var clipboardText = assistant.readTextFromClipboard();
  1088.             if (clipboardText === result.text) {
  1089.                 printl("✓ 剪贴板验证成功");
  1090.             } else {
  1091.                 printl("✗ 剪贴板验证失败");
  1092.             }
  1093.         }
  1094.     } else {
  1095.         printl("✗ 识别失败或无文本");
  1096.     }
  1097.    
  1098.     assistant.cleanup();
  1099. }

  1100. function example6_multiRegionSearch() {
  1101.     printl("\n【示例6】多区域搜索 - 在不同区域查找文本");
  1102.    
  1103.     var assistant = new OCRAutomationAssistant();
  1104.    
  1105.     var regions = [
  1106.         { name: "顶部区域", region: [0, 0, 1, 0.3] },
  1107.         { name: "中间区域", region: [0, 0.3, 1, 0.7] },
  1108.         { name: "底部区域", region: [0, 0.7, 1, 1] }
  1109.     ];
  1110.    
  1111.     for (var i = 0; i < regions.length; i++) {
  1112.         var region = regions[i];
  1113.         printl("在 " + region.name + " 查找文本...");
  1114.         
  1115.         var result = assistant.findAndClick("确定", { region: region.region });
  1116.         if (result.success) {
  1117.             printl("  ✓ 在 " + region.name + " 找到并点击");
  1118.             break;
  1119.         } else {
  1120.             printl("  ✗ 在 " + region.name + " 未找到");
  1121.         }
  1122.     }
  1123.    
  1124.     assistant.cleanup();
  1125. }

  1126. function example7_patternExtraction() {
  1127.     printl("\n【示例7】模式提取 - 提取特定格式的文本");
  1128.    
  1129.     var assistant = new OCRAutomationAssistant();
  1130.    
  1131.     var patterns = [
  1132.         { name: "手机号", pattern: "1[3-9]\\d{9}" },
  1133.         { name: "邮箱", pattern: "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}" },
  1134.         { name: "金额", pattern: "\\d+\\.\\d{2}" }
  1135.     ];
  1136.    
  1137.     for (var i = 0; i < patterns.length; i++) {
  1138.         var pattern = patterns[i];
  1139.         printl("提取 " + pattern.name + "...");
  1140.         
  1141.         var texts = assistant.extractTextWithPattern(pattern.pattern);
  1142.         printl("  找到 " + texts.length + " 个" + pattern.name);
  1143.         
  1144.         for (var j = 0; j < Math.min(3, texts.length); j++) {
  1145.             printl("    " + (j + 1) + ": " + texts[j].text);
  1146.         }
  1147.     }
  1148.    
  1149.     assistant.cleanup();
  1150. }

  1151. function example8_waitForText() {
  1152.     printl("\n【示例8】等待文本 - 等待特定文本出现");
  1153.    
  1154.     var assistant = new OCRAutomationAssistant();
  1155.    
  1156.     printl("等待 '加载完成' 文本出现(最多10秒)...");
  1157.     var found = assistant.waitForText("加载完成", { timeout: 10000 });
  1158.    
  1159.     if (found) {
  1160.         printl("✓ 文本已出现");
  1161.     } else {
  1162.         printl("✗ 等待超时");
  1163.     }
  1164.    
  1165.     assistant.cleanup();
  1166. }

  1167. function example9_logExport() {
  1168.     printl("\n【示例9】日志导出 - 导出操作日志");
  1169.    
  1170.     var assistant = new OCRAutomationAssistant();
  1171.    
  1172.     assistant.findAndClick("设置");
  1173.     assistant.extractNumbers();
  1174.    
  1175.     printl("\n=== 操作日志 ===");
  1176.     var logs = assistant.getLogs();
  1177.     for (var i = 0; i < Math.min(5, logs.length); i++) {
  1178.         var log = logs[i];
  1179.         printl("[" + log.level + "] " + log.message);
  1180.     }
  1181.    
  1182.     printl("\n=== 导出JSON日志 ===");
  1183.     var jsonLogs = assistant.exportLogs();
  1184.     printl(jsonLogs.substring(0, 200) + "...");
  1185.    
  1186.     assistant.cleanup();
  1187. }

  1188. function example10_comprehensiveDemo() {
  1189.     printl("\n【示例10】综合演示 - 完整的自动化任务");
  1190.    
  1191.     var assistant = new OCRAutomationAssistant();
  1192.    
  1193.     printl("步骤1: 截图并识别");
  1194.     var result = assistant.captureAndRecognize();
  1195.     if (!result) {
  1196.         printl("✗ 截图识别失败");
  1197.         assistant.cleanup();
  1198.         return;
  1199.     }
  1200.     printl("✓ 识别到 " + result.detects.length + " 个文本元素");
  1201.    
  1202.     printl("\n步骤2: 查找并点击 '开始'");
  1203.     var startResult = assistant.findAndClick("开始");
  1204.     if (startResult.success) {
  1205.         printl("✓ 点击成功");
  1206.     } else {
  1207.         printl("✗ 未找到 '开始'");
  1208.     }
  1209.    
  1210.     printl("\n步骤3: 等待 '加载完成'");
  1211.     var loaded = assistant.waitForText("加载完成", { timeout: 5000 });
  1212.     if (loaded) {
  1213.         printl("✓ 加载完成");
  1214.     } else {
  1215.         printl("✗ 加载超时");
  1216.     }
  1217.    
  1218.     printl("\n步骤4: 提取所有数字");
  1219.     var numbers = assistant.extractNumbers();
  1220.     printl("✓ 提取到 " + numbers.length + " 个数字");
  1221.    
  1222.     printl("\n步骤5: 复制识别结果到剪贴板");
  1223.     if (result.text) {
  1224.         assistant.copyTextToClipboard(result.text);
  1225.         printl("✓ 已复制到剪贴板");
  1226.     }
  1227.    
  1228.     printl("\n步骤6: 导出操作日志");
  1229.     var jsonLogs = assistant.exportLogs();
  1230.     printl("✓ 日志已导出,长度: " + jsonLogs.length);
  1231.    
  1232.     assistant.cleanup();
  1233.     printl("\n✓ 综合演示完成");
  1234. }

  1235. function example11_buttonDemo() {
  1236.     printl("\n【示例11】按钮演示 - 轮流点击三个按钮");
  1237.    
  1238.     var assistant = new OCRAutomationAssistant();
  1239.    
  1240.     var buttons = ["投屏", "快捷指令", "激活模式"];
  1241.    
  1242.     for (var i = 0; i < buttons.length; i++) {
  1243.         var button = buttons[i];
  1244.         printl("点击按钮: " + button);
  1245.         
  1246.         var result = assistant.findAndClick(button);
  1247.         if (result && result.success) {
  1248.             printl("✓ 成功点击 '" + button + "'");
  1249.         } else {
  1250.             printl("✗ 未能找到或点击 '" + button + "'");
  1251.         }
  1252.         
  1253.         // 等待2秒,让界面有时间响应
  1254.         sleep(2000);
  1255.     }
  1256.    
  1257.     assistant.cleanup();
  1258.     printl("\n✓ 按钮演示完成");
  1259. }

  1260. function example12_configCenterDemo() {
  1261.     printl("\n【示例12】配置中心演示 - 点击配置管理中心页面元素");
  1262.    
  1263.     var assistant = new OCRAutomationAssistant();
  1264.    
  1265.     var elements = [
  1266.         "全部",
  1267.         "游戏配置",
  1268.         "OCR配置",
  1269.         "重置",
  1270.         "保存"
  1271.     ];
  1272.    
  1273.     for (var i = 0; i < elements.length; i++) {
  1274.         var element = elements[i];
  1275.         printl("点击元素: " + element);
  1276.         
  1277.         var result = assistant.findAndClick(element);
  1278.         if (result && result.success) {
  1279.             printl("✓ 成功点击 '" + element + "'");
  1280.         } else {
  1281.             printl("✗ 未能找到或点击 '" + element + "'");
  1282.         }
  1283.         
  1284.         // 等待1秒,让界面有时间响应
  1285.         sleep(1000);
  1286.     }
  1287.    
  1288.     assistant.cleanup();
  1289.     printl("\n✓ 配置中心演示完成");
  1290. }

  1291. // ==================== 主函数 ====================
  1292. function main() {
  1293.     printl("&#127822; 开始执行OCR自动化助手示例\n");
  1294.    
  1295.     example1_basicUsage();
  1296.     example2_advancedSearch();
  1297.     example3_automationFlow();
  1298.     example4_imageProcessing();
  1299.     example5_clipboardIntegration();
  1300.     example6_multiRegionSearch();
  1301.     example7_patternExtraction();
  1302.     example8_waitForText();
  1303.     example9_logExport();
  1304.     example10_comprehensiveDemo();
  1305.     example11_buttonDemo();
  1306.     example12_configCenterDemo();
  1307.    
  1308.     printl("\n&#127822; 所有示例执行完毕");
  1309. }

  1310. main();
复制代码



unto苹果脚本UI超快速点击示例nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
群发软件苹果智能OCR自动化助手
苹果智能OCR自动化助手
群发软件苹果脚本UI超快速点击示例
苹果脚本UI超快速点击示例
群发软件展示时间戳的各种复杂处理方法
展示时间戳的各种复杂处理方法
群发软件苹果脚本随机数实用示例
苹果脚本随机数实用示例
群发软件安卓手机脚本多种倒计时显示方式
安卓手机脚本多种倒计时显示方式
群发软件苹果脚本屏幕事件EVENT示例
苹果脚本屏幕事件EVENT示例
群发软件苹果脚本屏幕类screen例子
苹果脚本屏幕类screen例子
群发软件安卓手机config配置演示实列
安卓手机config配置演示实列
群发软件苹果脚本配置config小实例
苹果脚本配置config小实例 https://www.yuque.com/aiwork/dcvhmb/qolobpysdg0hvi2e
群发软件苹果脚本矩形类rect小实例
苹果脚本矩形类rect小实例
群发软件AIWROK安卓苹果平台设计的实用工具库
AIWROK安卓苹果平台设计的实用工具库
群发软件AIWROK软件Function导入方法实例演示
AIWROK软件Function导入方法实例演示
群发软件苹果脚本实例1项目project应用示例
苹果脚本实例1项目project应用示例
群发软件苹果脚本实例1剪贴板功能集成
苹果脚本实例1剪贴板功能集成
群发软件苹果iOS脚本Detect类系统性使用示例
苹果iOS脚本Detect类系统性使用示例
群发软件AIWROK苹果系统打印H5界面日志输出
AIWROK苹果系统打印H5界面日志输出
群发软件H5案例自动化看广告撸金币系统
H5案例自动化看广告撸金币系统
群发软件AIWROK苹果脚本H5任务执行小例子
AIWROK苹果脚本H5任务执行小例子
群发软件AIWROK软件苹果水平容器[Horizontal]小实例
AIWROK软件苹果水平容器[Horizontal]小实例
群发软件AIWROK苹果脚本实例1界面UI输入框类[Input]
AIWROK苹果脚本实例1界面UI输入框类
群发软件AIWROK软件苹果脚本案例1空白站位[Space]方法
AIWROK软件苹果脚本案例1空白站位[Space]方法
群发软件AIWROK软件苹查系统复选框用法
AIWROK软件苹查系统复选框用法
群发软件苹果AIWROK实例单选按钮组类[RadioButtonGroup]完整综合示例
苹果AIWROK实例单选按钮组类[RadioButtonGroup]完整综合示例
群发软件AIWROK软件苹果实例UI-垂直容器[Vertical]高级综合示例
AIWROK软件苹果实例UI-垂直容器[Vertical]高级综合示例
群发软件IOS苹果脚本View的完整功能实例
IOS苹果脚本View的完整功能实例
群发软件AIWROK苹果系统实例演示1标签类[Label]方法
AIWROK苹果系统实例演示1标签类[Label]方法
信息发布软件AIWROK软件苹果UI按钮Button方法示例
AIWROK软件苹果UI按钮Button方法示例
信息发布软件AIWROK软件苹果TAB界面视图示例
AIWROK软件苹果TAB界面视图示例
信息发布软件AIWROK苹果系统自带view视图简洁UI界面示例
AIWROK苹果系统自带view视图简洁UI界面示例
信息发布软件汇集HID安卓输入文字的方法和复制粘贴示例
汇集HID安卓输入文字的方法和复制粘贴示例
信息发布软件AIWROK软件找字与OCR方法汇总示例
AIWROK软件找字与OCR方法汇总示例
信息发布软件AIWROK软件找图方法汇总示例
AIWROK软件找图方法汇总示例
信息发布软件AIWROK软件滑动方法集合示例
AIWROK软件滑动方法集合示例
信息发布软件AIWROK软件安卓AIWROK汇集软件点击
AIWROK软件安卓AIWROK汇集软件点击
信息发布软件苹果系统点击方法综合示例
苹果系统点击方法综合示例
信息发布软件AIWROK苹果系统找图方法完整示例集合
AIWROK苹果系统找图方法完整示例集合
信息发布软件苹果系统找图方法完整示例集合
苹果系统找图方法完整示例集合
信息发布软件苹果IOS系统找字OCR方法例子
苹果IOS系统找字OCR方法例子
信息发布软件AIWORK软件数组高级示例
AIWORK软件数组高级示例
信息发布软件AIWROK软件运算符封装库示例
AIWROK软件运算符封装库示例
信息发布软件AIWROK软件语法运行小示例
AIWROK软件语法运行小示例
信息发布软件AIWROK软件JS循环小示例
AIWROK软件JS循环小示例
信息发布软件AIWROK软件H5网页被主脚本获取值用法
AIWROK软件H5网页被主脚本获取值用法
信息发布软件AIWROK软件创建可暂停恢复的多线程任务
AIWROK软件创建可暂停恢复的多线程任务
信息发布软件AIWROK软件类型转换方法例子
AIWROK软件类型转换方法例子
信息发布软件AIWROK软件H5脚本执行与进度显示
AIWROK软件H5脚本执行与进度显示 .
信息发布软件AIWROK软件根据时间段执行异步任务支持多线程并行处理
AIWROK软件根据时间段执行异步任务支持多线程并行处理
信息发布软件H5自动开关执行脚本功能演示
H5自动开关执行脚本功能演示
信息发布软件AIWROK软件H5单选脚本运行示例
AIWROK软件H5单选脚本运行示例
信息发布软件H5任务脚本选择与执行中心
H5任务脚本选择与执行中心
信息发布软件H5里CheckBox控件演示
H5里CheckBox控件演示
信息发布软件AIWROK软件正则用法实际例子
AIWROK软件正则用法实际例子
信息发布软件AIWROK软件权限管理器实现
AIWROK软件权限管理器实现
信息发布软件AIWORK软件节点方法无碍示例子
AIWORK软件节点方法无碍示例子
信息发布软件JSON.stringify 和 JSON.parse 完整示例
JSON.stringify 和 JSON.parse 完整示例
信息发布软件AIWROK软件展示JavaScript各种语句标识符的用法
AIWROK软件展示JavaScript各种语句标识符的用法
信息发布软件JS巧妙地组合使用各种条件语句
JS巧妙地组合使用各种条件语句
信息发布软件AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
信息发布软件HID中文输入智能打字功能
HID中文输入智能打字功能
信息发布软件AIWROK软件对象工具函数库例子
AIWROK软件对象工具函数库例子
信息发布软件AIWROK软件H5交互演示黄色主题
AIWROK软件H5交互演示黄色主题
信息发布软件H5单按钮执行脚本示例
H5单按钮执行脚本示例
信息发布软件苹果H5界面完整调用脚本示例
苹果H5界面完整调用脚本示例
信息发布软件AIWROK软件平台设备信息全面检测工具例子
AIWROK软件平台设备信息全面检测工具例子
信息发布软件AIWROK创建和放大日志窗口并展示动态内容
AIWROK创建和放大日志窗口并展示动态内容

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-3-31 09:02 , Processed in 0.376162 second(s), 50 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表