仅限于学习交流 请勿用于非法用途 否则产生的后果与本人无关
还有 年轻人请培养高尚的情操
周末晚上 看到群里这么一条消息
心想这他喵的什么娇贵视频 还值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:UsersjujuDesktopresult.txt , rb ) as f:
txt f.readlines()
f.close()
os.chdir(r C:UsersjujuDesktopnew )
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( rn , ))
# 将全部提取的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:UsersjujuDesktopnew.mp4 , ab )
# 依次将数据写入目标文件
for i, temp in enumerate(os.listdir(r C:UsersjujuDesktopnew )):
print( 正在合并第{}个文件 .format(i 1))
temp_file open(str(i 1) .ts , rb )
target.write(temp_file.read())
temp_file.close()
target.close()


