赞
踩
首先找一个视频网站,分析网站:
找到这个iframe的src:
过去看看:
点击观看就发现了多了些东西:
具体分析下:
简单猜测下这个key.key一定是解密的
现在视频服务器地址列表有了,解密的密码有了。可以直接爬视频下来了:
import os import requests import re import time #视频视频地址 pathUrl = 'https://video.dious.cc/20200617/fYdT3OVu/1000kb/hls/index.m3u8' #整个文件夹装 dir = "./dpcq/" if not os.path.exists(dir): os.makedirs(dir) def getVideo(): headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36", } res = requests.get(pathUrl, headers=headers) res.encoding = res.apparent_encoding #拿取视频的全部路径列表 urlList = re.findall(r'\n(.*\.ts)', res.text) print(len(urlList)) count = 0 for item in urlList: #慢慢拿取,假装人为,一共395个文件,没加sleep,我只拿取了170个,加了全拿下来了 time.sleep(6) count += 1 res2 = requests.get(item, stream=True, headers=headers) res2.encoding = res2.apparent_encoding print(res2.status_code) with open(dir + 'demo{}.mp4'.format(str(count)), "wb") as mp4: #边拿边从内存写到硬盘里 for chunk in res2.iter_content(chunk_size=1024 * 1024): if chunk: mp4.write(chunk) if __name__ == '__main__': getVideo()
给爷下来!!
但是。。放不起:
加个解密就完事了:
import os from Crypto.Cipher import AES from Crypto.Util.Padding import pad # 之前key.key文件里的数字 '722c55ff989ded9a' cryptorObj = AES.new(bytes('722c55ff989ded9a'.encode()), AES.MODE_CBC, bytes('722c55ff989ded9a'.encode())) dir = './dpcq/' if __name__ == "__main__": w = open('./video.mp4', "wb") files = os.listdir(dir) # 这里我是demoXXX.MP4命名的, os.listdir读取时随机的,sort排个序 files.sort(key=lambda x: int(x.split('demo')[1][:-4])) print(files) for item in files: fileObj = open(dir + '{}'.format(item), 'rb') fc = fileObj.read() # 最开始没加这个判断会报错 Data must be padded to 16 byte boundary in CBC mode 网上查了下解决方法: if fc and (len(fc) % 16) != 0: # EXT-X-KEY:METHOD=AES-128的加密方式,对应加密的key大小16byte,对应AES.MODE_CBC, # 如果视频大小不是16的倍数,解密时出现:ValueError(“Data must be padded to %d byte boundary in CBC mode” % self.block_size) fc = pad(fc, 16) # 按16的倍数补齐长度 w.write(cryptorObj.decrypt(fc))
over
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。