注册 登录
发贴工具
查看: 1|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] 苹果脚本智能OCR自动化助手

[复制链接]

2511

主题

2559

帖子

1万

积分

积分
15250
跳转到指定楼层
楼主
苹果脚本智能OCR自动化助手
苹果脚本智能OCR自动化助手 群发软件发帖工具

  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
回复

使用道具 举报

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

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖