好友
阅读权限10
听众
最后登录1970-1-1
|
729
发表于 2020-11-23 14:33
本帖最后由 729 于 2020-11-23 19:10 编辑
该源码 获取的是下载地址(免费的课程视频以及课件 付费课程的PDF文件 视频是经过加密的) 没有进行下载 需要下载的可以调用返回的下载地址即可
老实说 我不会排版 也是第一次写分析过程 所以有啥问题就不要见怪了哈
---
获取课程主ID ##课程主页termId
key_id=re.search(r'\d+',re.search(r'id : ".+"',requests.get('课程主页URL').text).group()).group()`
获取视频目录以及ID
payloaddata={'callCount':1,
'scriptSessionId':'${scriptSessionId}190',
'c0-scriptName':'CourseBean',
'c0-methodName':'getMocTermDto',
'c0-id':'a',
'c0-param0':1207358202,##课程目录ID
'c0-param1':0,
'c0-param2':'true',
'batchId':'1605715313492'}
r=requests.post('https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLastLearnedMocTermDto.dwr',data=payloaddata)
r.text #这是获得课程的所有视频的ID以及所有文档的ID
contentType=null##一个章节
contentType=3##获得的是文档
contentType=2##单元测试或其他(反正不是文件)
contentType=1##获取视频
文档下载可直接获得
data={
'callCount':1,
'scriptSessionId':'${scriptSessionId}190',
'c0-scriptName':'CourseBean',
'c0-methodName':'getLessonUnitLearnVo',
'c0-id':0,
'c0-param0':'1214812409',##contentId
'c0-param1':3,
'c0-param2':0,
'c0-param3':'1216200842',##s.x.id
'batchId':'1605720752677',}
url='https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLessonUnitLearnVo.dwr'
r=requests.post('url',data=data) ##取得其中的textOrigUrl即是下载链接
视频地址获取步骤:
1.进入官网获取cookie 其中cookie中的NTESSTUDYSI值是csrfkey值 这是官网防止跨域访问(https://www.icourse163.org)
2.获取对应的signature ('https://www.icourse163.org/web/j/resourceRpcBean.getResourceToken.rpc?csrfKey='+csrfkey)##POST访问
data={'bizId':1260493290,#s.x.id
'bizType':1,
'contentType':1}
3.获取对应的视频m3u8的URL ('https://vod.study.163.com/eds/api/v1/vod/video?videoId='+contentId+'&signature='+signature+'&clientType=1')#GET获取
clienType=1 #按照上面的获取来说应该是一个视频的标志
返回值需要的有:videoUrl 以及ak 里面有好几个videoUrl对应不同的清晰度以及格式
源码
[Python] 纯文本查看 复制代码 #encoding:utf-8
import requests
import re
from requests import Session
import json
class Mooc:
def __init__(self,url):
self.url=url
self.termId=re.search(r'\d+',re.search(r'termId : ".+"',requests.get(url).text).group()).group()
self.__GetAllId()
def __GetAllId(self):
self.dic={}##总字典
dic_con={}##每个小章节字典
file_number=0##每个小章节的文件数
AllId_url='https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLastLearnedMocTermDto.dwr'##返回课程文件ID以及内容ID
payloaddata={'callCount':1,
'scriptSessionId':'${scriptSessionId}190',
'c0-scriptName':'CourseBean',
'c0-methodName':'getMocTermDto',
'c0-id':'a',
'c0-param0':self.termId,##课程目录ID
'c0-param1':0,
'c0-param2':'true',
'batchId':'1605715313492'}##随便啦长度一样的数字吧大概
r=requests.post(AllId_url,data=payloaddata)##
list_re=re.compile(r'contentId=.+').findall(r.text)##将返回的数据进行处理分段
for d in list_re:##遍历每段数据 获取参数值
contentId=re.search(r'contentId=\d+',d)
contentType=re.search(r'\d+',re.search(r'contentType=\d',d).group()).group()##文件格式
file_id=re.search(r'\d+',re.search(r'\.id=\d+',d).group()).group()##文件ID
name=re.search(r'".+"',re.search(r'name=.+"',d).group()).group().encode('utf8').decode('unicode_escape')
if contentId and not re.search(r'isTestChecked',d):##确认是否有内容ID 以及是否是课件或者视频
file_number+=1
contentId=re.search(r'\d+',contentId.group()).group()
dic_con={'contentId':contentId,'contentType':contentType,'file_id':file_id,'name':name}
self.dic[name_all][name_content][file_number]=dic_con
else:
if re.search(r'published=true',d):##大章节的确认
name_all=name##大章节名字
self.dic[name_all]={}
else:
if re.search(r'isTestChecked=false',d):##小章节的确认
name_content=name##小章节名字
file_number=0##小章节文件数量
self.dic[name_all][name_content]={}
#dic格式
#{'第一大章节名':{'第一小章节名':{1(文件数):{'contentId': '课程ID', 'contentType': '文件格式', 'file_id': '文件ID','name':'文件名'},...},
# '第二小章节名':...},
# '第二章大章节名':...}
def GetPdf(self):
pdf_dic={}
Pdf_url='https://www.icourse163.org/dwr/call/plaincall/CourseBean.getLessonUnitLearnVo.dwr'
data={
'callCount':1,
'scriptSessionId':'${scriptSessionId}190',
'c0-scriptName':'CourseBean',
'c0-methodName':'getLessonUnitLearnVo',
'c0-id':0,
'c0-param0':'contentId',##contentId
'c0-param1':3,
'c0-param2':0,
'c0-param3':'文件ID',##文件ID
'batchId':'1606049296413',}
for p in self.dic.items():
for d in p[1].items():
for f in d[1].items():
if f[1]['contentType']=='3':
data['c0-param0']=f[1]['contentId']
data['c0-param3']=f[1]['file_id']
r=requests.post(Pdf_url,data=data) ##取得其中的textOrigUrl即是下载链接
pdf_dic[d[0]]=re.search(r'textUrl:".+"',r.text).group()[9:-1]
return pdf_dic
## pdf_dic格式
## pdf_dic={'PDF文件名':下载地址,...} 返回的是下载地址 没有进行下载 需要的可以自己写一个用来下载的即可
def GetTs(self):
ts_dic={}
s=Session()
s.get('https://www.icourse163.org')
csrfkey=s.cookies['NTESSTUDYSI']
data={'bizId':1260493290,#contentId
'bizType':1,
'contentType':1}
for v in self.dic.items():#dic.keys()每个大章节的名字 v.keys()每个小章节的名字
for i in v[1].items():
for d in i[1].items():
if d[1]['contentType']=='1':
ts_list=[]
data['bizId']=d[1]['file_id']
ts_url=s.post('https://www.icourse163.org/web/j/resourceRpcBean.getResourceToken.rpc?csrfKey='+csrfkey,data=data)
signature=json.loads(ts_url.text)['result']['videoSignDto']['signature']
vide_urls=json.loads(s.get('https://vod.study.163.com/eds/api/v1/vod/video?videoId='+d[1]['contentId']+'&signature='+signature+'&clientType=1').text)
videos=vide_urls['result']['videos']
for url in videos:
ts_list.append(url['videoUrl'])
ts_dic[d[1]['name']]=ts_list
return ts_dic
## ts_dic格式
## ts_dic={'视频文件名':[下载地址1,下载地址2,下载地址3],...} 返回的是下载地址 没有进行下载 需要的可以自己写一个用来下载的即可
[Python] 纯文本查看 复制代码 ##使用方法:1.复制代码 创建一个类 然后使用其中的方法即可 MOOC.GetPdf()和MOOC.GetTs()返回的是字典 调用接口就可以啦 |
-
视频链接获取
-
PDF链接获取
免费评分
-
查看全部评分
|