由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
,其中a
是iv偏移量
,b
是密钥
。前面标明了加密方式,输入数据与输出数据。此格式必须保持完整,若是没有偏移量或者是密钥,使用0表示。
程序的使用仍然使用os.system()
最后解密之后又一个提示大概意思是16进制太短什么什么,但是由于对结果没有影响,所以没有进行深究,之后若是完成这部分将会进行补充