From 3135491eaf34d0c54a2afeb4e1cd8cf7761222f1 Mon Sep 17 00:00:00 2001 From: GentleCP <574881148@qq.com> Date: Mon, 14 Sep 2020 21:46:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=AF=84=E4=BC=B0?= =?UTF-8?q?=E5=92=8C=E5=88=86=E6=95=B0=E6=9F=A5=E8=AF=A2=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 ++++++++++++++++++++--- core/assess.py | 28 ++++++++-------------------- core/download.py | 14 +++++++------- core/grade.py | 5 +++-- core/login.py | 30 +++++++++++++++--------------- core/ui.py | 3 +-- ucashelper.py | 7 +++++-- 7 files changed, 59 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 58b92bf..63911bc 100644 --- a/README.md +++ b/README.md @@ -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 ** +********************************************************************************* +``` 目录 ================= @@ -74,7 +91,7 @@ ![](img/1.7.0.png) # 2. 更新日志 - +- [2.0.2] 修复了因课程网站选课系统添加头部检查导致的**课程评估,分数查询**功能的失效。 - [2.0.1] 对整体代码进行了重构,解决因课程网站`http`,`https`协议切换导致的访问出错问题, 同时更改了项目接口,方便小白和专业人士操作。以前均通过可视化`UI`界面进行操作,现在用户可选择`UI`和命令行两种模式,具体见**5.部署使用**。 对各个功能测试结果如下: diff --git a/core/assess.py b/core/assess.py index 4d35e0a..e04c950 100644 --- a/core/assess.py +++ b/core/assess.py @@ -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.*?)$') 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'})] @@ -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') @@ -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'}) diff --git a/core/download.py b/core/download.py index b42f70c..85c689b 100644 --- a/core/download.py +++ b/core/download.py @@ -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) @@ -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 @@ -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) diff --git a/core/grade.py b/core/grade.py index f6a9a15..269c9d8 100644 --- a/core/grade.py +++ b/core/grade.py @@ -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') @@ -49,6 +49,7 @@ def run(self): self.login() self._get_grade() + import settings if __name__ =='__main__': diff --git a/core/login.py b/core/login.py index 1a8d09e..a6f08c5 100644 --- a/core/login.py +++ b/core/login.py @@ -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: @@ -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.*?)'", 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, @@ -64,7 +63,7 @@ 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"]: @@ -72,6 +71,7 @@ def login(self): self._logger.info("sep登录成功!") self.__keep_session() + else: self._logger.error("sep登录失败,请检查settings下的USER_INFO是否正确!") exit(401) diff --git a/core/ui.py b/core/ui.py index a976728..f605666 100644 --- a/core/ui.py +++ b/core/ui.py @@ -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 ** @@ -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 diff --git a/ucashelper.py b/ucashelper.py index 13d9632..9987728 100644 --- a/ucashelper.py +++ b/ucashelper.py @@ -7,6 +7,7 @@ import sys import click +import logging from core import ui from core.wifi import AccHacker @@ -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():