跳至内容

Jixun's Blog 填坑还是开坑,这是个好问题。

欧乐视频下载分析

准备 #

俗话说的好,磨刀不误砍柴工,万事都得先做准备与计划。

准备工具:

  • 中间人代理,例如 CharlesFiddler Classic 并信任其证书。
  • Chrome / Firefox + 代理扩展,将代理流量转发到反代服务器。
  • youtube-dl 以及搭配使用的 ffmpeg 二进制文件一份。
  • 现代的 JavaScript 代码编辑器,Atom、VSCode 或 WebStorm 均可; 写完发现不需要

环境测试:

  • 确保浏览器能正常将 HTTPS 流量转发至中间人代理并能监视解密后的流量。

开始 #

首先随便挑选一则视频。低调点找个不出名的片,例如《老虎》

观察网络流量,可以发现网站发出了数个媒体请求:

https://europe.olemovienews.com                           <-- 主域名
  \   /hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4  <-- 文件 (分割前)
    | /master.m3u8                                        <-- 主播放列表
    \ /index-v1-a1.m3u8                                   <-- 第一个画质播放列表

接下来的就好办了,直接扔 youtube-dl 看看有没有加密:

$ youtube-dl https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/master.m3u8
[generic] master: Requesting header
[generic] master: Downloading m3u8 information
[download] Destination: master-master.mp4
   ......
[hls @ 000001c512e77180] Skip ('#EXT-X-ALLOW-CACHE:YES')
[hls @ 000001c512e77180] Skip ('#EXT-X-VERSION:6')
[hls @ 000001c512e77180] Opening 'https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/init-v1-a1.mp4' for reading
[https @ 000001c513389200] HTTP error 502 Cannot find server.
[hls @ 000001c512e77180] Failed to open an initialization section in playlist 0
[hls @ 000001c512e77180] Error when loading first segment 'https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/seg-1-v1-a1.m4s'
https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/index-v1-a1.m3u8: Server returned 5XX Server Error reply


ERROR: ffmpeg exited with code 1

竟然出错了。打开抓取的请求回应一看,提示找不到域名…

于是从 Charles 复制 cURL 指令出来到终端执行,请求回应的错误信息一模一样:

从中间人代理复制出来的 cURL 指令执行

于是就随便试了下,把第一个头 Range 给去掉了,发现可以正常下载片段:

去除 Range 头后发现能正常下载

去搜索引擎搜了下 ffmpeg 与 Range 头方面的说明, 发现也有人报告过 Range 头信息而导致 m3u8 下载失败的情况1; 而该追踪贴也提到了一点,即可利用 seekable 参数来关闭这个请求头。

最后就是让 youtube-dl 调用 ffmpeg 的时候传入这个参数了,即:

--external-downloader-args "-http_seekable 0"

因此,最终的下载指令:

youtube-dl \
  --output '老虎.mp4' \
  --external-downloader-args "-http_seekable 0" \
  https://europe.olemovienews.com/hlstimeofffmp4/20200726/vHmIrojb/mp4/vHmIrojb.mp4/master.m3u8

下载后的文件参数如下:

$ mediainfo 老虎.mp4
General
Complete name                            : 老虎.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/avc1/mp41)
File size                                : 487 MiB
Duration                                 : 1 h 25 min
Overall bit rate                         : 799 kb/s
Writing application                      : Lavf58.45.100

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : [email protected]
Format settings                          : CABAC / 4 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 4 frames
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 1 h 25 min
Bit rate                                 : 683 kb/s
Width                                    : 1 280 pixels
Height                                   : 538 pixels
Display aspect ratio                     : 2.40:1
Frame rate mode                          : Constant
Frame rate                               : 24.000 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.041
Stream size                              : 417 MiB (86%)
Color range                              : Limited
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709
Codec configuration box                  : avcC

Audio
ID                                       : 2
Format                                   : AAC LC
Format/Info                              : Advanced Audio Codec Low Complexity
Codec ID                                 : mp4a-40-2
Duration                                 : 1 h 25 min
Bit rate mode                            : Constant
Bit rate                                 : 110 kb/s
Channel(s)                               : 2 channels
Channel layout                           : L R
Sampling rate                            : 48.0 kHz
Frame rate                               : 46.875 FPS (1024 SPF)
Compression mode                         : Lossy
Stream size                              : 67.2 MiB (14%)
Default                                  : Yes
Alternate group                          : 1

获取 m3u8 链接 #

都不用分析,直接看播放器页面的 HTML 代码即可。作为一个 JS 对象塞到了 script 里面。

var player_aaaa={"flag":"play","encrypt":0,"trysee":0,"points":0,"link":"\/index.php\/vod\/play\/id\/20455\/sid\/1\/nid\/1.html","link_next":"","link_pre":"","url":"https:\/\/europe.olemovienews.com\/hlstimeofffmp4\/20200806\/ihrwqdhr\/mp4\/ihrwqdhr.mp4\/master.m3u8","url_next":"","from":"plyr","server":"no","note":"","id":"20455","sid":1,"nid":1}

结论 #

没有加密,没有真正的“高清”,凑合着看没啥问题。

如果是所谓“会员”的高清画质,可能会有加密?没有买会员,就不测试了。


  1. some servers refuse to responde for requests with Range header(header set by ffmpeg): https://trac.ffmpeg.org/ticket/6125  ↩︎

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论区