B2B网络软件

标题: 安卓脚本示例实时截图判断页面变化 [打印本页]

作者: YYPOST群发软件    时间: 4 小时前
标题: 安卓脚本示例实时截图判断页面变化
安卓脚本示例实时截图判断页面变化
安卓脚本示例实时截图判断页面变化 B2B网络软件

安卓脚本示例实时截图判断页面变化 B2B网络软件

安卓脚本示例实时截图判断页面变化 B2B网络软件

  1. // 实时截图判断页面变化示例
  2. // 技术交流QQ群711841924群一,苹果内测群,528816639
  3. // 采用全屏高采样率像素对比,间隔5秒检测

  4. /**
  5. * 截取当前屏幕并保存为Mat对象
  6. * @returns {Object} Mat对象,失败返回null
  7. */
  8. function captureScreen() {
  9.     try {
  10.         // 获取屏幕尺寸
  11.         var screenWidth = 1080;
  12.         var screenHeight = 1920;
  13.         
  14.         if (typeof screen !== 'undefined') {
  15.             if (typeof screen.getScreenWidth === 'function') {
  16.                 screenWidth = screen.getScreenWidth();
  17.                 screenHeight = screen.getScreenHeight();
  18.             }
  19.         }
  20.         
  21.         printl("截取屏幕: " + screenWidth + "x" + screenHeight);
  22.         var screenshot = screen.screenShot(screenWidth, screenHeight, 100);
  23.         return screenshot.getMat();
  24.     } catch (e) {
  25.         printl("截图失败: " + String(e));
  26.         return null;
  27.     }
  28. }

  29. /**
  30. * 比较两个Mat对象的相似度(通过像素点采样)
  31. * @param {Object} mat1 - 第一个Mat对象
  32. * @param {Object} mat2 - 第二个Mat对象
  33. * @param {number} sampleRate - 采样率(0-1),默认0.2表示采样20%的像素
  34. * @returns {number} 相似度(0-1),1表示完全相同
  35. */
  36. function compareMats(mat1, mat2, sampleRate) {
  37.     if (!mat1 || !mat2) {
  38.         printl("ERR: Mat对象为空,无法比较");
  39.         return 0;
  40.     }
  41.    
  42.     try {
  43.         sampleRate = sampleRate || 0.2; // 提高默认采样率到20%
  44.         
  45.         var width1 = mat1.width();
  46.         var height1 = mat1.height();
  47.         var width2 = mat2.width();
  48.         var height2 = mat2.height();
  49.         
  50.         printl("图片1尺寸: " + width1 + "x" + height1);
  51.         printl("图片2尺寸: " + width2 + "x" + height2);
  52.         
  53.         // 尺寸不同直接认为不同
  54.         if (width1 !== width2 || height1 !== height2) {
  55.             printl("⚠️ 图片尺寸不同,判定为页面已变化");
  56.             return 0;
  57.         }
  58.         
  59.         // 计算采样步长
  60.         var stepX = Math.floor(1 / sampleRate);
  61.         var stepY = Math.floor(1 / sampleRate);
  62.         
  63.         var totalPixels = 0;
  64.         var samePixels = 0;
  65.         var changedPixels = 0;
  66.         
  67.         // 采样比较像素点
  68.         for (var y = 0; y < height1; y += stepY) {
  69.             for (var x = 0; x < width1; x += stepX) {
  70.                 try {
  71.                     var pixel1 = mat1.get(y, x);
  72.                     var pixel2 = mat2.get(y, x);
  73.                     
  74.                     if (pixel1 && pixel2) {
  75.                         totalPixels++;
  76.                         
  77.                         // 比较RGB值(降低容差,提高灵敏度)
  78.                         var diff = Math.abs(pixel1[0] - pixel2[0]) +
  79.                                   Math.abs(pixel1[1] - pixel2[1]) +
  80.                                   Math.abs(pixel1[2] - pixel2[2]);
  81.                         
  82.                         // 降低阈值从30到10,更灵敏
  83.                         if (diff < 10) {
  84.                             samePixels++;
  85.                         } else {
  86.                             changedPixels++;
  87.                         }
  88.                     }
  89.                 } catch (e) {
  90.                     // 忽略单个像素读取错误
  91.                 }
  92.             }
  93.         }
  94.         
  95.         if (totalPixels === 0) {
  96.             printl("ERR: 没有可比较的像素点");
  97.             return 0;
  98.         }
  99.         
  100.         var similarity = samePixels / totalPixels;
  101.         var changeRate = changedPixels / totalPixels;
  102.         
  103.         printl("采样像素总数: " + totalPixels);
  104.         printl("相似像素数: " + samePixels);
  105.         printl("变化像素数: " + changedPixels);
  106.         printl("变化率: " + (changeRate * 100).toFixed(2) + "%");
  107.         printl("相似度: " + (similarity * 100).toFixed(2) + "%");
  108.         
  109.         return similarity;
  110.     } catch (e) {
  111.         printl("ERR: 比较Mat对象错误: " + String(e));
  112.         return 0;
  113.     }
  114. }

  115. /**
  116. * 基础页面变化检测 - 通过两次截图对比
  117. * @param {number} interval - 两次截图间隔时间(秒)
  118. * @param {number} threshold - 相似度阈值(0-1),低于此值认为页面变化,默认0.90(更敏感)
  119. * @returns {boolean} 页面是否发生变化(true=变化,false=未变化)
  120. */
  121. function isPageChangedByScreenshot(interval, threshold) {
  122.     printl("=== 开始截图对比页面变化检测 ===");
  123.     printl("截图间隔: " + interval + "秒");
  124.     printl("相似度阈值: " + (threshold * 100).toFixed(1) + "%");
  125.     printl("&#128161; 提示: 请在" + interval + "秒内切换页面或滚动屏幕");
  126.    
  127.     try {
  128.         // 第一次截图
  129.         printl("\n&#128248; 进行第1次截图...");
  130.         var mat1 = captureScreen();
  131.         if (!mat1) {
  132.             printl("ERR: 第1次截图失败");
  133.             return false;
  134.         }
  135.         printl("✅ 第1次截图成功");
  136.         
  137.         // 等待指定时间
  138.         printl("\n⏰ 等待 " + interval + " 秒...");
  139.         printl("&#128073; 请在此期间切换页面、滚动屏幕或改变界面内容");
  140.         sleep.second(interval);
  141.         
  142.         // 第二次截图
  143.         printl("\n&#128248; 进行第2次截图...");
  144.         var mat2 = captureScreen();
  145.         if (!mat2) {
  146.             printl("ERR: 第2次截图失败");
  147.             mat1 = null; // 释放资源
  148.             return false;
  149.         }
  150.         printl("✅ 第2次截图成功");
  151.         
  152.         // 比较两次截图
  153.         printl("\n&#128269; 开始比较两次截图...");
  154.         var similarity = compareMats(mat1, mat2, 0.2); // 提高采样率到20%
  155.         
  156.         // 释放Mat资源
  157.         mat1 = null;
  158.         mat2 = null;
  159.         
  160.         // 判断是否变化(降低阈值到0.90,更敏感)
  161.         threshold = threshold || 0.90;
  162.         var changed = (similarity < threshold);
  163.         
  164.         printl("\n=== 检测结果 ===");
  165.         printl("相似度: " + (similarity * 100).toFixed(2) + "%");
  166.         printl("阈值: " + (threshold * 100).toFixed(1) + "%");
  167.         
  168.         if (changed) {
  169.             printl("✅✅✅ 结论: 页面已变化!检测到 " + ((1 - similarity) * 100).toFixed(2) + "% 的差异");
  170.         } else {
  171.             printl("⭕ 结论: 页面未变化(差异太小,可能需要更大改动)");
  172.         }
  173.         
  174.         return changed;
  175.     } catch (e) {
  176.         printl("ERR: 截图对比页面变化检测错误: " + String(e));
  177.         return false;
  178.     }
  179. }











  180. /**
  181. * 演示页面变化检测方法
  182. */
  183. function demonstratePageChangeDetection() {
  184.     printl("=== AIWROK 实时截图页面变化检测(最准确版)===");
  185.    
  186.     // 安全获取APP版本
  187.     try {
  188.         if (typeof app !== 'undefined' && app && typeof app.version !== 'undefined') {
  189.             printl("APP版本: " + app.version);
  190.         } else {
  191.             printl("APP版本: 未知");
  192.         }
  193.     } catch (e) {
  194.         printl("获取APP版本失败: " + String(e));
  195.     }
  196.    
  197.     // 获取屏幕尺寸
  198.     var screenWidth = 1080;
  199.     var screenHeight = 1920;
  200.    
  201.     try {
  202.         if (typeof screen !== 'undefined' && screen) {
  203.             if (typeof screen.getScreenWidth === 'function') {
  204.                 screenWidth = screen.getScreenWidth();
  205.                 screenHeight = screen.getScreenHeight();
  206.             }
  207.         }
  208.     } catch (e) {
  209.         printl("获取屏幕尺寸失败,使用默认值: " + String(e));
  210.     }
  211.    
  212.     printl("设备分辨率: " + screenWidth + "x" + screenHeight);
  213.     printl("\n&#128204; 检测方法: 全屏高采样率像素对比");
  214.     printl("&#128204; 检测间隔: 5秒");
  215.     printl("&#128204; 灵敏度: 高(采样率25%,颜色阈值10,相似度阈值90%)");
  216.    
  217.     // 执行页面变化检测
  218.     printl("\n=== 开始页面变化检测 ===");
  219.     printl("⚠️⚠️⚠️ 重要提示 ⚠️⚠️⚠️");
  220.     printl("在接下来的5秒内,请务必:");
  221.     printl("  1. 切换到另一个页面/应用");
  222.     printl("  2. 或者大幅滚动当前页面");
  223.     printl("  3. 或者弹出对话框/菜单");
  224.     printl("否则将检测不到变化!");
  225.    
  226.     var changed = isPageChangedByScreenshot(5, 0.90);
  227.    
  228.     printl("\n=== 最终检测结果 ===");
  229.     if (changed) {
  230.         printl("✅✅✅ 页面已变化!检测成功!");
  231.     } else {
  232.         printl("⭕ 页面未变化");
  233.         printl("&#128161; 如果确实有变化但未检测到,请检查:");
  234.         printl("   1. 是否在5秒内进行了明显的页面切换");
  235.         printl("   2. 变化幅度是否足够大");
  236.         printl("   3. 可以尝试降低阈值,如: isPageChangedByScreenshot(5, 0.85)");
  237.     }
  238.    
  239.     printl("\n=== 检测完成 ===");
  240. }



  241. /**
  242. * 运行页面变化检测示例
  243. */
  244. function runPageChangeDetectionExample() {
  245.     printl("开始执行实时截图页面变化检测示例");
  246.     printl("⚠️ 本示例完全基于实时截图,不需要任何CV文件");
  247.     printl("⚠️ 采用最准确的全屏高采样率对比方法");
  248.     printl("⚠️ 检测间隔: 5秒\n");
  249.    
  250.     // 演示页面变化检测
  251.     demonstratePageChangeDetection();
  252.    
  253.     printl("\n页面变化检测示例执行完毕");
  254. }

  255. // 运行示例
  256. runPageChangeDetectionExample();
复制代码







欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) Powered by Discuz! X3.2