Skip to content

Commit

Permalink
fix:修复评估和分数查询失败的bug
Browse files Browse the repository at this point in the history
  • Loading branch information
GentleCP committed Sep 14, 2020
1 parent f0e6b33 commit 3135491
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 51 deletions.
23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
# UCAS Helper
![python version](https://img.shields.io/badge/python-3.5%2B-blue)
![demo version](https://img.shields.io/badge/version-2.0.1-yellowgreen)

![demo version](https://img.shields.io/badge/version-2.0.2-yellowgreen)
```angular2
*********************************************************************************
** # # ### # ### # # ### # ### ### #### **
** # # # # # # # # # # # # # # # **
** # # # # # #### #### ### # ### ### #### **
** # # # ####### # # # # # # # # # **
** ### ### ## ## ### # # ### ##### # ### # # **
** copyright@GentleCP **
** version: 2.0.2 **
** github: https://github.com/GentleCP/UCASHelper **
** 1:course sources download **
** 2:wifi login **
** 3:wifi logout **
** 4:course assess **
** 5:query grades **
** q:exit **
*********************************************************************************
```
目录
=================

Expand Down Expand Up @@ -74,7 +91,7 @@
![](img/1.7.0.png)

# 2. 更新日志

- [2.0.2] 修复了因课程网站选课系统添加头部检查导致的**课程评估,分数查询**功能的失效。
- [2.0.1] 对整体代码进行了重构,解决因课程网站`http`,`https`协议切换导致的访问出错问题,
同时更改了项目接口,方便小白和专业人士操作。以前均通过可视化`UI`界面进行操作,现在用户可选择`UI`和命令行两种模式,具体见**5.部署使用**
对各个功能测试结果如下:
Expand Down
28 changes: 8 additions & 20 deletions core/assess.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,36 +27,24 @@ def __init__(self, user_info, urls,assess_msgs):
super().__init__(user_info, urls)
self._logger = logging.getLogger("Assesser")
self._assess_msgs = assess_msgs
self.headers = {
'Connection': 'keep-alive',
'Accept': '*/*',
'Origin': 'http://jwxk.ucas.ac.cn',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'http://jwxk.ucas.ac.cn/evaluate/evaluateCourse/165683',
'Accept-Encoding': 'gzip, deflate',
'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):
# 获取课程评估url
try:
res = self._S.get(url=self._urls['view_url']['http'],timeout=5)
res = self._S.get(url=self._urls['view_url']['http'], headers=self.headers, timeout=5)
except requests.Timeout:
res = self._S.get(url=self._urls['view_url']['https'])

res = self._S.get(url=self._urls['view_url']['https'], headers=self.headers)
bs4obj = BeautifulSoup(res.text,'html.parser')
href = bs4obj.find('a',string=re.compile('.*学期$')).get('href')
self._course_assess_url = self._urls['base_url']['http'] + href
# 获取课程id
try:
res = self._S.get(self._course_assess_url,timeout=5)
res = self._S.get(self._course_assess_url, headers=self.headers, timeout=5)
except requests.Timeout:
self._course_assess_url = self._urls['base_url']['https'] + href
res = self._S.get(self._course_assess_url)
res = self._S.get(self._course_assess_url, headers=self.headers)

bs4obj = BeautifulSoup(res.text, 'html.parser')
urls = [url.get('href') for url in bs4obj.find_all('a', {'class': 'btn'})]
Expand All @@ -67,9 +55,9 @@ def _get_course_ids(self):

def __assess_course(self,course_id):
try:
res = self._S.get(self._urls['base_evaluateCourse_url']['http'] + course_id,timeout=5)
res = self._S.get(self._urls['base_evaluateCourse_url']['http'] + course_id, headers=self.headers, timeout=5)
except requests.Timeout:
res = self._S.get(self._urls['base_evaluateCourse_url']['https'] + course_id)
res = self._S.get(self._urls['base_evaluateCourse_url']['https'] + course_id, headers=self.headers)

s = res.text.split('?s=')[-1].split('"')[0]
bs4obj = BeautifulSoup(res.text, 'html.parser')
Expand Down Expand Up @@ -127,9 +115,9 @@ def _get_teacher_ids(self):

def __assess_teacher(self, teacher_id):
try:
res = self._S.get(self._urls['base_evaluateTeacher_url']['http'] + teacher_id,timeout=5)
res = self._S.get(self._urls['base_evaluateTeacher_url']['http'] + teacher_id, headers=self.headers, timeout=5)
except requests.Timeout:
res = self._S.get(self._urls['base_evaluateTeacher_url']['https'] + teacher_id)
res = self._S.get(self._urls['base_evaluateTeacher_url']['https'] + teacher_id, headers=self.headers)

bs4obj = BeautifulSoup(res.text,'html.parser')
radios = bs4obj.find_all('input', attrs={'type': 'radio'})
Expand Down
14 changes: 7 additions & 7 deletions core/download.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def _recur_dir(self,course_info, source_url, bs4obj):
'itemCanRevise': 'false',
'sakai_csrf_token': csrf_token
}
res = self._S.post(source_url, data=data) # 获取文件夹下资源信息
res = self._S.post(source_url, data=data,headers=self.headers) # 获取文件夹下资源信息
bs4obj = BeautifulSoup(res.text, 'html.parser')
self._recur_dir(course_info, source_url, bs4obj)

Expand All @@ -100,16 +100,16 @@ def _set_course_info(self):
if not self._l_course_info:
# 减少后续多次请求课程信息耗时
try:
res = self._S.get(url=self._urls['course_info_url']['http'],timeout=5)
res = self._S.get(url=self._urls['course_info_url']['http'], headers=self.headers, timeout=5)
except requests.Timeout:
res = self._S.get(url=self._urls['course_info_url']['https'])
res = self._S.get(url=self._urls['course_info_url']['https'], headers=self.headers)

bsobj = BeautifulSoup(res.text, "html.parser")
refresh_url = bsobj.find("noscript").meta.get("content")[6:] # 获取新的定向url
res = self._S.get(refresh_url)
res = self._S.get(refresh_url,headers=self.headers)
bsobj = BeautifulSoup(res.text, "html.parser")
new_course_url = bsobj.find('a', {"title": "我的课程 - 查看或加入站点"}).get("href") # 获取到新的课程信息url
res = self._S.get(new_course_url)
res = self._S.get(new_course_url,headers=self.headers)
bsobj = BeautifulSoup(res.text, "html.parser")
course_list = bsobj.findAll('tr') # 尚未筛选的杂乱信息
i = 1
Expand All @@ -130,10 +130,10 @@ def _set_source_info(self, course_info):
'''
if not self._d_source_info[course_info["name"]]:
# 该门课的资源信息尚未存储到内存
res = self._S.get(course_info["url"])
res = self._S.get(course_info["url"],headers=self.headers)
bs4obj = BeautifulSoup(res.text, "html.parser")
source_url = bs4obj.find('a', {'title': '资源 - 上传、下载课件,发布文档,网址等信息'}).get("href")
res = self._S.get(source_url) # 获取课程资源页面
res = self._S.get(source_url,headers=self.headers) # 获取课程资源页面
bs4obj = BeautifulSoup(res.text, "html.parser")

self._recur_dir(course_info,source_url,bs4obj)
Expand Down
5 changes: 3 additions & 2 deletions core/grade.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ def __init__(self, user_info, urls):

def _get_grade(self):
try:
res = self._S.get(self._urls['grade_url']['http'],timeout=5)
res = self._S.get(self._urls['grade_url']['http'],headers=self.headers, timeout=5)
except requests.Timeout:
res = self._S.get(self._urls['grade_url']['https'])
res = self._S.get(self._urls['grade_url']['https'],headers=self.headers)

bs4obj = BeautifulSoup(res.text, 'html.parser')
thead = bs4obj.find('thead')
Expand All @@ -49,6 +49,7 @@ def run(self):
self.login()
self._get_grade()


import settings

if __name__ =='__main__':
Expand Down
30 changes: 15 additions & 15 deletions core/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@ def __init__(self, user_info, urls):
self._S = requests.session()
self._user_info = user_info
self._urls = urls
self.headers = {
'Connection': 'keep-alive',
'Accept': '*/*',
'Origin': 'http://jwxk.ucas.ac.cn',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'http://jwxk.ucas.ac.cn/evaluate/evaluateCourse/165683',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
}

def __keep_session(self):
try:
Expand All @@ -36,23 +47,11 @@ def __keep_session(self):
res = self._S.get(url=self._urls['course_select_url']['https'])
course_select_url = re.search(r"window.location.href='(?P<course_select_url>.*?)'", res.text).groupdict().get(
"course_select_url")
# print(course_select_url)
self._S.get(course_select_url)
self._S.get(course_select_url,headers=self.headers)

def login(self):
headers = {
'Connection': 'keep-alive',
'Accept': '*/*',
'Origin': 'http://onestop.ucas.ac.cn',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'http://onestop.ucas.ac.cn/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
try:
res = self._S.post(url=self._urls["login_url"]['http'], data=self._user_info, headers=headers, timeout=5)
res = self._S.post(url=self._urls["login_url"]['http'], data=self._user_info, headers=self.headers, timeout=10)

except (requests.exceptions.ConnectionError,
requests.exceptions.ConnectTimeout,
Expand All @@ -64,14 +63,15 @@ def login(self):
if res.status_code == 200:
json_res = res.json()
else:
res = self._S.post(url=self._urls["login_url"]['https'], data=self._user_info, headers=headers, timeout=5)
res = self._S.post(url=self._urls["login_url"]['https'], data=self._user_info, headers=self.headers, timeout=5)
json_res = res.json()

if json_res["f"]:
self._S.get(res.json()["msg"])
self._logger.info("sep登录成功!")
self.__keep_session()


else:
self._logger.error("sep登录失败,请检查settings下的USER_INFO是否正确!")
exit(401)
Expand Down
3 changes: 1 addition & 2 deletions core/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
** # # # ####### # # # # # # # # # **
** ### ### ## ## ### # # ### ##### # ### # # **
** copyright@GentleCP **
** version: 2.0.1 **
** version: 2.0.2 **
** github: https://github.com/GentleCP/UCASHelper **
** 1:course sources download **
** 2:wifi login **
Expand All @@ -48,7 +48,6 @@ def __init__(self,
assesser= None,
gradeObserver = 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 = wifiLoginer
Expand Down
7 changes: 5 additions & 2 deletions ucashelper.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import sys
import click
import logging

from core import ui
from core.wifi import AccHacker
Expand All @@ -17,10 +18,12 @@

import settings


@click.group()
def start():
"""UCASHelper is a useful tool for UCASer, following are the argumentss that you could choose"""

"""UCASHelper is a useful tool for UCASer, following are the arguments that you could choose"""
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(filename)s - %(lineno)d:[%(message)s]')

@click.command(name='ui',help='Get UI interface of UCASHelper')
def UI():
Expand Down

0 comments on commit 3135491

Please sign in to comment.