脑洞谈不上,相比各位的小工具我的也简单了一些。
在某个无人的深夜,
我打开某个外国网站的文化毒瘤的时候,
突发一个想法,
如果用程序自动把上面的视频抓下来,岂不是美滋滋?
探索异国文化
话不多说,F12打开控制台,在播放视频的div标签里面找到这样一行代码:
video=http://*******/20170713/eo2lSVtk/hls/index.m3u8
访问该路径之后下载下来的是一个.m3u8后缀的文件
打开之后呢竟然是一堆这种东西
#EXTINF:8.174833,
SmOBSsZo8089001.ts
#EXTINF:14.748067,
SmOBSsZo8089002.ts
#EXTINF:3.903900,
SmOBSsZo8089003.ts
#EXTINF:10.643967,
SmOBSsZo8089004.ts
#EXTINF:12.412400,
SmOBSsZo8089005.ts
竟然...是一堆这种东西...难道还是加密后的视频?这也不对啊,一个才几kb
百度之后才发现这个这个东西是一个索引M3U8文件是指UTF-8编码格式的M3U文件。
M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。
这样问题就来了,我在html页面上并没有找到存放视频的url地址,在m3u8文件中也没有找到地址。
到这里我思考了一下,觉得只有一个可能就是通过发请求的方式,把切成一段一段的视频加载进来,所以立马去看一下请求了哪些数据
通过查看页面发送的请求,可以看到确实是一段段的加载进来的。
这时候重点就来了
我只需要根据m3u8文件解析出一个视频每段的索引,然后把url拼接,就可以下载到所有的片段
研究异国文化
首先第一步就是要解析m3u8文件
这里只需要根据每行的数据读取,如果不包括"#"这个字符就是我们想要的索引
然后把所有的索引放到一个list中
public static List read(String filePath){
List lists = new ArrayList();
try{
File file = new File(filePath);
if(file.isFile() && file.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(read);
String lineText = null;
while((lineText = bufferedReader.readLine()) != null){
if(!lineText.contains("#")){
lists.add(lineText);
System.out.println(lineText);
}
}
read.close();
}else{
System.out.println("找不到指定文件");
}
}catch (Exception e) {
System.out.println("读取出错");
e.printStackTrace();
}
return lists;
}
然后就要拼接url通过java的输入输出流进行下载了
public static void download(List lists) {
try{
String url = "";
InputStream inputStream;
for(int i=0 ;i
url = "*****" + lists.get(i);
URL net = new URL(url);
File saveDir = new File("****");
if(!saveDir.exists()){
saveDir.mkdirs();
}
InputStream in = net.openStream();
FileOutputStream fo = new FileOutputStream(new File("****"+ lists.get(i)));
byte[] buf = new byte[1024];
int length = 0;
System.out.println("开始下载:" + url);
while ((length = in.read(buf, 0, buf.length)) != -1) {
fo.write(buf, 0, length);
}
in.close();
fo.close();
System.out.println("下载完成");
}
}catch (Exception e) {
System.out.println("下载失败");
e.printStackTrace();
}
System.out.println("全部任务下载完成");
}
然后运行我们的程序,你就会看到几百个小的文件被下载下来,
在控制台中可以看到下面的场景
整理异国文化
下载之后有一个小小的问题,就是下载下来是几百个.ts结尾的文件,我们需要整理成一个文件
这时候我们就需要命令行工具了!
打开命令行
copy /b F:\f\*.ts E:\f\new.ts”
这样就可以把原文件合并成一个文件
这里要注意命名的方式要规律!因为我们直接从服务器上下载下来的文件,所以命名是规律的
最后效果图如下:
嗯,
为了我们祖国的花朵健康成长,
已经随手举报了该网站,
我是雷锋。