欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个抖音视频下载代码

程序员文章站 2022-04-11 17:29:20
...
<dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.3.1</version>
        </dependency>
    </dependencies>

先加入上面的坐标到pom文件中

定义常量类

/**
 * 常量类
 */
public interface Const {
    //抖音随机刷新视频列表
    String url = "https://aweme-eagle.snssdk.com/aweme/v1/feed/?type=0&max_cursor=0&min_cursor=0&count=6&volume=0.0&pull_type=1&need_relieve_aweme=0&filter_warn=0&req_from&is_cold_start=0&longitude=120.388862&latitude=36.090072&ts=1545468521&js_sdk_version=1.5.4&app_type=normal&manifest_version_code=380&_rticket=1545468521415&ac=wifi&device_id=53039791462&iid=54915619827&mcc_mnc=46000&os_version=8.0.0&channel=update&version_code=380&device_type=MHA-AL00&language=zh&uuid=865296034887289&resolution=1080*1808&openudid=3a6f6cdf79dc8965&update_version_code=3802&app_name=aweme&version_name=3.8.0&os_api=26&device_brand=HUAWEI&ssmix=a&device_platform=android&dpi=480&aid=1128&as=a195cfd199360cbaed8411&cp=f667cb5e91d818ade1IgQk&mas=0139d6baba15f4cc628baffe83a99fad7c8c8c2c1c26a68646c60c";
    //User-Agent
    String userAgent= "com.ss.android.ugc.aweme/380 (Linux; U; Android 8.0.0; zh_CN_#Hans; MHA-AL00; Build/HUAWEIMHA-AL00; Cronet/58.0.2991.0)";
}

 

 

核心关键代码:

package com.github.liupeng328;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.db.Entity;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.io.File;

public class Main implements Runnable{

    private static String absolutePath;//视频存放路径

    @Override
    public void run() {
        while (true) {
            try {
                down();//开始下载
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("******************************************************************");
        System.err.println("欢迎使用抖音视频下载工具,如有问题请加QQ群交流:317896269");
        System.err.println("开始抓取数据……");
        absolutePath = FileUtil.getAbsolutePath(new File(""));
        absolutePath = absolutePath+File.separator+"下载到的视频"+File.separator;
        System.err.println("视频存放路径为: "+absolutePath);
        //多线程下载
       ThreadUtil.execute(new Main());
       ThreadUtil.execute(new Main());
    }

    /**
     * 下载视频
     */
    private static void down() {
        String body = HttpRequest.get(Const.url).header("User-Agent", Const.userAgent).execute().body();
        JSONObject json = JSONUtil.parseObj(body);
        //System.out.println(JSONUtil.formatJsonStr(body));
        //抽取数据 响应数据详细解析见: doc/抖音视频列表接口分析.json
        JSONArray list = json.getJSONArray("aweme_list");
        if(list.size()>0){
            for(int i = 0;i<list.size();i++){
                JSONObject object = list.getJSONObject(i);
                //作者信息
                JSONObject authorJson = object.getJSONObject("author");
                if(authorJson!=null){
                    Entity author = Entity.create()
                            .set("uid",authorJson.getStr("uid"))//id
                            .set("short_id",authorJson.getStr("short_id"))//短id
                            .set("nickname",authorJson.getStr("nickname"))//昵称
                            .set("gender",authorJson.getStr("gender"))//性别
                            .set("signature",authorJson.getStr("signature"))//个性签名
                            //头像图片uri 唯一标示 保存最大分辨率的那个
                            .set("avatar_larger_uri",authorJson.getJSONObject("avatar_larger")==null?null:
                                    authorJson.getJSONObject("avatar_larger").getStr("uri"))
                            //头像图片url 主机+uri 保存最大分辨率的那个
                            .set("avatar_larger_url_list",authorJson.getJSONObject("avatar_larger")==null?null:
                                    authorJson.getJSONObject("avatar_larger").getJSONArray("url_list")==null?null:
                                            authorJson.getJSONObject("avatar_larger").getJSONArray("url_list").getStr(0))
                            .set("birthday",authorJson.getStr("birthday"));//生日
                    System.out.println("作者信息: "+JSONUtil.formatJsonStr(JSONUtil.toJsonStr(author)));
                    //考虑到抖音视频非常多,单机不可能爬取完全部,所以该爬虫天然作为分布式,每一个客户端启动,都是整个爬虫的一部分
                    //每个爬虫互联帮助,一起下载,加快下载速度
                    //信息分布式共享
                    //todo
                }


                //音频信息
                JSONObject musicJson = object.getJSONObject("music");
                if(musicJson!=null){
                    Entity music = Entity.create()
                            .set("id",musicJson.getStr("id"))//id
                            .set("title",musicJson.getStr("title"))//标题
                            .set("author",musicJson.getStr("author"))//作者
                            .set("album",musicJson.getStr("album"))//专辑
                            //音乐uri 唯一标识 只保留最大的那张
                            .set("play_url_uri",musicJson.getJSONObject("play_url")==null?null:
                                musicJson.getJSONObject("play_url").getStr("uri"))
                            //音乐url
                            .set("play_url_url_list",musicJson.getJSONObject("play_url")==null?null:
                                    musicJson.getJSONObject("play_url").getJSONArray("url_list")==null?null:
                                            musicJson.getJSONObject("play_url").getJSONArray("url_list").getStr(0))
                            //高清图uri 唯一标识 只保留最大的那张
                            .set("cover_hd_uri",musicJson.getJSONObject("cover_hd")==null?null:
                                    musicJson.getJSONObject("cover_hd").getStr("uri"))
                            //高清图url 只存最大的图
                            .set("cover_hd_url_list",musicJson.getJSONObject("cover_hd")==null?null:
                                    musicJson.getJSONObject("cover_hd").getJSONArray("url_list")==null?null:
                                            musicJson.getJSONObject("cover_hd").getJSONArray("url_list").getStr(0));
                    System.out.println("背景音乐信息: "+JSONUtil.formatJsonStr(JSONUtil.toJsonStr(music)));
                    //考虑到抖音视频非常多,单机不可能爬取完全部,所以该爬虫天然作为分布式,每一个客户端启动,都是整个爬虫的一部分
                    //每个爬虫互联帮助,一起下载,加快下载速度
                    //信息分布式共享
                    //todo

                }

                //视频信息
                JSONObject videoJson = object.getJSONObject("video");
                if(videoJson!=null){
                    Entity video = Entity.create()
                            //视频uri 唯一标识 只保留最高清的那个
                            .set("play_addr_uri",videoJson.getJSONObject("play_addr")==null?null:
                                    videoJson.getJSONObject("play_addr").getStr("uri"))
                            //高清视频url 只存最高清那个
                            .set("play_addr_url_list",videoJson.getJSONObject("play_addr")==null?null:
                                    videoJson.getJSONObject("play_addr").getJSONArray("url_list")==null?null:
                                            getUrl(videoJson.getJSONObject("play_addr").getJSONArray("url_list")))
                            //动态图uri 唯一标识 只保留最高清的那个
                            .set("dynamic_cover_uri",videoJson.getJSONObject("dynamic_cover")==null?null:
                                    videoJson.getJSONObject("dynamic_cover").getStr("uri"))
                            //动态图uil 只存最高清那个
                            .set("dynamic_cover_url_list",videoJson.getJSONObject("dynamic_cover")==null?null:
                                    videoJson.getJSONObject("dynamic_cover").getJSONArray("url_list")==null?null:
                                            videoJson.getJSONObject("dynamic_cover").getJSONArray("url_list").getStr(0))
                            //视频封面图uri 唯一标识 只保留最高清的那个
                            .set("origin_cover_uri",videoJson.getJSONObject("origin_cover")==null?null:
                                    videoJson.getJSONObject("origin_cover").getStr("uri"))
                            //视频封面图uil 只存最高清那个
                            .set("origin_cover_url_list",videoJson.getJSONObject("origin_cover")==null?null:
                                    videoJson.getJSONObject("origin_cover").getJSONArray("url_list")==null?null:
                                            videoJson.getJSONObject("origin_cover").getJSONArray("url_list").getStr(0));;
                    System.out.println("视频信息: "+JSONUtil.formatJsonStr(JSONUtil.toJsonStr(video)));
                    //考虑到抖音视频非常多,单机不可能爬取完全部,所以该爬虫天然作为分布式,每一个客户端启动,都是整个爬虫的一部分
                    //每个爬虫互联帮助,一起下载,加快下载速度
                    //信息分布式共享
                    //todo
                    //下载视频
                    HttpResponse response = HttpRequest.get(video.getStr("play_addr_url_list")).execute();
                    if(response.getStatus()==302){
                        String location = response.header("location");
                        HttpUtil.downloadFile(location,absolutePath+video.getStr("dynamic_cover_uri")+".mp4");
                        System.err.println(absolutePath+video.getStr("dynamic_cover_uri")+".mp4"+ "下载成功!!!");
                    }else {
                        HttpUtil.downloadFile(video.getStr("play_addr_url_list"),absolutePath+video.getStr("dynamic_cover_uri")+".mp4");
                    }

                }

            }
        }


    }

    /**
     * 获得url列表中可以浏览器访问的那个url
     * 即:包含api.amemv.com 信息的url
     * @param jsonArray
     * @return
     */
    private static String getUrl(JSONArray jsonArray) {
        for(int i = 0;i<jsonArray.size();i++){
            if(jsonArray.getStr(i).contains("api.amemv.com")){
                return jsonArray.getStr(i);
            }
        }
        return null;
    }


}

 

转载于:https://my.oschina.net/sprouting/blog/2992808