从QQ浏览器缓存文件中提取出完整的视频

原文地址为: 从QQ浏览器缓存文件中提取出完整的视频

linux系统解决方案,mac应该也可以 https://github.com/lxhao/merge_video_cache
1、 本实验以安卓手机QQ浏览器为例,随便打开一个视频进行在线观看,点击缓存按钮缓存当前视频。
这里写图片描述

2、视频缓存完成后,缓存文件会保存在“/sdcard/QQBrowser/视频”下面,接下来我们把整个视频文件夹拷贝出来,进行格式转换。下图是我把缓存文件拷贝到电脑上后看到的内容,下载的视频为多个ts文件,保存在“.13b”这个目录下面,其中“.b7a”是另一个缓存视频的文件,“视频-2.m3u8”保存了缓存文件的路径和AES密钥,我们打开这个文件看一下,里面其实就是保存了ts文件的路径,AES其实是对应ts文件的密钥。那现在要考虑如何把文件从手机拷贝出来,这时候需要adb工具了,adb工具的安装,win系统http://blog.csdn.net/zhaodezhong/article/details/6726982
mac :
brew install android-platform-tools
ubuntu :

sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install android-tools-adb android-tools-fastboot

安装成功后,在终端(windows打开终端按住windows+r,输入cmd)运行adb devices 验证是否成功连接手机,(windows可能要安装驱动,整个360手机助手会自动安装的,linux下不需要安装驱动,毕竟是亲爹),运行如下命令拷贝缓存文件到当前路径

adb pull /sdcard/QQBrowser/视频/ .

这里写图片描述

视频-2.m3u8的内容:
这里写图片描述
3、现在我们拿到了缓存文件,只要把ts缓存文件解密并合并就是原来的视频文件了,但这个ts格式的视频文件对一般的播放器都不怎么友好,需要再进行一次格式转换。转换之前,我们还需要做一件事情,我们知道”视频-2.m3u8”里面保存了ts文件和秘钥的路径,但这个路径是相对于手机上的,现在文件拷贝到了电脑上,那么”视频-2.m3u8”里面的路径也要替换为电脑上面额路径,缓存文件和”视频-2.m3u8”在同一个目录下面,直接用文本编辑器打开文件用全局替换把“file:///storage/emulated/0/QQBrowser/视频/” 去掉就好了,替换以后是下图这样子。
这里写图片描述
4、最后对ts缓存文件进行合并,大神给了一份现成的python代码,直接贴上来吧。在终端进入到“视频”文件夹下面,把下面的代码拷贝到“t.py”文件中。这是python的代码,需要python的环境,windows安装python2.7 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738150500472fd5785c194ebea336061163a8a974000 linux和mac自带python2.x(好像吐槽windows,装个软件好烦),然后运行 python t.py 视频-2.m3u8 进行缓存文件合并。执行成功后会生成一个“视频-2.ts”的文件,这个文件就是完整的视频文件,有的播放器直接可以播放ts文件,但如果要更方便,需要进行视频文件格式转换。

import sys, os

import shutil
from Crypto.Cipher import AES

def parse_m3u8_file(m3u8_file):
    with open(m3u8_file, 'rb') as fp:
        current_line = fp.readline().rstrip('\n')
        while (current_line):
            if current_line.startswith('#EXT-X-KEY'):
                comps = current_line.split(',')
                URI = comps[1][5:-1]
                IV = comps[2][5:].rstrip('\n')
                with open(URI, 'rb') as urifp:
                    KEY = urifp.readline().rstrip('\n')
                fp.readline()
                ts_file = fp.readline().rstrip('\n')
                yield (IV, KEY, ts_file)
            current_line = fp.readline()

def decrypt(ciphertext, key, iv):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = cipher.decrypt(ciphertext[AES.block_size:])
    return plaintext.rstrip(b"\0")

def decrypt_aes_128_ts_file(iv, key, ts_file):
    print(iv, key, ts_file)
    out = ts_file[:-2]+'.tsd'
    if os.path.exists(out):
        return out
    with open(ts_file, 'rb') as fo:
        ciphertext = fo.read()
    dec = decrypt(ciphertext, key, iv.decode('hex'))
    with open(out, 'wb') as fo:
        fo.write(dec)
    return out

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('Usage: python %s m3u8_file' % sys.argv[0])
        sys.exit(1)

    m3u8 = sys.argv[1]
    if not os.path.exists(m3u8) or not m3u8.endswith('.m3u8'):
        print('Input file should be a m3u8 file.')
        sys.exit(1)

    tsd_files = []
    for (iv, key, ts_file) in parse_m3u8_file(m3u8):
        tsd_files.append(decrypt_aes_128_ts_file(iv, key, ts_file))

    with open(m3u8[:-4]+'ts', 'wb') as merged:
        for ts_file in tsd_files:
            with open(ts_file, 'rb') as mergefile:
                shutil.copyfileobj(mergefile, merged)

5、视频文件格式装换,这里有一个在线转换的网站 https://cloudconvert.com/ts-to-mp4 (这个省事,终于不要windows,linux,mac了)。在线转换要上传和下载文件非常耗时,线下可以用狸窝装换http://www.leawo.cn/space-627-do-thread-id-32121.html或者ts格式转换器http://www.leawo.cn/ND_upload.php?do=info&id=2558,这个貌似只有windows的。


转载请注明本文地址: 从QQ浏览器缓存文件中提取出完整的视频
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值