360doc文章提取器

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

文章来源:文章来源 抓取时间:2018-9-1 23:17:31 浏览量:34 作者:360doc 返回文章列表

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

这里写图片描述

视频-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)
  • 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的。  

    下载DOC文档