小鹅通视频下载
注:内容只做分享,可以用来将自己购买的付费课程下载到本地,不得用作他用,如有侵权,联系删除!
课程列表页
登录后,进入课程列表页,如图:
课程列表页接口:
https://app5vfffdhz8371.pc.xiaoe-tech.com/xe.course.business.column.items.get/2.0.0
请求接口返回的单个json如下:
{
"app_id": "app5vfffdhz8371",
"resource_id": "v_6581a404e4b04c1009401d50",
"resource_type": 3,
"resource_title": "1、24年--考试介绍、学习说明",
"is_try": 0,
"part_try_length": 0,
"can_view": 0,
"start_at": "2023.12.19",
"interval_start_at": "",
"view_count": 21553,
"jump_url": "/content_page/eyJ0eXBlIjoyLCJyZXNvdXJjZV90eXBlIjozLCJyZXNvdXJjZV9pZCI6InZfNjU4MWE0MDRlNGIwNGMxMDA5NDAxZDUwIiwicHJvZHVjdF9pZCI6InBfNWZiY2M0NmJlNGIwNGRiN2MwOTBhNDRkIiwiYXBwX2lkIjoiYXBwNXZmZmZkaHo4MzcxIn0",
"img_url_compressed": "http://wechatapppro-1252524126.file.myqcloud.com/app5vfffdhz8371/image/compress/414320361khvvun810fzglrpyhje.jpg",
"img_url": "http://wechatapppro-1252524126.file.myqcloud.com/app5vfffdhz8371/image/khvvun810fzglrpyhje.jpg",
"learn_progress": 98
}
通过课程列表页接口获取resource_id和title,以及视频个数,计算得到页码,129个视频7页。
其中jump_url字段经过了base64编码,通过 在线base64 解码还原如下:
{“type”: 2, “resource_type”: 3, “resource_id”: “v_6581a404e4b04c1009401d50”,
“product_id”: “p_5fbcc46be4b04db7c090a44d”, “app_id”: “app5vfffdhz8371”}
通过如下代码,可以保存一份课程列表到本地txt文件
def get_course_list(page=1):
"获取课程目录列表"
url = 'https://app5vfffdhz8371.pc.xiaoe-tech.com/xe.course.business.column.items.get/2.0.0'
json_data = {
'column_id': 'p_5fbcc46be4b04db7c090a44d',
'page_index': page,
'page_size': 20,
'content_app_id': None,
'sort': 'desc'
}
response = requests.post(
url=url,
cookies=cookies,
headers=headers,
json=json_data,
)
res_list = response.json().get("data").get("list")
dic = {}
for info in res_list:
title = info.get("resource_title") # 1、24年--考试介绍、学习说明
resource_id = info.get("resource_id") # v_6582f557e4b064a8ccb1ef10
print(title, resource_id)
dic.update({resource_id: title})
with open("course_list.txt", "a") as f:
f.write(title + " " + resource_id)
f.write("\n")
return dic
跳转到视频首页
点击课程列表中的某节课程,进入会请求一个detail_info接口,
https://app5vfffdhz8371.pc.xiaoe-tech.com/xe.course.business.video.detail_info.get/2.0.0,这个接口包含video_url的信息,但是被编码过了,不熟悉这段字符串的就会被卡住:
解码代码示例:
import base64,json
video_urls ="W$siZGVmaW5pdGlvbl9uYW@lIjoiXHU5YWQ%XHU#ZTA@IiwiZGVmaW5pdGlvbl9wIjoiNzIwUCIsInVybCI6Imh0dHBzOlwvXC9jLXZvZC5ody@jZG%ueGlhb#Vrbm9$LmNvbVwvOTc#NGE$YTV#b#R0cmFuc#d6cDEyNTI@MjQxMjZcLzI$Zjg#OThlMzI$MDgzNTAxNDEwODIyMDEyOFwvZHJtXC9#LmY0MjEyMjAubTN@OD9zaWduPWUzZjhlNGIxMTczYmI0MmM%ZDdmOTVmYTZmODViYmYxJnQ9NjYxMzJjZGEmdXM9aWJreUFISFNkRSIsImlzX$N@cHBvcnQiOmZhbHNlLCJleHQiOnsiaG9zdCI6Imh0dHBzOlwvXC9jLXZvZC5ody@jZG%ueGlhb#Vrbm9$LmNvbSIsInBhdGgiOiI5NzY0YTdhNXZvZHRyYW5zZ$pwMTI@MjUyNDEyNlwvMjdmODY5OGUzMjcwODM@MDE0MTA%MjIwMTI%XC9kcm0iLCJwYXJhbSI6InNpZ#%9ZTNmOGU0YjExNzNiYjQyYzhkN#Y5NWZhNmY%NWJiZjEmdD0#NjEzMmNkYSZ@cz@pYmt5QUhIU#RFIn@9XQ==__ba"
def video_url_decrypt(video_urls):
"""视频地址json解密"""
s = video_urls.replace('@', '1').replace('#', '2').replace('$', '3').replace('%', '4').replace('__ba', '')
json_data = base64.b64decode(s.encode('utf-8'))[1:-1]
response = json.loads(json_data)
print(response)
return response
video_url_decrypt(video_urls)
# 解密后的结果:
{'definition_name': '高清', 'definition_p': '720P', 'url': 'https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/27f8698e3270835014108220128/drm/v.f421220.m3u8?sign=e3f8e4b1173bb42d7f95fa6f85bbf1&t=66132cda&us=ibkyAHHSdE', 'is_support': False, 'ext': {'host': 'https://c-vod.hw-cdn.xiaoeknow.com', 'path': '9764a7a5vodtransgzp1252524126/27f8698e3270835014108220128/drm', 'param': 'sign=e3f8e4b1173bb42c8d7f95fa6f85bbf1&t=66132cda&us=ibkyAHHSdE'}}
暂时发现了两种m3u8的视频url链接:
一种是:https://c-vod-hw-k.xiaoeknow.com/asset/c2c93d7741e0116ff2a2db6db677bda9/17c89c7e64670550b186329a91596a0a.m3u8?;
另一种是:
https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/b4c69cde3270835014888025333/drm/v.f421220.m3u8?;
具体解码示例如下:
{
"code": 0,
"msg": "success",
"data": {
"config_data": {
"1": {
"config_name": "",
"is_open": 1,
"config_type": 1
},
"2": {
"config_name": "防拖拽",
"is_open": 0,
"config_type": 2
}
},
"video_urls": "W$siZGVmaW5pdGlvbl9uYW@lIjoiXHU5YWQ%XHU#ZTA@IiwiZGVmaW5pdGlvbl9wIjoiNzIwUCIsInVybCI6Imh0dHBzOlwvXC9jLXZvZC@ody@rLnhpYW9la#5vdy5jb#@cL#Fzc#V0XC9jMmM5M#Q$NzQxZTAxMTZmZjJhMmRiNmRiNjc$YmRhOVwvMTdjODljN#U#NDY$MDU@MGIxODYzMjlhOTE@OTZhMGEubTN@OD9zaWduPWRlMTMzNzAzNzUzYjdkODc#YWQ%YjBjNTU5ZWEwNzQxJnQ9NjYxMmVkOTgmdXM9SFd5QkpWcFdnUyIsImlzX$N@cHBvcnQiOmZhbHNlLCJleHQiOnsiaG9zdCI6Imh0dHBzOlwvXC9jLXZvZC@ody@rLnhpYW9la#5vdy5jb#0iLCJwYXRoIjoiYXNzZXRcL#MyYzkzZDc$NDFlMDExNmZmMmEyZGI#ZGI#NzdiZGE5IiwicGFyYW0iOiJzaWduPWRlMTMzNzAzNzUzYjdkODc#YWQ%YjBjNTU5ZWEwNzQxJnQ9NjYxMmVkOTgmdXM9SFd5QkpWcFdnUyJ9fV0=__ba",
"only_h5_play": 0,
"jump_h5_url": "",
"jump_mini_program_url": "https://wechatapppro-1252524126.cos.ap-shanghai.myqcloud.com/app5vfffdhz8371_v_64ca6246e4b03e4b54e1d596_qr_code.jpg",
"payment_url": "",
"video_player_type": 1,
"is_auto_play": 0,
"is_try": 0,
"product_try_info": {},
"user_last_process_time": 0,
"user_last_process": 0,
"video_info": {
"app_id": "app5vfffdhz8371",
"resource_id": "v_64ca6246e4b03e4b54e1d596",
"video_length": 3761,
"file_name": "14、10大管理基本介绍.mp4",
"video_audio_url": "https://c-vod-hw-k.xiaoeknow.com/asset/ca16d93e4a5a5ec769acf922ab34f02e/e6ae2de5ae8699e88a6864b2924624a3.mp3?sign=dd72602d02c0942b4af8da413794ca9a&t=6612ed98&us=KQHoQUniaw",
"patch_img_url": "https://c-vod-hw-k.xiaoeknow.com/asset/dc11aee6684740f42efa99026721b590/cover/Cover0.jpg?sign=db236b18ec2bcf802cf156bfdbedaea5&t=6612ed98&us=vIETOGErJv",
"patch_img_url_compressed": "https://c-vod-hw-k.xiaoeknow.com/asset/dc11aee6684740f42efa99026721b590/cover/Cover0.jpg?sign=db236b18ec2bcf802cf156bfdbedaea5&t=6612ed98&us=vIETOGErJv",
"can_select": 1,
"is_drm": 1,
"is_transcode": 1,
"is_report_video_status": true,
"resource_type": 3
}
},
"forward_url": ""
}
解析后的结果:{‘definition_name’: ‘高清’, ‘definition_p’: ‘720P’, ‘url’: ‘https://c-vod-hw-k.xiaoeknow.com/asset/c2c93d7741e0116ff2a2db6db677bda9/17c89c7e64670550b186329a91596a0a.m3u8?sign=de133703753b7d876ad8b0c559ea0741&t=6612ed98&us=HWyBJVpWgS’, ‘is_support’: False, ‘ext’: {‘host’: ‘https://c-vod-hw-k.xiaoeknow.com’, ‘path’: ‘asset/c2c93d7741e0116ff2a2db6db677bda9’, ‘param’: ‘sign=de133703753b7d876ad8b0c559ea0741&t=6612ed98&us=HWyBJVpWgS’}}
{
"code": 0,
"msg": "success",
"data": {
"config_data": {
"1": {
"config_name": "xxxx",
"is_open": 1,
"config_type": 1
},
"2": {
"config_name": "防拖拽",
"is_open": 0,
"config_type": 2
}
},
"video_urls": "W$siZGVmaW5pdGlvbl9uYW@lIjoiXHU5YWQ%XHU#ZTA@IiwiZGVmaW5pdGlvbl9wIjoiNzIwUCIsInVybCI6Imh0dHBzOlwvXC9jLXZvZC5ody@jZG%ueGlhb#Vrbm9$LmNvbVwvOTc#NGE$YTV#b#R0cmFuc#d6cDEyNTI@MjQxMjZcL#I0YzY5Y#RlMzI$MDgzNTAxNDg%ODAyNTMzM@wvZHJtXC9#LmY0MjEyMjAubTN@OD9zaWduPTJjZThhM#RiNmJjODY@NDYzYjI5MjFkNTA#NGY%YWRmJnQ9NjYxMmVkOTcmdXM9WWhoZ@RVenpHaSIsImlzX$N@cHBvcnQiOmZhbHNlLCJleHQiOnsiaG9zdCI6Imh0dHBzOlwvXC9jLXZvZC5ody@jZG%ueGlhb#Vrbm9$LmNvbSIsInBhdGgiOiI5NzY0YTdhNXZvZHRyYW5zZ$pwMTI@MjUyNDEyNlwvYjRjNjljZGUzMjcwODM@MDE0ODg%MDI@MzMzXC9kcm0iLCJwYXJhbSI6InNpZ#%9MmNlOGEzZGI#YmM%NjU0NjNiMjkyMWQ@MDY0ZjhhZGYmdD0#NjEyZWQ5NyZ@cz@ZaGhnVFV6ekdpIn@9XQ==__ba",
"only_h5_play": 0,
"jump_h5_url": "",
"jump_mini_program_url": "https://wechatapppro-1252524126.cos.ap-shanghai.myqcloud.com/app5vfffdhz8371_v_659eb843e4b064a8fbe3e7da_qr_code.jpg",
"payment_url": "",
"video_player_type": 1,
"is_auto_play": 0,
"is_try": 0,
"product_try_info": {},
"user_last_process_time": 0,
"user_last_process": 0,
"video_info": {
"app_id": "app5vfffdhz8371",
"resource_id": "v_659eb843e4b064a8fbe3e7da",
"video_length": 8264,
"file_name": "项目管理概论.mp4",
"video_audio_url": "https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/b4c69cde3270835014888025333/v.f1010.mp3?sign=a12738e1246d1b3eb89f2b3848bd48fb&t=6612ed97&us=NnblWUtCYG",
"patch_img_url": "https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/b4c69cde3270835014888025333/coverBySnapshot/coverBySnapshot_10_0.jpg?sign=cc02ff3a17c766c222f30c1e88f7555a&t=6612ed97&us=IHoiutFwdk",
"patch_img_url_compressed": "https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/b4c69cde3270835014888025333/coverBySnapshot/coverBySnapshot_10_0.jpg?sign=cc02ff3a17c766c222f30c1e88f7555a&t=6612ed97&us=IHoiutFwdk",
"can_select": 1,
"is_drm": 1,
"is_transcode": 1,
"is_report_video_status": true,
"resource_type": 3
}
},
"forward_url": ""
}
解析后的结果:
{‘definition_name’: ‘高清’, ‘definition_p’: ‘720P’, ‘url’: ‘https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/b4c69cde3270835014888025333/drm/v.f421220.m3u8?sign=2ce8a3db6bc865463b2921d5064f8adf&t=6612ed97&us=YhhgTUzzGi’, ‘is_support’: False, ‘ext’: {‘host’: ‘https://c-vod.hw-cdn.xiaoeknow.com’, ‘path’: ‘9764a7a5vodtransgzp1252524126/b4c69cde3270835014888025333/drm’, ‘param’: ‘sign=2ce8a3db6bc865463b2921d5064f8adf&t=6612ed97&us=YhhgTUzzGi’}}
代码如下:
def video_url_decrypt(video_urls):
"""视频地址json解密"""
s = video_urls.replace('@', '1').replace('#', '2').replace('$', '3').replace('%', '4').replace('__ba', '')
json_data = base64.b64decode(s.encode('utf-8'))[1:-1]
response = json.loads(json_data)
return response
def turn_video_page(name, resource_id='v_6582f557e4b064a8ccb1ef10'):
"""跳转到视频首页,获取视频连接"""
data = {
'resource_id': resource_id,
'opr_sys': 'MacIntel',
'product_id': 'p_5fbcc46be4b04db7c090a44d',
'content_app_id': '',
}
url = 'https://app5vfffdhz8371.pc.xiaoe-tech.com/xe.course.business.video.detail_info.get/2.0.0'
response = requests.post(url=url, cookies=cookies, headers=headers, data=data)
print(response.text)
res = response.json().get("data")
video_url = video_url_decrypt(res.get("video_urls")).get("url") # 加密字符串
with open("m3u8_url_video.txt", "a") as f:
f.write("\n")
f.write(name + " " + video_url)
return video_url
播放视频
视频播放会请求上一步获取的m3u8链接,暂时发现如下两种不同的m3u8链接:
https://c-vod.hw-cdn.xiaoeknow.com/9764a7a5vodtransgzp1252524126/7fdead483270835014004266000/drm/v.f421220.m3u8?sign=9505e15ce9d5f2bf65fe8b83dd4f0e11&t=661329f6&us=ODyDZnnrVl
或
https://c-vod-hw-k.xiaoeknow.com/asset/c2c93d7741e0116ff2a2db6db677bda9/17c89c7e64670550b186329a91596a0a.m3u8?sign=9d8e7d81c70db0a7d4764db4b81eb49c&t=6612efd8&us=QqOVKyIXhZ
分析响应
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://app.xiaoe-tech.com/get_video_key.php?edk=CiBum2HmO%2Bs85zhxDiVCj2dwCRdgkCEO%2F3ZkCiojjj1WCBCO08TAChiaoOvUBCokYjRhNjFiNTgtMmVhNy00OWYxLTgwZGMtZTE0NTIyODc5YWIy&fileId=3270835014108220128&keySource=VodBuildInKMS",IV=0x00000000000000000000000000000000
#EXTINF:2.000000,
v.f421220_0.ts?start=0&end=124095&type=mpegts&sign=a753fc88bb015bd306135970154a7cd2&us=mhECMpvoVw&t=6612d3b2
#EXTINF:2.000000,
v.f421220_0.ts?start=124096&end=222431&type=mpegts&sign=a753fc88bb015bd306135970154a7cd2&us=mhECMpvoVw&t=6612d3b2
#EXTINF:2.000000,
v.f421220_0.ts?start=222432&end=320959&type=mpegts&sign=a753fc88bb015bd306135970154a7cd2&us=mhECMpvoVw&t=6612d3b2
#EXTINF:2.000000,
v.f421220_0.ts?start=320960&end=465727&type=mpegts&sign=a753fc88bb015bd306135970154a7cd2&us=mhECMpvoVw&t=6612d3b2
#EXTINF:2.000000,
8000007_B4KhET5DNsuk_0.ts?t=6612efd8&sign=9d8e7d81c70db0a7d4764db4b81eb49c&us=QqOVKyIXhZ
#EXTINF:2.000000,
8000007_B4KhET5DNsuk_1.ts?t=6612efd8&sign=9d8e7d81c70db0a7d4764db4b81eb49c&us=QqOVKyIXhZ
#EXTINF:2.000000,
8000007_B4KhET5DNsuk_2.ts?t=6612efd8&sign=9d8e7d81c70db0a7d4764db4b81eb49c&us=QqOVKyIXhZ
#EXTINF:2.000000,
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.hw.vod.get/1.0.0?asset_id=47fa29c3d5ee8e7a85d55f6c32b138d9&app_id=app5vfffdhz8371",IV=0x30656262613161656263396135646135
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_0.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_1.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_2.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_3.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_4.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_5.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
8000007_0D3wtWhj836Q_6.ts?t=6615714a&sign=2911a55fe0b3cb273f5ec7380adb6fc6&us=hEwQRJDazZ
#EXTINF:2.000000,
发现对视频内容进行了AES-128加密,附带了关于key的URL以及IV,还有上千段ts链接,可以通过正则提取出来,并将ts链接补充完整:
def get_ts_list(name, video_url):
"获取ts视频列表"
if "asset" in video_url:
base_url = "https://c-vod-hw-k.xiaoeknow.com/asset/" + re.findall(r"asset/(.*)/", video_url, re.S)[0]
else:
base_url = "https://c-vod.hw-cdn.xiaoeknow.com/" + re.findall(r".com/(.*?)/drm", video_url, re.S)[0] + "/drm"
response = requests.get(url=video_url, headers=headers)
# print(response.text) # 获取m3u8内容
key_url = re.findall(r'URI="(.*?)"', response.text, re.S)[0]
iv = re.findall(r'IV=(.*?)\n#EXTINF', response.text, re.S)[0]
ret_list = re.findall(r"000000,\n(.*?)\n#EXTINF", response.text, re.S)
print("ts个数=", len(ret_list))
ts_url_list = []
for index, i in enumerate(ret_list):
ts_url_list.append(base_url + "/" + i) # 完整ts地址列表
return key_url, iv, ts_url_list
下载
解密下载内容,否则下载的ts内容无法播放,解密这里注意iv是32位的,需要转化一下取前16位的,这里展示最基础的下载,可自行使用协程等方式异步加速下载:
from Crypto.Cipher import AES
def down_ts(index, key_url, ts_url, path):
"""
对ts视频进行下载和解密
通过分析m3u8文件,发下解密方法和加密地址
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://app.xiaoe-tech.com/get_video_key.php?edk=CiCaME14wCxpXtrfb9LoHTMOEt%2F%2FBJV%2FU5XCorh9DiDxVRCO08TAChiaoOvUBCokYjRhNjFiNTgtMmVhNy00OWYxLTgwZGMtZTE0NTIyODc5YWIy&fileId=3270835014188149945&keySource=VodBuildInKMS",IV=0x00000000000000000000000000000000
"""
key = requests.get(key_url).content
ts = requests.get(ts_url).content
iv = iv.replace("0x", "")[:16].encode() # 取前16位iv
with open(path + "/{}.ts".format(index), 'wb') as file:
crypto = AES.new(key, AES.MODE_CBC, iv=iv)
file.write(crypto.decrypt(ts))
file.close()
合并
下载了几千个ts视频,有多种合并方式,moviepy,ffmpeg或其它的软件,也可以用最简单的读写
def merge(name='论文写作基本介绍.mp4', path="/Users//Desktop/download"):
"""合并ts视频"""
f0 = open("/Users/tt/Desktop/" + name + ".mp4", 'ab')
print(len(os.listdir(path)))
for i in range(0, len(os.listdir(path))):
print(i)
f1 = open(path + "/{}.ts".format(str(i)), "rb")
f0.write(f1.read())
f1.close()
f0.close()