本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!q 2766958292
作为遵纪守法的中国公民我有必要提醒大家千万不要恶意爬取网站数据,在学习期间也不可大批量发送网络请求占用公共资源给网站造成负面影响严禁在代码转给给其他人。篇幅较短开始发车。
应该是个uuid,扣webpack就行了很简单。
requestId位置访问aHR0cHM6Ly9rZS5xcS5jb20vY291cnNlL3tjaWR9这个接口然后获取json数据,只需要3个。
course_list=json.loads(script_code)["props"]["pageProps"]["courseInfo"]['catalogMap']
for course in course_list:
package_name = course['sub_id']
resid_list = course['task_info'][0]['resid_list']
file_name = course['name']
m3u8接口:aHR0cHM6Ly9rZS5xcS5jb20vY2dpLXByb3h5L3JlY192aWRlby9kZXNjcmliZV9yZWNfdmlkZW8=
//前缀
prefix = json.loads(response.text)['result']['rec_video_info']['infos'][0]['ts_list'][0]['url'].split('drm')[0]
function getToken(cid,termId){
return _getDrmToken({
"cid": cid,
"termId": termId,
"vod_type": 0,
"platform": 3
})
}
token位置
同时m3u8文件的ts路径需要前缀+原来内容+token。获取token代码如下
cid是课程id,termId课程都有一个而且相同的。
def download_ts(url,key,package_name):
response = requests.get(url['url'])
cipher = AES.new(key, AES.MODE_CBC, b'\x00' * 16)
decrypted_content = cipher.decrypt(response.content)
# 这是单线程
# for url_info in all_urls:
# download_ts(url_info, key,package_name)
# 这是多线程
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
futures = [
executor.submit(download_ts, url_info, key, package_name)
for url_info in all_urls
]
concurrent.futures.wait(futures)
global_executor = ThreadPoolExecutor(max_workers=4)
futures = []
for course in course_list:
package_name = course['sub_id']
resid_list = course['task_info'][0]['resid_list']
file_name = course['name']
future = global_executor.submit(concurrent_downloads, package_name, resid_list, file_name)
futures.append(future)
# 遍历所有任务的结果
for future in concurrent.futures.as_completed(futures):
result = future.result()
global_executor.shutdown(wait=True)
免费代理太慢了就不等了。
1.出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来。
2.本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步。