You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.0 KiB

from kill_course import kill_course
from initialization import init, click_videoes
import json
from get_info import get_info
from collections import *
from loguru import logger
import subprocess
from typing import *
from DrissionPage import ChromiumPage
from DrissionPage.common import *
import time
from get_in import create_login_window
import os
# 录入账号密码
if not os.path.exists('info.json'):
create_login_window()
study_type = json.load(open('info.json', 'r'))['study_type']
# 这里以后会放一个初始化模块
init(study_type=study_type)
# 执行刷课
kill_course()
# 完成刷课后,判定是否存在需要答题或者评分的课程
'''
重新检测各个课程的status参数
1. 对于必修课存在3种情况:未完成已完成未答题
2. 对于其他课存在3种情况:未完成已完成未评分
'''
# 重新获取课程信息
def new_info() -> DefaultDict[str, List[Tuple[str, int, str]]]:
get_info(first=False)
new_info = json.load(open('course_info.json', 'r'))
# 读取各个类别的课程状态
new_cnt = defaultdict(list)
for k, v in new_info.items():
new_cnt[v['type']].append(
(k, v['rate'], v['status'])) # 课程类型作为键课程id作为值
return new_cnt
new_cnt = new_info()
# 首先检查是否还存在未完成的课程
for k, v in new_cnt.items():
for i in v:
if i[1] < 100:
logger.error('存在未完成的课程:{}! 将重新执行刷课'.format(i[0]))
# 完全关闭进程并重新执行刷课
kill_course(again=True)
subprocess.run(["python", __file__])
exit()
# 若上述检验通过,则重新读取课程信息并检验是否存在未答题或者未评分的课程
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)
# 实现自动评分
def auto_judge(course_id: str, course_type: str) -> None:
# 根据课程类型和id进行定位
j_page = ChromiumPage() # 接管当前页面
# 判定课程类别
if course_type == '必修':
j_page.ele('@value=1').click()
elif course_type == '选修':
j_page.ele('@value=2').click()
elif course_type == '专题':
j_page.ele('@value=4').click()
elif course_type == '培训':
j_page.ele('@value=5').click()
time.sleep(1)
trs = j_page.ele('#tbody').eles('tag:tr')
for tr in trs:
# 鉴别课程序号
if tr.ele('tag:td').text.split('\t')[0] == course_id:
# 进入评分页面
tr.ele('tag:button@@text():进入评分').click()
j_page.ele('x://*[@id="gradeDetail_score"]/label[1]/input').click()
j_page.ele('tag:a@@text():保存').click()
time.sleep(1)
pass
# 实现自动评分
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
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()