根据m3u8文件下载视频

视频获取

Posted by 周自横 on March 17, 2020

由m3u8文件获取视频

m3u8文件的组成

M3U8是Unicode版本的M3U文件用UTF-8编码。具体文件详情如图所示。

其中比较有用的部分在于第6行,使用的加密方式为AES-128,密钥地址为URL内容,分段的视频短链名称为第8行第10行所示,此处的分段视频的名称并不是详细路径而是相对的,只有名字。

加密方式长用的还有iv值,表示偏量。此处文件没有,正常位置是在第6行加密方式之后。当然也存在无偏移量和加密的情况。

下载分段视频

在网页请求上观差过分段视频的请求链接,发现组成为返回该M3U8文件请求链接的时候,其中包含的uuid是视频链接其中的一部分,其视频的请求格式为:https://域名地址+uuid+分段视频文件名。所以在获取到M3U8文件之后使用正则获取其中的视频短链名称列表,然后重新组合为地址。

视频的内容获取直接使用GET请求即可,不需要cookie内容,使用wb二进制文件的方式,获取二进制内容使用.content。将分段的视频保存到本地。

将多个短视频组成一整个完整的内容,使用的是命令行命令copy /b *.ts new.ts/b表示是使用二进制的方式。组成新文件的名称可以与之前不一样。在程序里面使用的是os.system()完成命令的执行。

删除分段视频使用del /q *.ts,表示删除所有后缀为.ts的视频,其中参数/q表示删除不需要进行确认。

获取密钥

在文件中标明了文件的加密方式以及密钥地址,但是获取需要cookie值才能获得。

十六进制密钥获取

获取到的内容是二进制的,密钥使用的是十六进制,需要将二进制文件转为十六进制之后,获取其中的密钥。此处使用的是binascii库,对二进制文件与其他格式的文件能进行相互转换。a2b_表示的是其余格式的转为二进制,后面跟的是格式名。b2a_是将二进制转为其他格式的文件。

使用get(url,cookies).content获取到文件内容之后,使用binascii.b2a_hex将二进制文件转为十六进制,得到字节类型的内容,打印出来看到了的是b'xxxxxx'32位长度,其中xxxx这32位的内容为我们所需的内容。使用str()转换是没效果的,所以使用了.decode('utf-8')获取。

解密

使用命令行命令openssl aes-128-cbc -d -in a.ts -out new.ts -nosalt -iv a -K b,其中aiv偏移量b密钥。前面标明了加密方式,输入数据与输出数据。此格式必须保持完整,若是没有偏移量或者是密钥,使用0表示。

程序的使用仍然使用os.system()

最后解密之后又一个提示大概意思是16进制太短什么什么,但是由于对结果没有影响,所以没有进行深究,之后若是完成这部分将会进行补充