仅限于学习交流,请勿用于非法用途,否则产生的后果与本人无关!
还有,年轻人请培养高尚的情操
周末晚上,看到群里这么一条消息
心想这他喵的什么娇贵视频,还值50块钱1条,所以就好奇点击了链接看了下
好家伙,差点流鼻血了
这少儿不宜的画面,,,,,,
后来发布这个信息的兄弟马上就被群主给踢了,给群主点赞,哈哈哈哈
随便点点发现基本上都是会员才能观看,比较好奇,想着看能不能找找什么bug之类的,就有了下面的故事
首先是要登录,这里就随便注册了一个账号(这里注册账号是需要用到邮箱,但是他没有进行验证,因此随便输入个邮箱便完成了注册)
发现基本上都是要充钱才能观看:
点击试看也只有大约30秒左右的时间:
然后在点击试看的时候抓包发现有趣的参数:
这里有个segments,据我所知,中文意思是片段,那就把它改空,然后发过去
我去,就很离谱。。。。。
好的,50块钱1条的视频就免费搞定了。
我以为我要收工了,突然发现,这是没有下载链接的,想到最近学习的爬虫,就兴趣来了研究研究是如何下载
百度一下发现这种是动态加载ts文件来显示,请求完不停的加载ts片段来执行播放动作
因此重新编辑请求重发,修改segments参数
可以看到响应的文件大小不一样了,已经加载出了全部的ts 片段地址
但是下载单个ts文件后发现内容被加密了,无法直接播放,可以看出这里是加密了的,但是这里的key的地址却暴露了
接着就是批量下载并解密,然后将所有的解密后ts文件进行合并
# 作者:juju
# 日期:2021/9/27 18:57
import os
import requests
from Cryptodome.Cipher import AES
def get_ts_key(url):
# 获取ts片段和key
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
}
response = requests.get(url=url, headers=headers)
return response.content
if __name__ == '__main__':
url = '*********************************'
# 解析获取的m3u8文件
with open(r'C:\Users\juju\Desktop\result.txt', 'rb+') as f:
txt = f.readlines()
f.close()
os.chdir(r'C:\Users\juju\Desktop\new')
urls = []
key = ''
# 下载key并初始化解密
for line in txt:
# print(type(line))
if 'URI' in line.decode():
key = line.decode().split(',')[1].split('"')[1]
key = get_ts_key(url+key)
cryptor = AES.new(key=key, mode=AES.MODE_CBC)
break
# 提取全部ts链接
for line in txt:
if line.decode()[0] == '/':
urls.append(line.decode().replace('\r\n', ''))
# 将全部提取的ts链接写到本地
for i, line in enumerate(urls[:40]):
with open(str(i + 1) + '.ts', 'wb') as file:
file.write(cryptor.decrypt(get_ts_key(url+line))) # 将解密后的视频写入文件
print('正在写入第{}个文件'.format(i + 1))
# 将全部ts片段写入本地mp4文件
target = open(r'C:\Users\juju\Desktop\new.mp4', "ab+")
# 依次将数据写入目标文件
for i, temp in enumerate(os.listdir(r'C:\Users\juju\Desktop\new')):
print('正在合并第{}个文件'.format(i + 1))
temp_file = open(str(i+1) + '.ts', "rb+")
target.write(temp_file.read())
temp_file.close()
target.close()
因为只是测试代码,所以就限定了部分片段
可以看到全部已经合成完毕
结束
本次记录仅用来探讨学习相关技术,请勿从事其他非法活动。