美文网首页
爬虫:解决视频遇到m3u8加密

爬虫:解决视频遇到m3u8加密

作者: format_b1d8 | 来源:发表于2021-03-02 10:47 被阅读0次

    有时候看电影想珍藏下来,但是有ts文件下载下来播放不了,那么恭喜你遇到视频加密了

    很多网站直接返回一个个ts文件,通过ajax请求挨个返回。有些ts文件是有规律可循的,有些是没有规律可循的,不过一般没有规律的ts文件名,都是在一个叫m3u8这个文件里面的。

    比如这样:

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:13
    #EXT-X-MEDIA-SEQUENCE:0
    
    //这里是注释,真实文件里不会有的,
    //看看你的m3u8文件里有没有这一行,如果有的话,那么恭喜你这个m3u8文件是加密的,请继续往下看
    //如果没有这行的话,特别是没有这个#EXT-X-KEY,那么同样恭喜你,这个m3u8没有加密,你直接就可以下载合并
    #EXT-X-KEY:METHOD=AES-128,URI="http://www.example.com/20210125/key.key"
    #EXTINF:12.5,
    //下面的这个其实才是视频真正的地址,你放在浏览器地址栏上直接回车是可以直接下载的
    //这里还可能出现GBDYO3576000.ts这种情况,其实是把前面的路径省略了,可根据m3u8文件的路径自行加上
    http://www.example.com/20180125/GBDYO3576000.ts
    #EXTINF:12.5,
    http://www.example.com/20180125/GBDYO3576001.ts
    #EXTINF:12.5,
    http://www.example.com/20180125/GBDYO3576002.ts
    

    通过上面的文件内容第五行的红色字体,我们可以看到加密方式是AES-128,而key就是解密钥匙,在里面我们也可以看到该url,如果在里面只有EXT-X-KEY:METHOD=AES-128 ,而即使没有URI,我们也可以在相应中看到一个叫key.key的文件。

    # 获取key  ,二进制流格式
    key=requests.get('http://www.example.com/20210125/key.key').content
    

    好了,我们已经拿到了key值,接下来就是解密逻辑,也很简单:

            # iv是一个二进制字符串,没有明确说明就按照这个写即可,注意位数
            iv=b'0000000000000000'
            # 获取aes对象,key已获取
            cipher = AES.new(key, AES.MODE_CBC, iv)
            # 进行解密,res1就是媒体流(二进制)字符串
            plain_data = cipher.decrypt(res1)
    

    然后接下来我们就开始下载,合并文件即可。

    # AES解密
    import requests
    from Cryptodome.Cipher import AES
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.53'
    }
    # 获取key  ,二进制流格式,key的地址具体网站自己看
    key=requests.get('http://www.example.com/20210125/key.key').content
    # res就是我获取的ts的url组成的列表,直接请求文件地址,使用正则匹配或者其他方式获取都可以
    for i in res:
        try:
            res1 = requests.get(i,timeout=5).content
            iv=b'0000000000000000'
            # 获取aes对象
            cipher = AES.new(key, AES.MODE_CBC, iv)
            # 进行解密
            plain_data = cipher.decrypt(res1)
            with open('合并.ts','ab+') as w:
                w.write(plain_data) # 写入解密后的内容
        except:
            pass
    

    上述代码还是有问题的,一个是太慢,另一个是采用追加的方式写入二进制流数据,容易内存溢出。因为不是工作需要,所以就不完善了,仅用来记录AES加密和视频媒体流的数据获取,欢迎大家指导,改进!

    相关文章

      网友评论

          本文标题:爬虫:解决视频遇到m3u8加密

          本文链接:https://www.haomeiwen.com/subject/qpstqltx.html