modified: __pycache__/get_info.cpython-310.pyc

new file:   __pycache__/get_info.cpython-38.pyc
	new file:   __pycache__/kill_course.cpython-38.pyc
	new file:   __pycache__/single_course.cpython-38.pyc
	modified:   course_info.json
	modified:   demo.py
	modified:   get_info.py
	new file:   initialization.py
	modified:   main.py
main
JesterHey 1 year ago
parent a75444a931
commit c00744daed

@ -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"}}
{"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"}}

@ -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)
from loguru import logger
logger.error('未知课程类型')

@ -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):
# <div class="paginationjs-nav J-paginationjs-nav">1 / 4</div>
# 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)

@ -0,0 +1,6 @@
'''
由于青马课程需要先进入视频一次页之后才会在个人中心的对应位置显示
所以先进入个人中心检测各个类型课程数量是否存在小于10的,如果有则进入首页点击一下视频一次
'''
# 本模块用于初始化,检测是否需要进入视频一次页以及进行进入视频一次页操作
# 睡觉了,明天再写,哈哈。 おやすみなさいです、あしたまたね:)

@ -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
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()
Loading…
Cancel
Save