只适用 https://mooc.icve.com.cn/
1. 如今职教云(https://zjy2.icve.com.cn/)的刷课方法基本没用,以是没找职教云的接口
2. mooc的用的人不多,但也有课在里面,经太过析,只要调用一个接口就能快速刷课
3. 用的是python做的,可以用别的,看懂了可以自己搞,乃至可以用postnam软件一个一个发请求都行
4. 乃至可以用js做,都是发请求什么的,有时间的可以搞一下
5. 通过多次调试,确定目前(2020-12-26)能使用
6. 没弄 考试,作业 的答题,因为要找接口,没有
7. 时间问题没捕获任何异常,有报错办理不了的可以发出来一起办理
8. python技术不可,后面都是for循环乃至嵌套,可能过几天我都不知道是什么了,凑合能用
9. 作业没做也会表现完成,但是未完成,不要忘记做作业
嫌下面代码太长的可以下载这个:mooc.zip
(链接太长,放在这里)
[table][tr][td] 接口名称[/td][td] 介绍[/td][td] URL[/td][td]参数(*为打码,可选参数没写进去)[/td][/tr][tr][td] 接口1[/td][td] 获取一级目次[/td][td]https://mooc.icve.com.cn/study/learn/getProcessList[/td][td]courseOpenId=fhe****************knw[/td][/tr][tr][td] 接口2[/td][td]获取二级目次[/td][td]https://mooc.icve.com.cn/study/learn/getTopicByModuleId[/td][td]courseOpenId=fhe****************knw&moduleId=kxila*************lxua[/td][/tr][tr][td] 接口3[/td][td]获取三级(四级)目次[/td][td]https://mooc.icve.com.cn/study/learn/getCellByTopicId[/td][td]courseOpenId=fhe****************knw&topicId=kxila*************hfqfa[/td][/tr][tr][td] 接口4[/td][td]获取视频总时长[/td][td]https://mooc.icve.com.cn/study/learn/viewDirectory[/td][td]courseOpenId=fhe****************knw&cellId=kxila*****************guga[/td][/tr][tr][td]接口5[/td][td]刷课接口(主要)[/td][td]https://mooc.icve.com.cn/study/learn/statStuProcessCellLogAndTimeLong[/td][td]courseOpenId=fhe****************knw&cellId=kxila*****************guga&
auvideoLength=998&videoTimeTotalLong=998
(下面过程均是处于登录状态)
一、找接口
1. 根据下面这个方法,可以拿到接口1,我们可以看到,里面我们需要的只有 一级目次大标题(初识Java语言),我们拿到了就需要找到第二个接口,就是二级目次([url=]单位引例描述[/url])
3. 剩下的就是继续找三级目次,我们点一下([url=]单位引例描述[/url]),会出现一个接口,得到接口3,就是详细信息
4. 于是我们随便点一个视频,得到接口4
四、Python代码实现(不要改太快,会封,默认我这个就可以,代码重复高,没时间改,默认都是全刷,会改的可以改成指定课程刷,或者找我改一下)
[Python] 纯文本查看 复制代码# -*- coding: utf-8 -*-# @Time : 2020/12/26 15:17# @AuThor : Melon# @site : # @file : mooc.py# @Software: PyCharmimport timeimport requestsimport jsonfrom PIL import Imageheaders = { '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',}# https://mooc.icve.com.cn/portal/LoginMooc/loginSystem?userName=LH17001&password=qwer%40123&verifycode=2405# https://mooc.icve.com.cn/portal/course/getCourseOpenList# https://mooc.icve.com.cn/study/learn/getProcessList?courseOpenId=wylwaxasdyjptaswj67x6g# https://mooc.icve.com.cn/study/learn/getCellByTopicId# https://mooc.icve.com.cn/study/learn/viewDirectory# 0.登录,拿到cookie------>https://mooc.icve.com.cn/portal/LoginMooc/loginSystemdef login(name, password): ''' 登录 :param name: 用户名 :param password: 密码 :return: cookies ''' # 验证码https://mooc.icve.com.cn/portal/LoginMooc/getVerifyCode?ts=1608968080542 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-------->https://mooc.icve.com.cn/portal/course/getCourseOpenListdef 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.得到一级目次-------->https://mooc.icve.com.cn/study/learn/getProcessList?courseOpenId=wylwaxasdyjptaswj67x6gdef 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.得到二级目次-------->https://mooc.icve.com.cn/study/learn/getTopicByModuleId?courseOpenId=wylwaxasdyjptaswj67x6g&moduleId=q4twaxasc7nbpxt8pmkjdwdef 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.获得三级目次(详细信息)--------->https://mooc.icve.com.cn/study/learn/getCellByTopicId?courseOpenId=wylwaxasdyjptaswj67x6g&topicId=qotwaxasyjbjd0mnjgxz1wdef 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.拿到学习时长等信息---------->https://mooc.icve.com.cn/study/learn/viewDirectory?courseOpenId=wylwaxasdyjptaswj67x6g&cellId=qotwaxastizp0ktzqcnjgdef 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.开始刷课--------->https://mooc.icve.com.cn/study/learn/statStuProcessCellLogAndTimeLong?courseOpenId=wylwaxasdyjptaswj67x6g&cellId=qotwaxastizp0ktzqcnjg&auvideoLength=487&videoTimeTotalLong=487def 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 resultdef 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)
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |