[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# [url=home.php?mod=space&uid=238618]@Time[/url] : 2020/12/26 15:17
# [url=home.php?mod=space&uid=686208]@AuThor[/url] : Melon
# [url=home.php?mod=space&uid=406162]@site[/url] :
# [url=home.php?mod=space&uid=267492]@file[/url] : mooc.py
# @Software: PyCharm
import time
import requests
import json
from PIL import Image
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}
# [url=https://mooc.icve.com.cn/portal/LoginMooc/loginSystem?userName=LH17001&password=qwer%40123&verifycode=2405]https://mooc.icve.com.cn/portal/LoginMooc/loginSystem?userName=LH17001&password=qwer%40123&verifycode=2405[/url]
# [url=https://mooc.icve.com.cn/portal/course/getCourseOpenList]https://mooc.icve.com.cn/portal/course/getCourseOpenList[/url]
# [url=https://mooc.icve.com.cn/study/learn/getProcessList?courseOpenId=wylwaxasdyjptaswj67x6g]https://mooc.icve.com.cn/study/learn/getProcessList?courseOpenId=wylwaxasdyjptaswj67x6g[/url]
# [url=https://mooc.icve.com.cn/study/learn/getCellByTopicId]https://mooc.icve.com.cn/study/learn/getCellByTopicId[/url]
# [url=https://mooc.icve.com.cn/study/learn/viewDirectory]https://mooc.icve.com.cn/study/learn/viewDirectory[/url]
# 0.登录,拿到cookie------>[url=https://mooc.icve.com.cn/portal/LoginMooc/loginSystem]https://mooc.icve.com.cn/portal/LoginMooc/loginSystem[/url]
def login(name, password):
'''
登录
:param name: 用户名
:param password: 密码
:return: cookies
'''
# 验证码[url=https://mooc.icve.com.cn/portal/LoginMooc/getVerifyCode?ts=1608968080542]https://mooc.icve.com.cn/portal/LoginMooc/getVerifyCode?ts=1608968080542[/url]
codeUrl = "https://mooc.icve.com.cn/portal/LoginMooc/getVerifyCode?ts={}".format(int(round(time.time() * 1000)))
loginUrl = "https://mooc.icve.com.cn/portal/LoginMooc/loginSystem"
codeResult = requests.post(url=codeUrl, headers=headers)
with open("moocCode.jpg", "wb", ) as f:
f.write(codeResult.content)
# 验证码的cookies
code_cookies = codeResult.cookies
print("---------->验证码获取完成,开始打开验证码")
img = Image.open("moocCode.jpg")
img.show()
print("---------->验证码打开完成,请输入")
data = {
'userName': name,
'password': password,
'verifycode': input("输入验证码:")
}
result = requests.post(url=loginUrl, data=data, headers=headers, cookies=code_cookies)
json_result = json.loads(result.text)
if json_result['code'] == 1 and json_result['msg'] == "登录成功":
return result.cookies
else:
print(json_result['msg'])
return 0
# 1.获取所有课程,拿到id-------->[url=https://mooc.icve.com.cn/portal/course/getCourseOpenList]https://mooc.icve.com.cn/portal/course/getCourseOpenList[/url]
def getCourseOpenList(cookies):
'''
获取所有课程
:param cookies: cookies
:return: [{"id":"wylwaxasdyjptaswj67x6g","text":"茶艺与茶文化_第四次开课"}]
'''
url = "https://mooc.icve.com.cn/portal/course/getCourseOpenList"
result = json.loads(requests.post(url=url, headers=headers, cookies=cookies).text)
return result['list']
# 2.得到一级目录-------->[url=https://mooc.icve.com.cn/study/learn/getProcessList?courseOpenId=wylwaxasdyjptaswj67x6g]https://mooc.icve.com.cn/study/learn/getProcessList?courseOpenId=wylwaxasdyjptaswj67x6g[/url]
def getProcessList(cookies, courseId):
'''
得到一级目录
:param cookies: cookies
:param courseId: gtjkawksy5jf7raso8gdq
:return: [{'id': 'oitwaxas05rp25uktqp8a', 'name': '1.茶艺服务礼仪训练', 'sortOrder': 1, 'percent': 40, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'qotwaxasf7tahcyr6kd8wa', 'name': '2.茶具的认识与使用', 'sortOrder': 2, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'q4twaxasc7nbpxt8pmkjdw', 'name': '3.泡茶操作规范', 'sortOrder': 3, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'q4twaxastoradnurwvdxq', 'name': '4.茶叶认识', 'sortOrder': 4, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'q4twaxasv7zer5q5cks8gg', 'name': '5.泡茶规范与技术', 'sortOrder': 5, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'ritwaxashqlasilv5ziiew', 'name': '6.茶文化解读', 'sortOrder': 6, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}]
'''
url = "https://mooc.icve.com.cn/study/learn/getProcessList"
result = json.loads(requests.post(url=url, data={'courseOpenId': courseId}, headers=headers, cookies=cookies).text)
return result['proces']['moduleList']
# 3.得到二级目录-------->[url=https://mooc.icve.com.cn/study/learn/getTopicByModuleId?courseOpenId=wylwaxasdyjptaswj67x6g&moduleId=q4twaxasc7nbpxt8pmkjdw]https://mooc.icve.com.cn/study/learn/getTopicByModuleId?courseOpenId=wylwaxasdyjptaswj67x6g&moduleId=q4twaxasc7nbpxt8pmkjdw[/url]
def getTopicByModuleId(cookies, courseId, moduleId):
'''
得到二级目录
:param cookies: cookies
:param courseId: courseOpenId
:param moduleId: moduleId
:return: [{'id': 'pytwaxasupbiajdwbddwaw', 'name': '茶艺服务人员的仪容仪态', 'sortOrder': 0, 'upTopicId': '0', 'isLastStudy': False, 'studyStatus': 0}, {'id': 'qotwaxasyjbjd0mnjgxz1w', 'name': '各种行茶礼仪', 'sortOrder': 1, 'upTopicId': 'pytwaxasupbiajdwbddwaw', 'isLastStudy': False, 'studyStatus': 0}]
'''
url = "https://mooc.icve.com.cn/study/learn/getTopicByModuleId"
data = {
'courseOpenId': courseId,
'moduleId': moduleId
}
result = json.loads(requests.post(url=url, data=data, headers=headers, cookies=cookies).text)
return result['topicList']
# 4.获得三级目录(详细信息)--------->[url=https://mooc.icve.com.cn/study/learn/getCellByTopicId?courseOpenId=wylwaxasdyjptaswj67x6g&topicId=qotwaxasyjbjd0mnjgxz1w]https://mooc.icve.com.cn/study/learn/getCellByTopicId?courseOpenId=wylwaxasdyjptaswj67x6g&topicId=qotwaxasyjbjd0mnjgxz1w[/url]
def getCellByTopicId(cookies, courseId, topicId):
'''
获得三级目录(详细信息)
:param cookies: cookies
:param courseId: courseOpenId
:param topicId: topicId
:return: [{'Id': 'qytwaxaso6hhfh3x0dnbw', 'resId': '', 'cellType': 4, 'isGJS': 1, 'parentId': 'pytwaxasupbiajdwbddwaw', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'topicId': 'pytwaxasupbiajdwbddwaw', 'categoryName': '子节点', 'cellName': '1.茶艺服务人员的妆容仪表要求', 'resourceUrl': '', 'externalLinkUrl': '', 'cellContent': '', 'sortOrder': 1, 'isAllowDownLoad': False, 'childNodeList': [{'Id': 'qotwaxasp4vae7z3zcwqua', 'resId': '', 'cellType': 1, 'isGJS': 1, 'isAllowDownLoad': False, 'parentId': 'qytwaxaso6hhfh3x0dnbw', 'categoryName': '视频', 'cellName': '茶艺师的仪容仪表要求', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'resourceUrl': 'doc/g@F35D826F1BAAA3B655096B7E19435948.mp4', 'externalLinkUrl': '', 'cellContent': 'doc/g@F35D826F1BAAA3B655096B7E19435948.mp4', 'upCellId': '0', 'isStudyFinish': True, 'isUnlock': True}, {'Id': 'qotwaxasvrbgva1hlhnjuw', 'resId': '', 'cellType': 1, 'isGJS': 1, 'isAllowDownLoad': False, 'parentId': 'qytwaxaso6hhfh3x0dnbw', 'categoryName': 'swf', 'cellName': '茶艺服务人员的仪容仪表要求', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'resourceUrl': 'doc/g@55633CAC7D22C7247E99B7D650010E7D.swf', 'externalLinkUrl': '', 'cellContent': 'doc/g@55633CAC7D22C7247E99B7D650010E7D.swf', 'upCellId': 'qotwaxasp4vae7z3zcwqua', 'isStudyFinish': True, 'isUnlock': True}, {'Id': 'qotwaxasvrbejkntkxphtw', 'resId': '3ixwaxasg5ba3ri5avr79a', 'cellType': 6, 'isGJS': 1, 'isAllowDownLoad': False, 'parentId': 'qytwaxaso6hhfh3x0dnbw', 'categoryName': '作业', 'cellName': '茶艺师的仪容仪表', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'resourceUrl': '', 'externalLinkUrl': '', 'cellContent': '', 'upCellId': 'qotwaxasvrbgva1hlhnjuw', 'isStudyFinish': False, 'isUnlock': True}], 'upCellId': '-1', 'isStudyFinish': False, 'isUnlock': True}, {'Id': 'qotwaxasfj5jphzi8yiooq', 'resId': '', 'cellType': 4, 'isGJS': 1, 'parentId': 'pytwaxasupbiajdwbddwaw', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'topicId': 'pytwaxasupbiajdwbddwaw', 'categoryName': '子节点', 'cellName': '2.茶艺服务人员的仪态要求', 'resourceUrl': '', 'externalLinkUrl': '', 'cellContent': '', 'sortOrder': 2, 'isAllowDownLoad': False, 'childNodeList': [{'Id': 'qotwaxasf5fm1vtfllslya', 'resId': '', 'cellType': 1, 'isGJS': 1, 'isAllowDownLoad': False, 'parentId': 'qotwaxasfj5jphzi8yiooq', 'categoryName': '视频', 'cellName': '茶艺师的仪态', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'resourceUrl': 'doc/g@AA759F5E1EE1978FD760C403B17EF08C.mp4', 'externalLinkUrl': '', 'cellContent': 'doc/g@AA759F5E1EE1978FD760C403B17EF08C.mp4', 'upCellId': 'qotwaxasvrbejkntkxphtw', 'isStudyFinish': True, 'isUnlock': True}, {'Id': 'qotwaxasy4hpjggnawg', 'resId': '', 'cellType': 1, 'isGJS': 1, 'isAllowDownLoad': False, 'parentId': 'qotwaxasfj5jphzi8yiooq', 'categoryName': 'swf', 'cellName': '茶艺服务人员的仪态要求', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'resourceUrl': 'doc/g@66FFBBA9CB37B03D4245418690E54815.swf', 'externalLinkUrl': '', 'cellContent': 'doc/g@66FFBBA9CB37B03D4245418690E54815.swf', 'upCellId': 'qotwaxasf5fm1vtfllslya', 'isStudyFinish': True, 'isUnlock': True}, {'Id': 'qotwaxasty1k8hfv4hrwmg', 'resId': '3ixwaxasu41ocvxkwprlxa', 'cellType': 6, 'isGJS': 1, 'isAllowDownLoad': False, 'parentId': 'qotwaxasfj5jphzi8yiooq', 'categoryName': '作业', 'cellName': '茶艺师的仪态要求', 'courseOpenId': 'wylwaxasdyjptaswj67x6g', 'resourceUrl': '', 'externalLinkUrl': '', 'cellContent': '', 'upCellId': 'qotwaxasy4hpjggnawg', 'isStudyFinish': False, 'isUnlock': True}], 'upCellId': '-1', 'isStudyFinish': False, 'isUnlock': True}]
'''
url = "https://mooc.icve.com.cn/study/learn/getCellByTopicId"
data = {
'courseOpenId': courseId,
'topicId': topicId
}
result = json.loads(requests.post(url=url, data=data, headers=headers, cookies=cookies).text)
return result['cellList']
# 5.拿到学习时长等信息---------->[url=https://mooc.icve.com.cn/study/learn/viewDirectory?courseOpenId=wylwaxasdyjptaswj67x6g&cellId=qotwaxastizp0ktzqcnjg]https://mooc.icve.com.cn/study/learn/viewDirectory?courseOpenId=wylwaxasdyjptaswj67x6g&cellId=qotwaxastizp0ktzqcnjg[/url]
def viewDirectory(cookies, courseOpenId, cellId):
'''
拿到学习时长等信息
:param cookies: cookies
:param courseOpenId: courseOpenId
:param cellId: cellId
:return: {'Id': 'cbwagosnyjooghaevg6fw', 'DateCreated': '/Date(1603976559000)/', 'CourseOpenId': 'gtjkawksy5jf7raso8gdq', 'TopicId': 'qc6vagosurpneukvl1nh1w', 'ParentId': 'qc6vagosly1owrpgpu6rg', 'CellName': '幼儿照护员的职业素养', 'CategoryName': 'ppt文档', 'CellType': 1, 'ResourceUrl': 'doc/g@85031789B2B47C2167D68CA0418D9FD3.pptx', 'ExternalLinkUrl': None, 'CellContent': None, 'RarJsonData': None, 'ztWay': 0, 'SpaceCount': 0, 'IsAllowDownLoad': False, 'KnowledgeIds': '', 'KnowledgeTitle': '', 'SortOrder': 1, 'FromType': 2, 'ImpProjectId': '', 'ImpProjectName': '', 'ImpDocId': '', 'ImpDocTitle': '', 'ResId': '', 'NewSortOrder': 0, 'FromId': None, 'VideoTimeLong': 0, 'DocSize': 9023286, 'PageCount': 8, 'DateModified': '/Date(-62135596800000)/', 'VideoQuestionCount': 0, 'PlayType': 0, 'FromMOOCCellId': '', 'DocId': 'cbwagosz7nmuxz8cxclg', 'GreenScan': 'pass', 'GreenScanScene': '', 'TableName': 'MOOC_CourseProcessCell'}
'''
time.sleep(1)
url = "https://mooc.icve.com.cn/study/learn/viewDirectory"
data = {
'courseOpenId': courseOpenId,
'cellId': cellId
}
result = requests.post(url=url, data=data, headers=headers, cookies=cookies)
result = json.loads(result.text)
return result['courseCell']
# 6.开始刷课--------->[url=https://mooc.icve.com.cn/study/learn/statStuProcessCellLogAndTimeLong?courseOpenId=wylwaxasdyjptaswj67x6g&cellId=qotwaxastizp0ktzqcnjg&auvideoLength=487&videoTimeTotalLong=487]https://mooc.icve.com.cn/study/learn/statStuProcessCellLogAndTimeLong?courseOpenId=wylwaxasdyjptaswj67x6g&cellId=qotwaxastizp0ktzqcnjg&auvideoLength=487&videoTimeTotalLong=487[/url]
def statStuProcessCellLogAndTimeLong(cookies, courseOpenId, cellId, videoTimeTotalLong):
'''
开始刷课
:param cookies: cookies
:param courseOpenId: courseOpenId
:param cellId: cellId
:param videoTimeTotalLong: videoTimeTotalLong
:return: {"code":1,"isStudy":true}
'''
time.sleep(1.5)
url = "https://mooc.icve.com.cn/study/learn/statStuProcessCellLogAndTimeLong"
data = {
'courseOpenId': courseOpenId,
'cellId': cellId,
'auvideoLength': videoTimeTotalLong,
'videoTimeTotalLong': videoTimeTotalLong
}
result = json.loads(requests.post(url=url, data=data, headers=headers, cookies=cookies).text)
return result
def start(name, password):
cookies = login(name=name, password=password) # 得到cookies用于后续登录
course = getCourseOpenList(cookies) # 得到课程 [{'id': 'gtjkawksy5jf7raso8gdq', 'text': '幼儿照护(中级)_第一次开课'}]
for i in course:
print("进入课程:" + i['text'])
time.sleep(1)
# 一级目录
moduleList1 = getProcessList(cookies=cookies, courseId=i[
'id']) # [{'id': 'oitwaxas05rp25uktqp8a', 'name': '1.茶艺服务礼仪训练', 'sortOrder': 1, 'percent': 40, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'qotwaxasf7tahcyr6kd8wa', 'name': '2.茶具的认识与使用', 'sortOrder': 2, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'q4twaxasc7nbpxt8pmkjdw', 'name': '3.泡茶操作规范', 'sortOrder': 3, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'q4twaxastoradnurwvdxq', 'name': '4.茶叶认识', 'sortOrder': 4, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'q4twaxasv7zer5q5cks8gg', 'name': '5.泡茶规范与技术', 'sortOrder': 5, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}, {'id': 'ritwaxashqlasilv5ziiew', 'name': '6.茶文化解读', 'sortOrder': 6, 'percent': 0, 'ModuleType': 1, 'ResId': '', 'isUnlock': True}]
for j in moduleList1:
time.sleep(0.25)
print("\t" + j['name'])
# 二级目录
moduleList2 = getTopicByModuleId(cookies=cookies, courseId=i['id'], moduleId=j['id'])
for k in moduleList2:
time.sleep(0.25)
print("\t\t" + k['name'])
# 三级目录
moduleList3 = getCellByTopicId(cookies=cookies, courseId=i['id'], topicId=k['id'])
for m in moduleList3:
time.sleep(0.25)
print("\t\t\t" + m['cellName'])
# 如果只有三级目录
if not len(m['childNodeList']):
# =================================================================================================================================
# 如果课程完成-不刷课
if m['isStudyFinish'] is True:
print(
"\t\t\t\t" + m['cellName'] + "\t类型:" + m['categoryName'] + "\t\t------课程完成,不刷课-------")
continue
# 拿课程信息
info = viewDirectory(cookies=cookies, courseOpenId=m['courseOpenId'], cellId=m['Id'])
# 将信息拿去刷课
if not m['categoryName'] == "视频" and not m['categoryName'] == "音频":
# 如果不是视频或者音频
isOK = statStuProcessCellLogAndTimeLong(cookies=cookies, courseOpenId=info['CourseOpenId'],
cellId=info['Id'],
videoTimeTotalLong=0)
# 四级目录(最终)
else:
# 是视频或者音频
isOK = statStuProcessCellLogAndTimeLong(cookies=cookies, courseOpenId=info['CourseOpenId'],
cellId=info['Id'],
videoTimeTotalLong=info['VideoTimeLong'])
if isOK['code'] == 1 and isOK['isStudy'] is True:
print("\t\t\t\t" + m['cellName'] + "\t类型:" + m['categoryName'] + "\t\t-----刷课OK----")
else:
print("\t\t\t\t" + m['cellName'] + "\t类型:" + m['categoryName'] + "\t\t-----ERROR----")
else:
# =================================================================================================================================
for n in m['childNodeList']:
time.sleep(0.5)
# 如果课程完成-不刷课
if n['isStudyFinish'] is True:
print("\t\t\t\t" + n['cellName'] + "\t类型:" + n[
'categoryName'] + "\t\t------课程完成,不刷课-------")
continue
# 拿课程信息
info = viewDirectory(cookies=cookies, courseOpenId=n['courseOpenId'], cellId=n['Id'])
# 将信息拿去刷课
if not n['categoryName'] == "视频" and not n['categoryName'] == "音频":
# 如果不是视频或者音频
isOK = statStuProcessCellLogAndTimeLong(cookies=cookies,
courseOpenId=info['CourseOpenId'],
cellId=info['Id'],
videoTimeTotalLong=0)
else:
# 是视频或者音频
isOK = statStuProcessCellLogAndTimeLong(cookies=cookies,
courseOpenId=info['CourseOpenId'],
cellId=info['Id'],
videoTimeTotalLong=info['VideoTimeLong'])
if isOK['code'] == 1 and isOK['isStudy'] is True:
print("\t\t\t\t" + n['cellName'] + "\t类型:" + n['categoryName'] + "\t\t-----刷课OK----")
else:
print("\t\t\t\t" + n['cellName'] + "\t类型:" + n['categoryName'] + "\t\t-----ERROR----")
if __name__ == '__main__':
# ====================== # 只需要填写
name = "账号" # 账号
password = "密码" # 密码
# ====================== # 然后运行,然后输入验证码
start(name=name, password=password)