僅限于學習交流,請勿用于非法用途,否則產生的后果與本人無關!
還有,年輕人請培養高尚的情操
周末晚上,看到群里這么一條訊息

心想這他喵的什么嬌貴視頻,還值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()
因為只是測驗代碼,所以就限定了部分片段



可以看到全部已經合成完畢
結束
本次記錄僅用來探討學習相關技術,請勿從事其他非法活動,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/303882.html
標籤:python
