缘由
今天搜FAGNHUA电影种子,只找到了一个在线播放的,并没有提供下载入口。这两天刚好又学了点前端知识,心血来潮想找出视频源地址给下下来。
分析过程
在线播放地址:http://www.a2dy.com/?m=vod-play-id-47671-src-2-num-1.html
- 首先查看源代码
view-source:http://www.a2dy.com/?m=vod-play-id-47671-src-2-num-1.html
查找半天没翻出什么特别有价值的东西,仅仅提取出了播放器的url:https://v.xw0371.com/share/9EXBXQjkVAmIUE3l/token/tp8WpqXSJm ,其源码中有这么一段:
<script type="text/javascript">
var hosts = '';
var redirecturl = "v.xw0371.com";
var videoid = "9EXBXQjkVAmIUE3l";
var requestToken = "tpq1jexWs8";
var id = '9EXBXQjkVAmIUE3l'
var l = ''
var r= ''
var t= '15'
var d= ''
var u= ''
var pic = "//20171211/LorzMaNV/1.jpg";
</script>
<script type="text/javascript" src="/html/js/share.js" charset="utf-8"></script>
这里面是一段请求参数,里面token、视频 id 什么的都在里面了。一通拼接也没获取到什么信息,于是进一步看了js代码: https://v.xw0371.com/html/js/share.js :
function init() {
$.get("/token/" + requestToken, function (data, status) {
if (data && data.main) {
//call play
play(data.main, data.xml)
}
});
}
function play(main, xml) {
var hostname = window.location.hostname
var port = window.location.port || '80';
var picurl = window.location.protocol + "//" + window.location.host + pic;
var url = window.location.protocol + "//" + window.location.host + main
xml = window.location.protocol + "//" + window.location.host + xml
var flashvars = {
f: '/html/m3u8.swf',
a: url,
xml: xml,
s: 4,
i: picurl,
id: id,
l: l,
r: r,
t: t,
d: d,
u: u,
c: 0,
my_url: encodeURIComponent(window.location.href),
my_title: encodeURIComponent(document.title),
p: 1,
e: 0,
loaded: 'loadedHandler'
};
var params = { bgcolor: '#FFF', allowFullScreen: true, allowScriptAccess: 'always' };
var video = [url + '->video/m3u8'];
CKobject.embed('/html/ckplayer/ckplayer.swf', 'a1', 'ckplayer_a1', '100%', '100%', false, flashvars, video, params);
}
从代码中可以看到,先是通过get请求 /token/ + requestToken 获取到了两个参数:
{"xml":"/ppvod/MpU1a0lg","main":"/ppvod/yeQQMzuL.m3u8"}
然后又经过一些拼接添加一些参数后交给播放器播放了,虽然我并不知道内部对这些参数做了什么处理,但是我知道通过这些参数是足以获取视频资源的。
- 抓包
源码看得差不多了,接下来尝试抓包看看能不能找出什么线索。播放url采用的是HTTPS 协议,但是我发现改成HTTP 也可以,这样方便抓包。
从抓包信息中可以清晰地看到,在通过 get{ /token/ + requestToken} 拿到那两个参数后又通过这两个参数请求了一些数据:
再进一步看
在通过 http://v.xw0371.com/ppvod/qL6CFgYb.m3u8 拿到一个ts文件列表后,然后将其下下来。不难想到这个列表应该是视频片段,接下来要做的便是将这些片段下下来拼接起来。
解决方案
通过搜索以及获取到的数据,将关键词锁定到了 “m3u8”。之前并没有做过相关开发,不知道这是什么,查看了维基百科解释如下:
The Unicode version of M3U is M3U8, which uses UTF-8-encoded characters. M3U8 files are the basis for the HTTP Live Streaming (HLS) format originally developed by Apple to stream video and radio to iOS devices, and which is now a popular format for Dynamic Adaptive Streaming over HTTP (DASH) in general.
既然 m3u8 是苹果一种推出的一种编码格式,那也按理说应该有成熟的下载解决方案。通过对比,发现使用 ffmpeg 工具是最为方便的,语法如下:
ffmpeg -i "m3u8列表url" -c copy "给视频取个名字.mp4"
可以清晰地看到时间轴,非常方便。