javaFx+google chrome测试下载视频

这篇具有很好参考价值的文章主要介绍了javaFx+google chrome测试下载视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

package sample;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.Alert;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.application.Platform;
import java.io.File;
import java.net.HttpURLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import javax.swing.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main extends Application {
    private TextField shareUrlField = new TextField();
    private CheckBox testOpenCheckbox = new CheckBox("调试");
    private TextField testPathField = new TextField();
    private TextField testTimeField = new TextField();
    private Button downloadButton = new Button("下载视频");
    private ProgressBar progressBar = new ProgressBar(0);

    // 默认等待时间
    private static final int DEFAULT_TEST_TIME = 5;

    private static final int WINDOW_WIDTH = 400;
    private static final int WINDOW_HEIGHT = 300;


    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("视频下载器");
        primaryStage.setMinWidth(WINDOW_WIDTH);
        primaryStage.setMinHeight(WINDOW_HEIGHT);
        primaryStage.setMaxWidth(WINDOW_WIDTH);
        primaryStage.setMaxHeight(WINDOW_HEIGHT);
        progressBar.setPrefWidth(WINDOW_WIDTH);

        testTimeField.setPromptText("5"); // 设置默认值提示
        downloadButton.setOnAction(e -> {
            downloadButton.setDisable(true);
            downloadButton.setText("下载中...");
            String shareUrl = shareUrlField.getText();
            boolean testOpen = testOpenCheckbox.isSelected();
            String testPath = testPathField.getText();
            // 检查testTimeField是否为空,使用默认值
            int testTime = testTimeField.getText().isEmpty() ? DEFAULT_TEST_TIME : Integer.parseInt(testTimeField.getText());
            // 重置进度条
            progressBar.setProgress(0);
            // 创建一个后台任务
            Task<Void> downloadTask = new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    // 在这里调用您的视频下载代码,将用户输入传递给下载方法
                    downloadVideo(shareUrl, testOpen, testPath, testTime);
                    return null;
                }
            };

            downloadTask.setOnSucceeded(event -> {
                // 下载完成时的处理,例如弹出消息或其他操作
                downloadButton.setText("下载视频");
                downloadButton.setDisable(false);
            });

            downloadTask.setOnFailed(event -> {
                // 下载失败时的处理
                downloadButton.setText("下载视频");
                downloadButton.setDisable(false);
            });
            // 启动任务
            Thread downloadThread = new Thread(downloadTask);
            downloadThread.setDaemon(true); // 设置为守护线程,以便在主窗口关闭时终止下载
            downloadThread.start();

        });

        VBox vbox = new VBox(10);
        vbox.setPrefWidth(WINDOW_WIDTH); // 设置首选宽度
        vbox.setPrefHeight(WINDOW_HEIGHT); // 设置首选高度
        vbox.getChildren().addAll(
                new Label("modal_id:"),
                shareUrlField,

                new Label("下载路径:(\\结尾)"),
                testPathField,
                new Label("等待时间 (秒):"),
                testTimeField,
                testOpenCheckbox,
                downloadButton,
                progressBar
        );

        Scene scene = new Scene(vbox, WINDOW_WIDTH, WINDOW_HEIGHT); // 设置Scene的宽度和高度
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void downloadVideo(String Url, boolean testOpen, String testPath, int testTime) {
        // 在这里调用您的视频下载代码,将用户输入传递给下载方法
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--headless"); // 启用无头模式
        chromeOptions.addArguments("--disable-gpu"); // 禁用GPU加速
        chromeOptions.addArguments("--headless", "--no-sandbox"); //禁用沙盒模式
        WebDriver driver = new ChromeDriver(chromeOptions);
//        //URL
        String shareUrl="https://www.douyin.com/video/"+Url;
//        //测试地址
//        Boolean testOpen=true;
//        //下载路径
//        String testPath="C:\\Users\\T\\Desktop\\";
//        //等待时间
//        int testTime=5;
        try{
            driver.get(shareUrl); // 替换为目标页面的URL
            Thread.sleep(testTime*1000);
            String localPath=testPath;
            String absoluteFilePath = localPath+"screenshot.png"; // 使用绝对文件路径
            if(testOpen){
                File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
                FileUtils.copyFile(screenshot, new File(absoluteFilePath));
            }
            // 获取页面源代码
            String pageSource = driver.getPageSource();
            driver.quit();
            //打开页面抓取
//            WebElement dynamicDataElement = driver.findElement(By.xpath("//*[@id=\"__next\"]/div[1]/div[3]/div/div/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]"));
//            WebElement dynamicDataElement =driver.findElement(By.cssSelector("#__next > div:nth-child(1) > div:nth-child(3) > div > div > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"));
//            String dynamicData = dynamicDataElement.getText();
//            System.out.println("Dynamic Data: " + dynamicData);
            //无头模式正则
            String regex="(?<=<source class=\"\" src=\")(.*?)(?=\")";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(pageSource);
            String extractedString=null;
            while (matcher.find()) {
                extractedString = matcher.group();
            }
            //采集标题
//            String titleRegex="(?<=<span><span class=\"Nu66P_ba\"><span><span><span><span>)(.*?)(?=</span>)";
//            Pattern titlePattern = Pattern.compile(titleRegex);
//            Matcher titleMatcher = titlePattern.matcher(pageSource);
//            String titleExtractedString=random();
//            while (titleMatcher.find()) {
//                titleExtractedString = titleMatcher.group();
//            }
            String titleExtractedString=shareUrl.split("video/")[1];
            System.out.println("ID:"+titleExtractedString);
            System.out.println("https:"+extractedString);
            if(extractedString==null){
                Platform.runLater(() ->showErrorAlert("失败","下载失败"));
            }
            //下载视频
            down("https:"+extractedString,localPath,titleExtractedString);
        }catch(Exception e){
            System.out.println(e.getMessage());
            driver.quit();
        }
    }
    public  void down(String videoURL,String localPath,String title){
        String savePath = localPath+title+".mp4"; // 本地保存视频的文件路径
        System.out.println("down——URL: " + videoURL);
        try {
            URL url = new URL(videoURL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 添加自定义请求头,模拟浏览器请求
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
            connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7");
            connection.setRequestProperty("Host", "www.douyin.com");

            InputStream inputStream = new ProgressMonitorInputStream(null, "正在下载视频", connection.getInputStream());
            FileOutputStream fileOutputStream = new FileOutputStream(savePath);

            byte[] buffer = new byte[4096];
            int bytesRead;
            long totalBytesRead = 0;
            long totalBytes = url.openConnection().getContentLength(); // 获取总字节数

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;

                // 计算下载进度
                int progress = (int) ((totalBytesRead * 100) / totalBytes);
                Platform.runLater(() ->setProgress(progress));
                System.out.println("下载进度: " + progress + "%");
            }

            inputStream.close();
            fileOutputStream.close();

            System.out.println("视频下载完成。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setProgress(int progress){
        progressBar.setProgress((double)progress/100);
    };
    public   String random(){
        int length = 18;
        StringBuilder randomString = new StringBuilder();

        Random random = new Random();

        for (int i = 0; i < length; i++) {
            int digit = random.nextInt(10); // 生成0到9之间的随机数字
            randomString.append(digit);
        }

        String random18DigitNumber = randomString.toString();
        return  random18DigitNumber;
    }
    // 弹出错误提示框
    private void showErrorAlert(String title, String content) {
        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(content);
        alert.showAndWait();
    }
}

pom

<dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version> <!-- 版本号可以根据需要进行更改 -->
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version> <!-- 使用最新版本 -->
        </dependency>
    </dependencies>
    <build>
        <!--打包成jar包时的名字-->
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>sample.main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

编译好编译好的文件  需要下载谷歌浏览器 和对应的驱动文件,驱动文件放在C盘根目录下文章来源地址https://www.toymoban.com/news/detail-744471.html

到了这里,关于javaFx+google chrome测试下载视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ffmpeg解决bilibili下载的音视频分离问题,将音视频一键合成

    1:到FFmpeg下载安装包,我安装的是windows 下载打包文件 2:解压文件到本地 以下为解压后的文件视图 3:点击进去第一个bin文件,复制该目录,安装到本地环境变量中 然后点击确定进行保存设置 4:ctrl+r打开运行,输入cmd打开命令窗口,输入ffmpeg -version查看版本 安装成功 将所

    2024年02月11日
    浏览(35)
  • 抖音视频提取工具可导出视频分享链接|视频爬虫批量下载

    抖音无水印视频批量下载工具操作指南 一、工具介绍 我们开发了一款功能强大的视频批量下载工具,不仅能够通过单个视频链接进行提取,还可以通过进行视频搜索,Q:290615413实现批量提取和有选择性的下载。 二、操作步骤 2.1 批量提取视频 进入软件,点击“

    2024年04月15日
    浏览(119)
  • 抖音视频如何下载保存(方法分享)

    有时刷抖音视频,看的喜欢的视频想要下载到本地,但是有很多视频无法下载或者下载下来是有水印的,那怎么办呢? 抖音视频下载有两种情况: 一种是可以直接点击分享下载,然后可以直接点击保存到相册。 视频就自动下载下来了,但是这直接下载下来的视有水印。 还有

    2024年04月14日
    浏览(78)
  • 抖音视频批量提取采集软件|视频无水印下载工具

    高效批量提取抖音视频,轻松应对营销需求! 在抖音视频营销中,如何高效地获取大量视频资源是许多市场人员面临的挑战。针对这一需求,我们开发了一款功能强大的抖音视频批量提取采集软件,帮助您快速、方便地获取所需视频,满足您的营销需求。 简介: 我们的软件

    2024年04月14日
    浏览(44)
  • 抖音视频批量下载软件功能|短视频数据挖掘软件

    《抖音视频批量下载软件——提升工作效率的利器》         在当今信息爆炸的时代,视频内容已经成为人们获取信息、娱乐放松的重要途径之一。而针对抖音视频的批量下载需求,我们推出了一款功能强大的软件,让您轻松实现视频批量提取,提高工作效率,让您事半功倍

    2024年03月09日
    浏览(37)
  • 多平台音视频下载软件工具 - VidJuice UniTube下载

    提到音视频下载工具,Downie 基本是 Mac 平台的首选。而 Windows 用户也不用羡慕,有一款工具可以实现! 那就是 VidJuice UniTube ,一款支持 Win、Mac 以及安卓平台,能从 10000+热门站点,下载音视频的工具。 VidJuice UniTube 支持 1000+国内外热门视频网站,下载视频简单易用。在安

    2024年02月04日
    浏览(125)
  • 抖音视频无水印采集拓客软件|视频批量下载提取工具

    抖音视频无水印批量采集拓客软件助力高效营销!         随着抖音平台的崛起,视频已成为各行各业进行营销的重要工具。但是,传统的视频下载方式往往效率低下,无法满足快速获取大量视频的需求。针对这一问题,我们开发了一款视频无水印批量采集拓客软件。 工具

    2024年04月14日
    浏览(59)
  • 抖音视频下载.py(23年9月份可用)

    声明:仅供学习交流使用!!! 抖音无水印视频下载; 首先登录抖音网页端 打开要下载的视频userId 然后编码实现下载 最后是完整代码,拿走就能用那种:

    2024年02月07日
    浏览(28)
  • 抖音视频批量下载工具|抖音数据抓取工具

            想要随时随地观看抖音平台上的精彩视频内容吗?不必担心!这款基于C#开发的抖音视频下载工具将成为您的得力助手,让您轻松畅享最新、最热的视频内容。 【多功能实用】 无论是批量视频提取还是固定视频下载,这款工具都能满足您的需求。通过输入进行

    2024年04月09日
    浏览(90)
  • 将抖音视频转成MP3并下载

    这篇是在上一篇的基础上写的,这篇负责抖音作者详情页的视频转声音提取,这篇需要用到后端。 本地启动后端后,在控制台输入对应代码,即可实现hover在封面上,按d一键下载音频 控制台代码 后端 node 代码 如果不想用控制台,也可以用暴力猴,暴力猴脚本如下:

    2024年01月23日
    浏览(99)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包