diff --git a/__pycache__/get_info.cpython-310.pyc b/__pycache__/get_info.cpython-310.pyc index 4c586a4..950e5ec 100644 Binary files a/__pycache__/get_info.cpython-310.pyc and b/__pycache__/get_info.cpython-310.pyc differ diff --git a/__pycache__/get_info.cpython-38.pyc b/__pycache__/get_info.cpython-38.pyc new file mode 100644 index 0000000..3866ea4 Binary files /dev/null and b/__pycache__/get_info.cpython-38.pyc differ diff --git a/__pycache__/kill_course.cpython-38.pyc b/__pycache__/kill_course.cpython-38.pyc new file mode 100644 index 0000000..23e21be Binary files /dev/null and b/__pycache__/kill_course.cpython-38.pyc differ diff --git a/__pycache__/single_course.cpython-38.pyc b/__pycache__/single_course.cpython-38.pyc new file mode 100644 index 0000000..aca7147 Binary files /dev/null and b/__pycache__/single_course.cpython-38.pyc differ diff --git a/course_info.json b/course_info.json index fa5bdb7..62ec159 100644 --- a/course_info.json +++ b/course_info.json @@ -1 +1 @@ -{"6349": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7436": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7367": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7366": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7033": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7517": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7032": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7516": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7031": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7515": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "6937": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6938": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u672a\u8bc4\u5206"}, "6991": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u672a\u8bc4\u5206"}, "6992": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6993": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6995": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7006": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7007": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7010": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7011": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7554": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7553": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7552": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7551": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7550": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7549": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7548": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7547": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7546": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7545": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7564": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}} \ No newline at end of file +{"6349": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7436": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7367": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7366": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7033": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7517": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7032": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7516": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7031": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7515": {"rate": 100, "type": "\u5fc5\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "6937": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6938": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6991": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6992": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6993": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "6995": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7006": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7007": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7010": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7011": {"rate": 100, "type": "\u57f9\u8bad", "status": "\u5df2\u5b66\u5b8c"}, "7554": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7553": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7552": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7551": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7550": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7549": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7548": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7547": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7546": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7545": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}, "7564": {"rate": 100, "type": "\u9009\u4fee", "status": "\u5df2\u5b66\u5b8c"}} \ No newline at end of file diff --git a/demo.py b/demo.py index 2b61483..0c40233 100644 --- a/demo.py +++ b/demo.py @@ -1,10 +1,2 @@ -from collections import * -import json -info = json.load(open('course_info.json', 'r')) -cnt = defaultdict(list) -new_cnt = defaultdict(list) -for k, v in info.items(): - new_cnt[v['type']].append((k,v['rate'],v['status'])) # 课程类型作为键,课程id作为值 -print(new_cnt) -for k,v in new_cnt.items(): - print(k,v) \ No newline at end of file +from loguru import logger +logger.error('未知课程类型') \ No newline at end of file diff --git a/get_info.py b/get_info.py index b0f73b1..6ffd5f2 100644 --- a/get_info.py +++ b/get_info.py @@ -1,4 +1,4 @@ -from DrissionPage import WebPage +from DrissionPage import ChromiumPage,ChromiumOptions from DrissionPage.common import * from collections import * import time @@ -12,7 +12,7 @@ def login(first:bool=True): if not first: return # 先检查当前页面是否已经登录 - page = WebPage() + page = ChromiumPage() try: if page.ele('tag:div@@text():欢迎您,',timeout=3): logger.info('当前页面已登录') @@ -52,7 +52,7 @@ def login(first:bool=True): page.ele('@value=进入个人中心').click() def get_info(first:bool=True): # 创建页面对象,并启动或接管浏览器 - page = WebPage() + page = ChromiumPage() # 登录 login(first) # 提取课程信息 @@ -66,6 +66,7 @@ def get_info(first:bool=True): #
1 / 4
# total_page = int(page.ele('.paginationjs-nav J-paginationjs-nav').text) total_page = 4 + logger.debug('读取课程信息中...') for i in range(total_page): # 逐页读取课程信息和完成状态并存放到字典中 tbodys = page.ele('#tbody') @@ -77,13 +78,12 @@ def get_info(first:bool=True): course_type = cur_info[2] # 课程类型 course_rate = int(cur_info[3][:-1]) # 课程完成百分比 course_status = cur_info[4] # 课程完成状态(是否完成习题/评价) - logger.info('课程id:{}|课程类型:{}|课程完成率:{}|课程完成状态:{}'.format(course_id,course_type,course_rate,course_status)) # 存放到字典中 course_info[course_id] = {'rate': course_rate,'type': course_type,'status': course_status} if i != total_page - 1: page.ele('@title=Next page').click() time.sleep(1) - print(len(course_info)) + logger.success('课程信息读取完成,共有{}门课程'.format(len(course_info))) # 写入json文件中 with open('course_info.json', 'w') as f: json.dump(course_info, f) diff --git a/initialization.py b/initialization.py new file mode 100644 index 0000000..0dde5f0 --- /dev/null +++ b/initialization.py @@ -0,0 +1,6 @@ +''' +由于青马课程需要先进入视频一次页之后才会在个人中心的对应位置显示, +所以先进入个人中心检测各个类型课程数量是否存在小于10的,如果有,则进入首页点击一下视频一次 +''' +# 本模块用于初始化,检测是否需要进入视频一次页以及进行进入视频一次页操作 +# 睡觉了,明天再写,哈哈。 おやすみなさいです、あしたまたね:) \ No newline at end of file diff --git a/main.py b/main.py index ae08881..cd6426a 100644 --- a/main.py +++ b/main.py @@ -33,7 +33,7 @@ new_cnt = new_info() for k, v in new_cnt.items(): for i in v: if i[1] < 100: - logger.critical('存在未完成的课程:{}! 将重新执行刷课'.format(i[0])) + logger.error('存在未完成的课程:{}! 将重新执行刷课'.format(i[0])) # 完全关闭进程并重新执行刷课 kill_course(again=True) subprocess.run(["python", __file__]) @@ -50,9 +50,7 @@ for k, v in new_cnt.items(): elif i[2] == '未答题': not_quiz.append(i[0],k) -# 展示提示信息 -for i in not_judged: - logger.warning('存在未评分的课程:{}'.format(i)) + # 实现自动评分 def auto_judge(course_id:str,course_type:str) -> None: # 根据课程类型和id进行定位 @@ -77,11 +75,41 @@ def auto_judge(course_id:str,course_type:str) -> None: j_page.ele('tag:a@@text():保存').click() time.sleep(1) pass -print(not_judged) # 实现自动评分 -for i in not_judged: - auto_judge(i[0],i[1]) - logger.info('已完成对课程:{}的评分'.format(i[0])) -# 实现自动答题 +if not_judged: + for i in not_judged: + logger.info('正在对课程:{}进行评分'.format(i[0])) + auto_judge(i[0],i[1]) + logger.success('已完成对课程:{}的评分'.format(i[0])) +else: + logger.info('没有需要评分的课程') +# 实现题目答案显示 def auto_quiz(course_id:str) -> None: - pass \ No newline at end of file + pass +if not_quiz: + for i in not_quiz: + logger.info('正在获取课程:{}的答案'.format(i[0])) + auto_quiz(i[0]) + logger.success('已完成对课程:{}的答案获取'.format(i[0])) +else: + logger.info('没有需要答题的课程') + +# 重新检验是否存在未评分或者未答题的课程 +logger.debug('正在进行最终检验...') +time.sleep(2) +new_cnt = new_info() +not_judged = [] +not_quiz = [] +for k, v in new_cnt.items(): + for i in v: + if i[2] == '未评分': + not_judged.append((i[0],k)) + elif i[2] == '未答题': + not_quiz.append(i[0],k) +if not not_judged and not not_quiz: + logger.warning('所有课程均已完成,页面即将关闭') + page = ChromiumPage() + page.close_tabs() +else: + subprocess.run(["python", __file__]) + exit() \ No newline at end of file