Skip to content

Commit

Permalink
feat:add grades query feature, fix assess bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
GentleCP committed May 7, 2020
1 parent 84aa020 commit 63c99f5
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 53 deletions.
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,16 @@
![](img/5-2.png)


## 1.4 关于分数查询
这个功能我将其删去了,因为在评估过后直接登录校园网即可查看分数,所以感觉略显鸡肋
后续看是否有需要再添加吧。

## 1.4 分数查询
分数查询功能重新上线!现在可以在程序主页选择功能5(query grades)来查询自己的所有成绩
显示效果如下:
![](img/1.7.0.png)
# 2. 版本号

1.6.0
1.7.0

## 2.1 更新内容
- [1.7.0] 添加了分数查询功能并修复了课程评估失败的问题
- [1.6.0]
> 文件同步添加了进度条,方便查看文件同步信息,但请注意,若下载过程中未完成中断任务需将下载一半的文件删除,否则不会更新
![](img/1.6.0.png)
Expand Down
10 changes: 8 additions & 2 deletions core/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import logging
import time

from core.source import Downloader,BackToMain,Assesser
from core.source import Downloader,BackToMain,Assesser,GradeObserver
from core.wifi import WifiLoginer,WifiError
import settings

Expand All @@ -25,6 +25,7 @@
** 2:wifi login **
** 3:wifi logout **
** 4:course assess **
** 5:query grades **
** q:exit **
*********************************************************************************
"""
Expand All @@ -40,13 +41,15 @@ def __init__(self,
wifi_loginer=None,
downloader=None,
assesser= None,
grade_observer = None,
):
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s:[%(message)s]')
self._logger = logging.getLogger("Init")
self._welcome_msg = welcome_msg
self._wifi_loginer = wifi_loginer
self._downloader = downloader
self._assesser = assesser
self._grade_observer = grade_observer

def _show_welcome(self):
print(self._welcome_msg)
Expand Down Expand Up @@ -84,6 +87,8 @@ def _cmd(self):
elif option == 4:
self._assesser.run()

elif option == 5:
self._grade_observer.run()

def run(self):
self._show_welcome()
Expand All @@ -97,7 +102,8 @@ def main():
source_dir=settings.SOURCE_DIR,
filter_list = settings.FILTER_LIST)
assesser = Assesser(settings.USER_INFO, settings.URLS,settings.ASSESS_MSG)
init = Init(WELCOME_MESSAGE, wifi_loginer, downloader,assesser)
grade_observer = GradeObserver(settings.USER_INFO, settings.URLS)
init = Init(WELCOME_MESSAGE, wifi_loginer, downloader,assesser, grade_observer)
init.run()


Expand Down
103 changes: 73 additions & 30 deletions core/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import requests

from bs4 import BeautifulSoup
from prettytable import PrettyTable

from core.utils import download_file

Expand All @@ -29,6 +30,12 @@ def __init__(self, user_info, urls):
self._user_info = user_info
self._urls = urls

def __keep_session(self):
res = self._S.get(url=self._urls['course_select_url'])
course_select_url = re.search(r"window.location.href='(?P<course_select_url>.*?)'", res.text).groupdict().get(
"course_select_url")
self._S.get(course_select_url)

def _login(self):
headers = {
'Connection': 'keep-alive',
Expand All @@ -53,6 +60,7 @@ def _login(self):
if json_res["f"]:
self._S.get(res.json()["msg"])
self._logger.info("登录成功!")
self.__keep_session()

else:
self._logger.error("登录失败,请检查settings下的USER_INFO是否正确!")
Expand Down Expand Up @@ -386,10 +394,10 @@ def run(self):

class Assesser(Loginer):

def __init__(self, user_info, urls,assess_msg):
def __init__(self, user_info, urls,assess_msgs):
super().__init__(user_info, urls)
self._logger = logging.getLogger("Assesser")
self._assess_msg = assess_msg
self._assess_msgs = assess_msgs
self.headers = {
'Connection': 'keep-alive',
'Accept': '*/*',
Expand All @@ -402,14 +410,16 @@ def __init__(self, user_info, urls,assess_msg):
'Accept-Language': 'zh-CN,zh;q=0.9',
}
self._id_pattern = re.compile('/evaluate/.*?/(?P<id>.*?)$')
self._course_assess_url = None # 动态获取课程评估地址

def _get_course_ids(self):
res = self._S.get(url=self._urls['course_select_url'])
course_select_url = re.search(r"window.location.href='(?P<course_select_url>.*?)'", res.text).groupdict().get(
"course_select_url")
self._S.get(course_select_url)

res = self._S.get(self._urls['course_assess_url'])
# 获取课程评估url
res = self._S.get(url='https://jwxk.ucas.ac.cn/notice/view/1')
bs4obj = BeautifulSoup(res.text,'html.parser')
href = bs4obj.find('a',string=re.compile('.*学期$')).get('href')
self._course_assess_url = self._urls['base_url'] + href
# 获取课程id
res = self._S.get(self._course_assess_url)
bs4obj = BeautifulSoup(res.text, 'html.parser')
urls = [url.get('href') for url in bs4obj.find_all('a', {'class': 'btn'})]
course_ids = []
Expand All @@ -418,26 +428,28 @@ def _get_course_ids(self):
return course_ids

def __assess_course(self,course_id):
res = self._S.get('http://jwxk.ucas.ac.cn/evaluate/evaluateCourse/' + course_id )
res = self._S.get('https://jwxk.ucas.ac.cn/evaluate/evaluateCourse/' + course_id )
s = res.text.split('?s=')[-1].split('"')[0]
soup = BeautifulSoup(res.text, 'html.parser')
radios = soup.find_all('input', attrs={'type': 'radio'})
bs4obj = BeautifulSoup(res.text, 'html.parser')
radios = bs4obj.find_all('input', attrs={'type': 'radio'})
value = radios[0]['value']
data = {}
for radio in radios:
data[radio['name']] = value
data['item_14']= self._assess_msg['item_14'] # 这门课我最喜欢什么
data['item_15']= self._assess_msg['item_15'] # 我认为本课程应从哪些方面需要进一步改进和提高?
data['item_16']= self._assess_msg['item_16'] # 我平均每周在这门课程上花费多少小时?
data['item_17']= self._assess_msg['item_17'] # 在参与这门课之前,我对这个学科领域兴趣如何
data['item_18']= self._assess_msg['item_18'] # 我对该课程的课堂参与度(包括出勤、回答问题等)
data['item_25']=''
data['radio_19']=''
data['subjectiveRadio']= '20' # 教室大小合适
data['subjectiveCheckbox']= '27' # 自己需求和兴趣

res = self._S.post('http://jwxk.ucas.ac.cn/evaluate/saveCourseEval/'+course_id+'?s='+s, data=data,headers=self.headers)

textareas = bs4obj.find_all('textarea')
for textarea, asses_msg in zip(textareas,self._assess_msgs[0:-2]):
# 填写主观评价内容
item_id = textarea.get('id')
data[item_id] = asses_msg
subjectiveRadio = bs4obj.find('input', {'class':'required radio'}).get('id')
subjectiveCheckbox = bs4obj.find('input',{'class','required checkbox'}).get('id')
data['subjectiveRadio']= subjectiveRadio # 教室大小合适
data['subjectiveCheckbox']= subjectiveCheckbox # 自己需求和兴趣

post_url = 'https://jwxk.ucas.ac.cn/evaluate/saveCourseEval/'+course_id+'?s='+s
# print(post_url)
res = self._S.post(post_url, data=data,headers=self.headers)
# print(res.text)
tmp = BeautifulSoup(res.text, 'html.parser')
try:
flag = tmp.find('label', attrs={'id': 'loginSuccess'})
Expand All @@ -458,7 +470,9 @@ def _assess_courses(self, course_ids):


def _get_teacher_ids(self):
res = self._S.get(self._urls['teacher_assess_url'])
# 通过课程评估url得到教师评估url
teacher_assess_url = self._course_assess_url.replace('course','teacher')
res = self._S.get(teacher_assess_url)
bs4obj = BeautifulSoup(res.text, 'html.parser')
urls = [url.get('href') for url in bs4obj.find_all('a', {'class': 'btn'})]
teacher_ids = []
Expand All @@ -467,19 +481,22 @@ def _get_teacher_ids(self):
return teacher_ids

def __assess_teacher(self, teacher_id):
res = self._S.get('http://jwxk.ucas.ac.cn/evaluate/evaluateTeacher/' + teacher_id)
res = self._S.get('https://jwxk.ucas.ac.cn/evaluate/evaluateTeacher/' + teacher_id)
bs4obj = BeautifulSoup(res.text,'html.parser')
submit_url = 'http://jwxk.ucas.ac.cn' + bs4obj.find('form',{'id':'regfrm'}).get('action')
post_url = 'https://jwxk.ucas.ac.cn' + bs4obj.find('form',{'id':'regfrm'}).get('action')
radios = bs4obj.find_all('input', attrs={'type': 'radio'})
value = radios[0]['value'] # 默认全5星好评
data = {}
for radio in radios:
data[radio['name']] = value
data['item_43'] = self._assess_msg['item_43'] # 这位老师的教学,你最喜欢什么?
data['item_44'] = self._assess_msg['item_44'] # 您对老师有哪些意见和建议?
data['subjectiveRadio'] = ''
textareas = bs4obj.find_all('textarea')
for textarea, asses_msg in zip(textareas, self._assess_msgs[-2:]):
# 填写主观评价内容
item_id = textarea.get('id')
data[item_id] = asses_msg
data['subjectiveCheckbox'] = ''
res = self._S.post(submit_url,data=data,headers = self.headers)
data['subjectiveRadio'] = ''
res = self._S.post(post_url,data=data,headers = self.headers)
tmp = BeautifulSoup(res.text, 'html.parser')
try:
flag = tmp.find('label', attrs={'id': 'loginSuccess'})
Expand All @@ -506,3 +523,29 @@ def run(self):
teacher_ids = self._get_teacher_ids()
self._assess_teachers(teacher_ids)


class GradeObserver(Loginer):
"""
课程成绩查看器
"""
def __init__(self, user_info,urls):
super().__init__(user_info, urls)
pass

def _get_grade(self):
res = self._S.get(self._urls['grade_url'])
bs4obj = BeautifulSoup(res.text,'html.parser')
thead = bs4obj.find('thead')
pd = PrettyTable()
pd.field_names = [x.string for x in thead.find_all('th')]

tbody = bs4obj.find('tbody')
for tr in tbody.find_all('tr'):
# tr:每一门课程信息
pd.add_row([x.string.strip() for x in tr.find_all('td')])
self._logger.info('成绩查询结果如下')
print(pd)

def run(self):
self._login()
self._get_grade()
28 changes: 12 additions & 16 deletions settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,34 +12,30 @@
'password': '',
'remember': 'undefined' # 此处不要动
}
SOURCE_DIR = ''
SOURCE_DIR = '/Users/dongchaopeng/Documents/学习资料/UCAS-sources'

# ------------------后面的不要动--------------#

ACCOUNTS_PATH = 'accounts.json'
URLS = {
'base_url':'https://jwxk.ucas.ac.cn',
'login_url': 'http://onestop.ucas.ac.cn/Ajax/Login/0',
'logout_url': 'http://sep.ucas.ac.cn/logout?o=platform',
'course_info_url': 'http://sep.ucas.ac.cn/portal/site/16/801',
'scholarship_url': 'http://sep.ucas.ac.cn/portal/site/282',
'zlyh_url': 'http://scholarship.ucas.ac.cn/gmjaward/GmjAlppyDetails_Xs?award_id=123',
'gm_scholar_url': 'http://scholarship.ucas.ac.cn/GmjAward/GmjList_Xs',
'edit_zlyh_url': 'http://scholarship.ucas.ac.cn/GmjAward/GmjAlppyEdit_Xs/12686',
'grade_url':'https://jwxk.ucas.ac.cn/score/yjs/all',
'course_select_url': 'http://sep.ucas.ac.cn/portal/site/226/821',
'course_assess_url': 'http://jwxk.ucas.ac.cn/evaluate/course/59585',
'teacher_assess_url': 'http://jwxk.ucas.ac.cn/evaluate/teacher/59585'
}

# Assess message
ASSESS_MSG = {
'item_14': '这门课讲的真是太好了,我简直没有其他言语可以形容它!!!!', # 这门课我最喜欢什么
'item_15': '我认为这门课做的很好了,课程内容一级棒!!!!!!', # 我认为本课程应从哪些方面需要进一步改进和提高?
'item_16': '我平均每周都认认真真准备这门课的内容,每天超过4小时!!!', # 我平均每周在这门课程上花费多少小时?
'item_17': '我对这个学科领域兴趣甚厚,有如滔滔江水,连绵不绝!!!!', # 在参与这门课之前,我对这个学科领域兴趣如何
'item_18': '我每周都认认真真上课,生怕错过任何一堂课,在课堂上积极发言,踊跃举手,是全班的表率!!!!', # 我对该课程的课堂参与度(包括出勤、回答问题等)
'item_43': '我觉得这个老师讲课十分有趣,课堂氛围十分活跃,是我喜欢的地方!', # 这位老师的教学,你最喜欢什么?
'item_44': '老师简直完美,我对老师的敬仰犹如滔滔江水,连绵不绝!!!!' # 您对老师有哪些意见和建议?
}
ASSESS_MSG = [
'这门课讲的真是太好了,我简直没有其他言语可以形容它!!!!', # 这门课我最喜欢什么
'我认为这门课做的很好了,课程内容一级棒!!!!!!', # 我认为本课程应从哪些方面需要进一步改进和提高?
'我平均每周都认认真真准备这门课的内容,每天超过4小时!!!', # 我平均每周在这门课程上花费多少小时?
'我对这个学科领域兴趣甚厚,有如滔滔江水,连绵不绝!!!!', # 在参与这门课之前,我对这个学科领域兴趣如何
'我每周都认认真真上课,生怕错过任何一堂课,在课堂上积极发言,踊跃举手,是全班的表率!!!!', # 我对该课程的课堂参与度(包括出勤、回答问题等)
'我觉得这个老师讲课十分有趣,课堂氛围十分活跃,是我喜欢的地方!', # 这位老师的教学,你最喜欢什么?
'老师简直完美,我对老师的敬仰犹如滔滔江水,连绵不绝!!!!' # 您对老师有哪些意见和建议?
]


# Do not download list
Expand Down

0 comments on commit 63c99f5

Please sign in to comment.