jwxt()
1. 将 jwxt() 移动到 njupt_api 下,实现根据设置选择教务系统登录方式。 2. 将 api_router.py 和 mcp_router.py 中的对 ZhengFang() 的调用全部替换为对 jwxt() 的调用。
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from .createcourse import create_course_schedule
|
||||
from .lib import jwxt
|
||||
from .sso import SSO
|
||||
from .types import Course, course_dict_serializer, course_list_serializer
|
||||
from .zhengfang import ZhengFang
|
||||
@@ -10,4 +11,5 @@ __all__ = [
|
||||
course_dict_serializer,
|
||||
course_list_serializer,
|
||||
ZhengFang,
|
||||
jwxt,
|
||||
]
|
||||
|
||||
2
njupt_api/zhengfang/exc.py
Normal file
2
njupt_api/zhengfang/exc.py
Normal file
@@ -0,0 +1,2 @@
|
||||
class LoginError(Exception):
|
||||
pass
|
||||
40
njupt_api/zhengfang/lib.py
Normal file
40
njupt_api/zhengfang/lib.py
Normal file
@@ -0,0 +1,40 @@
|
||||
from contextlib import asynccontextmanager
|
||||
from typing import AsyncGenerator
|
||||
|
||||
from ..baselib import config
|
||||
from .exc import LoginError
|
||||
from .sso import SSO
|
||||
from .zhengfang import ZhengFang
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def jwxt(username: str, password: str) -> AsyncGenerator[ZhengFang, None]:
|
||||
"""
|
||||
根据设置,选择 SSO 登录教务系统或直接登录教务系统。
|
||||
|
||||
Args:
|
||||
username: 用户名,str
|
||||
password: 密码,str
|
||||
|
||||
Yields:
|
||||
zf: ZhengFang
|
||||
|
||||
Raises:
|
||||
LoginError: 登录失败,包含下层返回的提示信息。
|
||||
"""
|
||||
try:
|
||||
if config.get("schedule", "jwxt_login_method", "sso"):
|
||||
sso = SSO()
|
||||
await sso.start()
|
||||
await sso.login(username, password)
|
||||
zf = await ZhengFang.init_from_sso(sso)
|
||||
else:
|
||||
zf = ZhengFang()
|
||||
await zf.start()
|
||||
await zf.login(username, password)
|
||||
except LoginError as e:
|
||||
raise e
|
||||
else:
|
||||
yield zf
|
||||
await zf.close()
|
||||
return
|
||||
@@ -1,5 +1,7 @@
|
||||
from njupt_api.baselib import PlayContextManager, logger
|
||||
|
||||
from .exc import LoginError
|
||||
|
||||
|
||||
class SSO(PlayContextManager):
|
||||
def __init__(self) -> None:
|
||||
@@ -14,6 +16,9 @@ class SSO(PlayContextManager):
|
||||
|
||||
Returns:
|
||||
bool,表明判登录是否成功。
|
||||
|
||||
Raises:
|
||||
LoginError: 登录失败,暂时不包含任何提示信息……
|
||||
"""
|
||||
await self.page.goto("http://i.njupt.edu.cn/")
|
||||
|
||||
@@ -24,7 +29,7 @@ class SSO(PlayContextManager):
|
||||
await self.page.wait_for_load_state("networkidle")
|
||||
if "user-login" in self.page.url:
|
||||
logger.error(f"{username} | 登录失败,请检查学号和密码是否正确。")
|
||||
return False
|
||||
raise LoginError("unknown")
|
||||
|
||||
logger.info(f"{username} | 登录南邮统一身份认证成功。")
|
||||
self.isLogin = True
|
||||
|
||||
@@ -2,9 +2,11 @@ from ddddocr import DdddOcr
|
||||
from playwright.async_api import Browser, BrowserContext, Page, Playwright
|
||||
|
||||
from njupt_api.baselib import PlayContextManager, logger
|
||||
from njupt_api.zhengfang import Course
|
||||
from njupt_api.zhengfang.createcourse import create_course_schedule
|
||||
from njupt_api.zhengfang.sso import SSO
|
||||
|
||||
from .createcourse import create_course_schedule
|
||||
from .exc import LoginError
|
||||
from .sso import SSO
|
||||
from .types import Course
|
||||
|
||||
|
||||
class ZhengFang(PlayContextManager):
|
||||
@@ -28,7 +30,10 @@ class ZhengFang(PlayContextManager):
|
||||
使用用户名和密码实现教务系统登录。
|
||||
|
||||
Returns:
|
||||
bool,表明登录是否成功。
|
||||
bool,表明登录是否成功。
|
||||
|
||||
Raises:
|
||||
LoginError: 登录失败,包含提示信息
|
||||
"""
|
||||
await self.page.goto("http://jwxt.njupt.edu.cn")
|
||||
|
||||
@@ -58,7 +63,7 @@ class ZhengFang(PlayContextManager):
|
||||
return await self.login(username, password)
|
||||
await dialog.accept()
|
||||
logger.error(f"{username} | 登录失败,教务系统提示信息为: {dialog.message}")
|
||||
return False
|
||||
raise LoginError(dialog.message)
|
||||
|
||||
async def get_class_schedule(self) -> list[Course]:
|
||||
await self.page.locator("a.top_link:has-text('公用信息')").click()
|
||||
|
||||
Reference in New Issue
Block a user