diff --git a/browser_login/login.py b/browser_login/login.py index 294e68c..24866a5 100644 --- a/browser_login/login.py +++ b/browser_login/login.py @@ -44,6 +44,7 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: co = ChromiumOptions() # 强制在生产环境下使用无头模式 is_docker = os.path.exists('/.dockerenv') + if headless or is_docker: co.set_argument("--headless=new") co.set_argument("--disable-gpu") # Docker 无头模式下强烈建议禁用 GPU,防止 404 和渲染崩溃 @@ -57,13 +58,24 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: if is_docker: # Docker 生产环境:每次启动分配随机端口,避免前一个僵尸进程占用导致 404 co.auto_port(True) - # 指定 Docker 内的 Chromium 路径,确保 DrissionPage 不会去找不存在的默认路径 - co.set_browser_path('/usr/bin/chromium') + # 很多 Debian/Ubuntu 系统的 Chromium 实际上是通过 wrapper 脚本调用的 + # 直接指定确切的执行路径,防止 DrissionPage 底层启动失败 + if os.path.exists('/usr/bin/chromium'): + co.set_browser_path('/usr/bin/chromium') + elif os.path.exists('/usr/bin/chromium-browser'): + co.set_browser_path('/usr/bin/chromium-browser') + elif os.path.exists('/usr/bin/google-chrome'): + co.set_browser_path('/usr/bin/google-chrome') else: # 本地开发环境:使用固定端口,方便复用 co.set_local_port(port) - return ChromiumPage(co) + try: + page = ChromiumPage(co) + return page + except Exception as e: + log("ERR", f"浏览器初始化失败: {e}") + raise # ── Vue 表单专用输入(JS setter + 模拟键盘) ──────────────────────────────────