YYPOST群发软件 发表于 3 天前

安卓脚本示例实时截图判断页面变化

安卓脚本示例实时截图判断页面变化






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

/**
* 截取当前屏幕并保存为Mat对象
* @returns {Object} Mat对象,失败返回null
*/
function captureScreen() {
    try {
      // 获取屏幕尺寸
      var screenWidth = 1080;
      var screenHeight = 1920;
      
      if (typeof screen !== 'undefined') {
            if (typeof screen.getScreenWidth === 'function') {
                screenWidth = screen.getScreenWidth();
                screenHeight = screen.getScreenHeight();
            }
      }
      
      printl("截取屏幕: " + screenWidth + "x" + screenHeight);
      var screenshot = screen.screenShot(screenWidth, screenHeight, 100);
      return screenshot.getMat();
    } catch (e) {
      printl("截图失败: " + String(e));
      return null;
    }
}

/**
* 比较两个Mat对象的相似度(通过像素点采样)
* @param {Object} mat1 - 第一个Mat对象
* @param {Object} mat2 - 第二个Mat对象
* @param {number} sampleRate - 采样率(0-1),默认0.2表示采样20%的像素
* @returns {number} 相似度(0-1),1表示完全相同
*/
function compareMats(mat1, mat2, sampleRate) {
    if (!mat1 || !mat2) {
      printl("ERR: Mat对象为空,无法比较");
      return 0;
    }
   
    try {
      sampleRate = sampleRate || 0.2; // 提高默认采样率到20%
      
      var width1 = mat1.width();
      var height1 = mat1.height();
      var width2 = mat2.width();
      var height2 = mat2.height();
      
      printl("图片1尺寸: " + width1 + "x" + height1);
      printl("图片2尺寸: " + width2 + "x" + height2);
      
      // 尺寸不同直接认为不同
      if (width1 !== width2 || height1 !== height2) {
            printl("⚠️ 图片尺寸不同,判定为页面已变化");
            return 0;
      }
      
      // 计算采样步长
      var stepX = Math.floor(1 / sampleRate);
      var stepY = Math.floor(1 / sampleRate);
      
      var totalPixels = 0;
      var samePixels = 0;
      var changedPixels = 0;
      
      // 采样比较像素点
      for (var y = 0; y < height1; y += stepY) {
            for (var x = 0; x < width1; x += stepX) {
                try {
                  var pixel1 = mat1.get(y, x);
                  var pixel2 = mat2.get(y, x);
                  
                  if (pixel1 && pixel2) {
                        totalPixels++;
                        
                        // 比较RGB值(降低容差,提高灵敏度)
                        var diff = Math.abs(pixel1 - pixel2) +
                                  Math.abs(pixel1 - pixel2) +
                                  Math.abs(pixel1 - pixel2);
                        
                        // 降低阈值从30到10,更灵敏
                        if (diff < 10) {
                            samePixels++;
                        } else {
                            changedPixels++;
                        }
                  }
                } catch (e) {
                  // 忽略单个像素读取错误
                }
            }
      }
      
      if (totalPixels === 0) {
            printl("ERR: 没有可比较的像素点");
            return 0;
      }
      
      var similarity = samePixels / totalPixels;
      var changeRate = changedPixels / totalPixels;
      
      printl("采样像素总数: " + totalPixels);
      printl("相似像素数: " + samePixels);
      printl("变化像素数: " + changedPixels);
      printl("变化率: " + (changeRate * 100).toFixed(2) + "%");
      printl("相似度: " + (similarity * 100).toFixed(2) + "%");
      
      return similarity;
    } catch (e) {
      printl("ERR: 比较Mat对象错误: " + String(e));
      return 0;
    }
}

/**
* 基础页面变化检测 - 通过两次截图对比
* @param {number} interval - 两次截图间隔时间(秒)
* @param {number} threshold - 相似度阈值(0-1),低于此值认为页面变化,默认0.90(更敏感)
* @returns {boolean} 页面是否发生变化(true=变化,false=未变化)
*/
function isPageChangedByScreenshot(interval, threshold) {
    printl("=== 开始截图对比页面变化检测 ===");
    printl("截图间隔: " + interval + "秒");
    printl("相似度阈值: " + (threshold * 100).toFixed(1) + "%");
    printl("&#128161; 提示: 请在" + interval + "秒内切换页面或滚动屏幕");
   
    try {
      // 第一次截图
      printl("\n&#128248; 进行第1次截图...");
      var mat1 = captureScreen();
      if (!mat1) {
            printl("ERR: 第1次截图失败");
            return false;
      }
      printl("✅ 第1次截图成功");
      
      // 等待指定时间
      printl("\n⏰ 等待 " + interval + " 秒...");
      printl("&#128073; 请在此期间切换页面、滚动屏幕或改变界面内容");
      sleep.second(interval);
      
      // 第二次截图
      printl("\n&#128248; 进行第2次截图...");
      var mat2 = captureScreen();
      if (!mat2) {
            printl("ERR: 第2次截图失败");
            mat1 = null; // 释放资源
            return false;
      }
      printl("✅ 第2次截图成功");
      
      // 比较两次截图
      printl("\n&#128269; 开始比较两次截图...");
      var similarity = compareMats(mat1, mat2, 0.2); // 提高采样率到20%
      
      // 释放Mat资源
      mat1 = null;
      mat2 = null;
      
      // 判断是否变化(降低阈值到0.90,更敏感)
      threshold = threshold || 0.90;
      var changed = (similarity < threshold);
      
      printl("\n=== 检测结果 ===");
      printl("相似度: " + (similarity * 100).toFixed(2) + "%");
      printl("阈值: " + (threshold * 100).toFixed(1) + "%");
      
      if (changed) {
            printl("✅✅✅ 结论: 页面已变化!检测到 " + ((1 - similarity) * 100).toFixed(2) + "% 的差异");
      } else {
            printl("⭕ 结论: 页面未变化(差异太小,可能需要更大改动)");
      }
      
      return changed;
    } catch (e) {
      printl("ERR: 截图对比页面变化检测错误: " + String(e));
      return false;
    }
}











/**
* 演示页面变化检测方法
*/
function demonstratePageChangeDetection() {
    printl("=== AIWROK 实时截图页面变化检测(最准确版)===");
   
    // 安全获取APP版本
    try {
      if (typeof app !== 'undefined' && app && typeof app.version !== 'undefined') {
            printl("APP版本: " + app.version);
      } else {
            printl("APP版本: 未知");
      }
    } catch (e) {
      printl("获取APP版本失败: " + String(e));
    }
   
    // 获取屏幕尺寸
    var screenWidth = 1080;
    var screenHeight = 1920;
   
    try {
      if (typeof screen !== 'undefined' && screen) {
            if (typeof screen.getScreenWidth === 'function') {
                screenWidth = screen.getScreenWidth();
                screenHeight = screen.getScreenHeight();
            }
      }
    } catch (e) {
      printl("获取屏幕尺寸失败,使用默认值: " + String(e));
    }
   
    printl("设备分辨率: " + screenWidth + "x" + screenHeight);
    printl("\n&#128204; 检测方法: 全屏高采样率像素对比");
    printl("&#128204; 检测间隔: 5秒");
    printl("&#128204; 灵敏度: 高(采样率25%,颜色阈值10,相似度阈值90%)");
   
    // 执行页面变化检测
    printl("\n=== 开始页面变化检测 ===");
    printl("⚠️⚠️⚠️ 重要提示 ⚠️⚠️⚠️");
    printl("在接下来的5秒内,请务必:");
    printl("1. 切换到另一个页面/应用");
    printl("2. 或者大幅滚动当前页面");
    printl("3. 或者弹出对话框/菜单");
    printl("否则将检测不到变化!");
   
    var changed = isPageChangedByScreenshot(5, 0.90);
   
    printl("\n=== 最终检测结果 ===");
    if (changed) {
      printl("✅✅✅ 页面已变化!检测成功!");
    } else {
      printl("⭕ 页面未变化");
      printl("&#128161; 如果确实有变化但未检测到,请检查:");
      printl("   1. 是否在5秒内进行了明显的页面切换");
      printl("   2. 变化幅度是否足够大");
      printl("   3. 可以尝试降低阈值,如: isPageChangedByScreenshot(5, 0.85)");
    }
   
    printl("\n=== 检测完成 ===");
}



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

// 运行示例
runPageChangeDetectionExample();


页: [1]
查看完整版本: 安卓脚本示例实时截图判断页面变化