• 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()); }
  • 相关阅读:
    没人关注的角落是个好地方
    PICKIT3 WIN10 无法连接问题解决
    TM1650+msp430单片机 调试及遇到问题的总结
    即将会来日常更新stm32的学习过程
    Learn Arduino the hard way 1——点亮一个LED
    准备再次开始更新
    Tcl之Read files for synthesis
    Verilog之event
    Tcl之Math
    Digital design之Boolean Algebra
  • 原文地址:https://www.cnblogs.com/zuiyue_jing/p/16036073.html
Copyright © 2020-2023  润新知