• Java——项目定时实现自动截图发送


    需求

    • 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()); }
  • 相关阅读:
    Atitit sql计划任务与查询优化器统计信息模块
    Atitit  数据库的事件机制触发器与定时任务attilax总结
    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
    Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
    Atitit View事件分发机制
    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
    Atitti 存储引擎支持的国内点与特性attilax总结
    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
  • 原文地址:https://www.cnblogs.com/zuiyue_jing/p/16036073.html
Copyright © 2020-2023  润新知