Spring Boot项目——项目定时实现自动截图发送

需求

  • Spring Boot项目,需要在每天下午4点定时截取软件系统中的一个图表页面,发送到领导邮箱

关注点

  • 下午4点定时发送
  • 自动截图
  • 浏览器不会一直打开,需要模拟浏览器打开截图页面
  • 发送邮箱

技术栈

  • Spring 定时任务
    • Spring Scheduled
  • Chrome Driver下载
    • https://chromedriver.chromium.org/downloads
  • 运行环境安装Chrome
    • 注意:安装Chrome一定要与系统使用的Chrome Driver版本一致
  • 自动截图
    • 使用git开源项目ashot : https://github.com/pazone/ashot
  • 模拟浏览器打开系统页面
    • 打开页面url权限控制:token验证
      • 自己想办法,每个系统使用方法不一致
    • 模拟浏览器:Selenium
  • 发送邮箱
    • 邮箱工具类

实现

  • 引入依赖插件
    • ashot
<dependency>
    <groupId>ru.yandex.qatools.ashot</groupId>
    <artifactId>ashot</artifactId>
    <version>1.5.4</version>
</dependency>
    • Selenium
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.1.2</version>
</dependency>
  • 实现代码
/**
 * 每天下午4点发送日报截图到邮箱
 *
 * @throws InterruptedException
 */
@Scheduled(cron = "0 0 16 * * ?")
public void sendChartScreen() throws InterruptedException {

    logger.info("sendChartScreen is start 🎂🎂🎂🎂🎂:{}", new Date());

    String chromeDriver = "Chrome Driver驱动文件存放位置";
    String chromePageUrl = "系统打开页面url";
    String url= = "邮箱地址";
    logger.info("chromeDriver={}", chromeDriver);

    System.setProperty("webdriver.chrome.driver", chromeDriver);

    ChromeOptions chromeOptions = new ChromeOptions();
    
    chromeOptions.addArguments("--headless");//设置为 headless 模式 (必须)
    chromeOptions.addArguments("--disable-gpu");//谷歌文档提到需要加上这个属性来规避bug
    chromeOptions.addArguments("--no-sandbox");//参数是让Chrome在root权限下跑
    chromeOptions.addArguments("--disable-dev-shm-usage");
    chromeOptions.addArguments("lang=zh_CN.UTF-8");//中文
    chromeOptions.addArguments("window-size=1920x1080"); //指定浏览器分辨率

    final WebDriver driver = new ChromeDriver(chromeOptions);
    driver.manage().window().maximize();
    driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.get(chromePageUrl);
    
    //设置等待时间:系统页面响应数据需要时间,此处必须设置否则页面无响应数据
    Thread.sleep(5000);

    //截图
    BufferedImage bi = new AShot()
            .shootingStrategy(ShootingStrategies.viewportPasting(100))
            .takeScreenshot(driver).getImage();

    try {
        //创建临时图片文件
        File file = File.createTempFile("dayweek", ".png");
        ImageIO.write(bi, "png", file);
        //发送到邮箱(自己实现,下面代码是我的工具类)
        EmailMessageImpl.sendImage(file, url);
    } catch (Exception e) {
        logger.error("定时发送矿场日报图表失败", e);
    }
   
   //一次截图后要退出,否则后续使用会报错 driver.quit(); logger.info(
"sendChartScreen is end 🎂🎂🎂🎂🎂:{}", new Date()); }

 

posted @ 2022-03-21 19:32  话·醉月  阅读(861)  评论(0编辑  收藏  举报