一个抖音视频下载代码
程序员文章站
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
上一篇: python在线合成并播放语音