read.html5.qq.com,从QQ浏览器缓存文件中提取出完整的视频

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

2018-09-17

linux系统解决方案,mac应该也可以https://github.com/lxhao/merge_video_cache

1、 本实验以安卓手机QQ浏览器为例,随便打开一个视频进行在线观看,点击缓存按钮缓存当前视频。

121052587_1_20180105051830737

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/视频/ .1

121052587_2_20180105051830955

视频-2.m3u8的内容:

121052587_3_2018010505183133

3、现在我们拿到了缓存文件,只要把ts缓存文件解密并合并就是原来的视频文件了,但这个ts格式的视频文件对一般的播放器都不怎么友好,需要再进行一次格式转换。转换之前,我们还需要做一件事情,我们知道”视频-2.m3u8”里面保存了ts文件和秘钥的路径,但这个路径是相对于手机上的,现在文件拷贝到了电脑上,那么”视频-2.m3u8”里面的路径也要替换为电脑上面额路径,缓存文件和”视频-2.m3u8”在同一个目录下面,直接用文本编辑器打开文件用全局替换把“file:///storage/emulated/0/QQBrowser/视频/” 去掉就好了,替换以后是下图这样子。

121052587_4_20180105051831596

4、最后对ts缓存文件进行合并,大神给了一份现成的python代码,直接贴上来吧。在终端进入到“视频”文件夹下面,把下面的代码拷贝到“t.py”文件中。这是python的代码,需要python的环境,windows安装python2.7http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738150500472fd5785c194ebea336061163a8a974000 linux和mac自带python2.x(好像吐槽windows,装个软件好烦),然后运行 python t.py 视频-2.m3u8 进行缓存文件合并。执行成功后会生成一个“视频-2.ts”的文件,这个文件就是完整的视频文件,有的播放器直接可以播放ts文件,但如果要更方便,需要进行视频文件格式转换。

import sys, osimport shutilfrom Crypto.Cipher import AESdef 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 outif __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)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

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的。

<

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

http://www.pinlue.com/style/images/nopic.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值