diff --git a/cqwu/methods/xg/__init__.py b/cqwu/methods/xg/__init__.py index fbc3092..66a9ee9 100644 --- a/cqwu/methods/xg/__init__.py +++ b/cqwu/methods/xg/__init__.py @@ -1,9 +1,36 @@ +import cqwu + from .get_cp import GetCP +from .get_public_cp import GetPublicCP from .get_score import GetScore +from ...errors import CookieError class XG( GetCP, + GetPublicCP, GetScore, ): - pass + async def oauth_xg( + self: "cqwu.Client", + ): + url = "http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/*default/index.do#/cjcx" + html = await self.oauth(url) + if not html: + raise CookieError() + if html.url != url: + raise CookieError() + url = "http://xg.cqwu.edu.cn/xsfw/sys/swpubapp/indexmenu/getAppConfig.do" + headers = { + 'Accept': '*/*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,hu;q=0.5', + 'Connection': 'keep-alive', + 'Referer': 'http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/*default/index.do', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51', + } + params = { + 'appId': '5275772372599202', + 'appName': 'zhcptybbapp', + 'v': '021534151969418724', + } + await self.request.get(url, headers=headers, params=params) diff --git a/cqwu/methods/xg/get_cp.py b/cqwu/methods/xg/get_cp.py index 1b7564e..3644b46 100644 --- a/cqwu/methods/xg/get_cp.py +++ b/cqwu/methods/xg/get_cp.py @@ -16,26 +16,7 @@ class GetCP: """ 获取综合测评结果 """ xue_nian = year or self.xue_nian xue_qi = semester or self.xue_qi - url = "http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/*default/index.do#/cjcx" - html = await self.oauth(url) - if not html: - raise CookieError() - if html.url != url: - raise CookieError() - url = "http://xg.cqwu.edu.cn/xsfw/sys/swpubapp/indexmenu/getAppConfig.do" - headers = { - 'Accept': '*/*', - 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,hu;q=0.5', - 'Connection': 'keep-alive', - 'Referer': 'http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/*default/index.do', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51', - } - params = { - 'appId': '5275772372599202', - 'appName': 'zhcptybbapp', - 'v': '021534151969418724', - } - await self.request.get(url, headers=headers, params=params) + await self.oauth_xg() url = "http://xg.cqwu.edu.cn/xsfw/sys/emapcomponent/imexport/export.do" headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', diff --git a/cqwu/methods/xg/get_public_cp.py b/cqwu/methods/xg/get_public_cp.py new file mode 100644 index 0000000..785b83b --- /dev/null +++ b/cqwu/methods/xg/get_public_cp.py @@ -0,0 +1,70 @@ +from typing import List + +import cqwu +from cqwu.errors import CookieError +from cqwu.types.cp import CPGS, PublicCPRaw + + +class GetPublicCP: + async def get_public_cp( + self: "cqwu.Client", + page_size: int = 999, + page_number: int = 1, + total: bool = True, + ) -> List[PublicCPRaw]: + """ 获取综合测评公示结果 """ + await self.oauth_xg() + + async def get_public_cp_raw(page_size_: int, page_number_: int) -> CPGS: + url = "http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/modules/cpgs/cpgs_cpgsbg.do" + headers = { + 'Accept': 'application/json, text/javascript, */*; q=0.01', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,hu;q=0.5', + 'Connection': 'keep-alive', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Origin': 'http://xg.cqwu.edu.cn', + 'Referer': 'http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/*default/index.do', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51', + 'X-Requested-With': 'XMLHttpRequest', + } + data = { + 'querySetting': '[]', + 'pageSize': str(page_size_), + 'pageNumber': str(page_number_), + } + html = await self.request.post(url, headers=headers, data=data) + if html.status_code != 200: + raise CookieError() + html_data = html.json() + html_raw_data = html_data.get("datas", {}).get("cpgs_cpgsbg", {}) + return ( + CPGS(**html_raw_data) + if html_raw_data + else CPGS( + totalSize=0, + pageNumber=page_number_, + pageSize=page_size_, + rows=[], + ) + ) + + return_datas: List[PublicCPRaw] = [] + if total: + page_size = 999 + page_number = 1 + while True: + html_raw_datas = await get_public_cp_raw(page_size, page_number) + if len(html_raw_datas.rows) == 0: + break + return_datas.extend(html_raw_datas.rows) + if html_raw_datas.totalSize == 0: + break + elif html_raw_datas.pageNumber * html_raw_datas.pageSize >= html_raw_datas.totalSize: + break + else: + page_number += 1 + else: + html_raw_datas = await get_public_cp_raw(page_size, page_number) + if len(html_raw_datas.rows) != 0: + return_datas.extend(html_raw_datas.rows) + return return_datas diff --git a/cqwu/methods/xg/get_score.py b/cqwu/methods/xg/get_score.py index 3048b9f..68be678 100644 --- a/cqwu/methods/xg/get_score.py +++ b/cqwu/methods/xg/get_score.py @@ -1,9 +1,7 @@ -import json from typing import List import cqwu from cqwu import types -from cqwu.errors.auth import CookieError class GetScore: @@ -20,14 +18,7 @@ class GetScore: """ year = year or self.xue_nian semester = semester or self.xue_qi - url = "http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/*default/index.do#/cjcx" - html = await self.oauth(url) - if not html: - raise CookieError() - if html.url != url: - raise CookieError() - await self.request.get( - "http://xg.cqwu.edu.cn/xsfw/sys/swpubapp/indexmenu/getAppConfig.do?appId=5275772372599202&appName=zhcptybbapp&v=046351851777942055") + await self.oauth_xg() query_url = "http://xg.cqwu.edu.cn/xsfw/sys/zhcptybbapp/modules/cjcx/cjcxbgdz.do" headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', diff --git a/cqwu/types/cp.py b/cqwu/types/cp.py index 59c6385..7975559 100644 --- a/cqwu/types/cp.py +++ b/cqwu/types/cp.py @@ -1,3 +1,5 @@ +from typing import List + from pydantic import BaseModel @@ -17,3 +19,103 @@ class CP(BaseModel): wtsz: float zysz_class_rank: int zysz_grade_rank: int + + +class PublicCPRaw(BaseModel): + XH: str + XM: str + DWDM_DISPLAY: str + ZYDM_DISPLAY: str + BJDM_DISPLAY: str + ZCJ: float + BJPM: int + ZYNJPM: int + FS1: float + FS10: float + FS11: float + FS12: float + DYYSCJ: str + WTYSCJ: str + CXYSCJ: str + + @property + def id(self) -> int: + """ 学号 """ + return int(self.XH) + + @property + def name(self) -> str: + """ 姓名 """ + return self.XM + + @property + def yuan_xi(self) -> str: + """ 院系 """ + return self.DWDM_DISPLAY + + @property + def zhuan_ye(self) -> str: + """ 专业 """ + return self.ZYDM_DISPLAY + + @property + def class_name(self) -> str: + """ 班级 """ + return self.BJDM_DISPLAY + + @property + def total_score(self) -> float: + """ 总成绩 """ + return float(self.ZCJ) + + @property + def class_rank(self) -> int: + """ 班级排名 """ + return int(self.BJPM) + + @property + def grade_rank(self) -> int: + """ 专业年级排名 """ + return int(self.ZYNJPM) + + @property + def dysz(self) -> float: + """ 德育素质分 """ + return float(self.FS1) + + @property + def zysz(self) -> float: + """ 智育素质测评 """ + return float(self.FS10) + + @property + def cxsz(self) -> float: + """ 创新素质测评 """ + return float(self.FS11) + + @property + def wtsz(self) -> float: + """ 文体素质 """ + return float(self.FS12) + + @property + def dysz_raw(self) -> float: + """ 德育原始成绩 """ + return float(self.DYYSCJ) + + @property + def wtsz_raw(self) -> float: + """ 文体原始成绩 """ + return float(self.WTYSCJ) + + @property + def cxsz_raw(self) -> float: + """ 创新原始成绩 """ + return float(self.CXYSCJ) + + +class CPGS(BaseModel): + totalSize: int + pageNumber: int + pageSize: int + rows: List[PublicCPRaw] diff --git a/setup.py b/setup.py index 975d861..e4d7d42 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh: setuptools.setup( name="cqwu", # 用自己的名替换其中的YOUR_USERNAME_ - version="0.0.9", # 包版本号,便于维护版本 + version="0.0.10", # 包版本号,便于维护版本 author="omg-xtao", # 作者,可以写自己的姓名 author_email="xtao@xtaolink.cn", # 作者联系方式,可写自己的邮箱地址 description="A cqwu ehall client.", # 包的简述