From c96cbf086ebd64a6a7abdf01168813831f9e4df7 Mon Sep 17 00:00:00 2001 From: MangoFanFanw Date: Tue, 21 Apr 2026 22:05:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Headless=20=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E4=BD=BF=E7=94=A8=20SSO=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 判断为 NJUPT 的 SSO 统一身份认证拥有更严格的反爬设计,因此在 kimi 的帮助下设置了更拟真的浏览器特征。 --- njupt_api/baselib/playcontextmanager.py | 15 ++++++++++++++- njupt_api/zhengfang/sso.py | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/njupt_api/baselib/playcontextmanager.py b/njupt_api/baselib/playcontextmanager.py index 08766f6..abca442 100644 --- a/njupt_api/baselib/playcontextmanager.py +++ b/njupt_api/baselib/playcontextmanager.py @@ -3,6 +3,7 @@ from playwright.async_api import ( BrowserContext, Page, Playwright, + ViewportSize, async_playwright, ) @@ -29,6 +30,7 @@ class PlayContextManager: self.playwright = await async_playwright().start() # 不是 __enter__ self.browser = await self.playwright.chromium.launch( headless=config.get("schedule", "playwright_headless", True), + channel="chromium", args=[ "--disable-blink-features=AutomationControlled", "--no-sandbox", @@ -38,7 +40,18 @@ class PlayContextManager: "--no-proxy-server", ], ) - self.context = await self.browser.new_context() + self.context = await self.browser.new_context( + user_agent=( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" + ), + viewport=ViewportSize(width=1920, height=1080), + locale="zh-CN", + timezone_id="Asia/Shanghai", + extra_http_headers={ + "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", + }, + ) self.page = await self.context.new_page() async def __aenter__(self) -> "PlayContextManager": diff --git a/njupt_api/zhengfang/sso.py b/njupt_api/zhengfang/sso.py index 3affbac..06eea27 100644 --- a/njupt_api/zhengfang/sso.py +++ b/njupt_api/zhengfang/sso.py @@ -27,9 +27,10 @@ class SSO(PlayContextManager): await self.page.click('button[type="button"]') await self.page.wait_for_load_state("networkidle") + await self.page.wait_for_timeout(2000) if "user-login" in self.page.url: logger.error(f"{username} | 登录失败,请检查学号和密码是否正确。") - raise LoginError("unknown") + raise LoginError("SSO 登录未成功,可能是学号密码错误,请重试。") logger.info(f"{username} | 登录南邮统一身份认证成功。") self.isLogin = True