某网视频下载
之前在請求中找m3u8文件下載下來發現是花屏的, 百度搜了一下, 有大佬指出了未加密的視頻地址, 如下:
m3u8文件內容如下:
#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=460800, RESOLUTION=480x270 /asp/hls/450/0303000a/3/default/0e24ce8009ad4c22a4a9858cb1411c67/450.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=870400, RESOLUTION=640x360 /asp/hls/850/0303000a/3/default/0e24ce8009ad4c22a4a9858cb1411c67/850.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1228800, RESOLUTION=1280x720 /asp/hls/1200/0303000a/3/default/0e24ce8009ad4c22a4a9858cb1411c67/1200.m3u8咱們肯定下載1280×720的, 所以可以將這個文件前面幾個都去掉, 并且將相對路徑補充成完整的路徑如下:
#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1228800, RESOLUTION=1280x720 https://hls.cntv.myhwcdn.cn/asp/hls/1200/0303000a/3/default/0e24ce8009ad4c22a4a9858cb1411c67/1200.m3u8然后隨便找一個下載器, 拖進去下載就行了
每次手動找很麻煩, 就想著自動化生成最終的m3u8文件然后拖進下載器, 在懶點就可以自己寫一下多線程下載器, 或者調用下載器的接口, 這里我就不實現了
首先看這個請求
https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do GET pid: 0e24ce8009ad4c22a4a9858cb1411c67 client: flash im: 0 tsp: 1665059817 vn: 2049 vc: AAFBC06B8F35DDB5CFF9AC6390A8B62C uid: 45136B6D4A17996F0C3AF8524655DA12 wlan:下面就開始棧回溯找參數咋來的,很容易就找到了
-
pid
這個就在頁面內, 正則提取就行了
-
clent固定是flash
-
im固定是0
-
tsp
js: (new Date).getTime().toString().slice(0, 10) python: str(int(time.time() * 1000))[:10] -
vn固定是2049
-
uid是瀏覽器環境, 菜雞沒找到實現, 發現固定也可以45136B6D4A17996F0C3AF8524655DA12
-
vc
js: md5(tsp + "2049" + vodh5player.VDN_AD_STATIC_CHECK + uid).toUpperCase() python: hashlib.md5((tsp + "2049" + VDN_AD_STATIC_CHECK + uid).encode()).hexdigest().upper()
然后請求就行了, 之后提取m3u8地址, 修改m3u8得到新的文件, 拖入下載器, 完整代碼:
import sys import re import time import json import requests import hashlibdef main():# 判斷命令行參數if (len(sys.argv) != 2):print("[-] 命令行參數輸入錯誤")sys.exit()# 獲取目標urltarget_url = sys.argv[1]session = requests.session()headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"}session.headers.update(headers)# 獲取視頻guid, 也就是請求參數中的pidresponse = session.get(target_url).content.decode('utf-8')pid = re.findall(r'var guid = "(.*?)";', response)[0]# 構造tsptsp = str(int(time.time() * 1000))[:10]# 獲取VDN_AD_STATIC_CHECKvodplayer_url = "https://js.player.cntv.cn/creator/vodplayer.js"response = session.get(vodplayer_url).content.decode("utf-8")VDN_AD_STATIC_CHECK = re.findall(r'var staticCheck = "(.*?)";', response)[0]# 構造vcuid = "45136B6D4A17996F0C3AF8524655DA12"vc = hashlib.md5((tsp + "2049" + VDN_AD_STATIC_CHECK + uid).encode()).hexdigest().upper()# 獲取視頻信息getHttpVideoInfo_url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do"data = {"pid": pid,"client": "flash","im": "0","tsp": tsp,"vn": "2049","vc": vc,"uid": uid,"wlan": ""}response = session.get(getHttpVideoInfo_url, params=data).content.decode('utf-8')# 獲取m3u8地址, 提取1280x720video_info = json.loads(response)video_url = video_info["hls_url"]video_name = video_info["title"] + '.m3u8'main_m3u8 = session.get(video_url).content.decode('utf-8').split('\n')new_m3c8 = main_m3u8[0] + '\n' + main_m3u8[-3] + '\n' + re.findall(r'(.*?.com)/', video_url)[0] + main_m3u8[-2]with open(video_name, "w") as f:f.write(new_m3c8)if __name__ == '__main__':main()演示如下:
總結
- 上一篇: 纯红——三色配色篇
- 下一篇: 三菱PLC定位控制2