diff --git a/automation/secsion.py b/automation/secsion.py index bb806e8..2e3158c 100644 --- a/automation/secsion.py +++ b/automation/secsion.py @@ -50,7 +50,8 @@ class SecsionDownloader: args=[ "--disable-dev-shm-usage", "--disable-gpu", - "--no-sandbox" + "--no-sandbox", + "--ignore-certificate-errors" ] ) context = await browser.new_context( @@ -191,6 +192,18 @@ class SecsionDownloader: page.on("response", on_response) + # 监控弹窗(导出可能在新窗口打开下载链接) + popup_pages = [] + + async def handle_popup(popup): + popup_pages.append(popup) + logger.info(f"检测到弹窗: {popup.url}") + # 弹窗的 SSL 拦截也要处理 + await popup.wait_for_load_state("domcontentloaded", timeout=15000) + await self._bypass_ssl_interstitial(popup) + + page.on("popup", handle_popup) + # 记录下载目录现有文件(用于兜底检测) existing_files = set(os.listdir(self.download_dir)) if os.path.exists(self.download_dir) else set() @@ -203,9 +216,16 @@ class SecsionDownloader: await export_btn.click() logger.info("等待文件下载中...") - # 点击导出后,可能弹出 SSL 证书过期拦截页面 + # 等待弹窗出现 + await asyncio.sleep(2) + + # 先处理主页面 SSL 拦截 await self._bypass_ssl_interstitial(page) + # 再处理所有弹窗 + for popup in popup_pages: + await self._bypass_ssl_interstitial(popup) + download = await download_info.value filename = download.suggested_filename save_path = os.path.join(self.download_dir, filename) @@ -214,24 +234,29 @@ class SecsionDownloader: return save_path except Exception as download_err: - # Playwright download 事件未触发,尝试 SSL 绕过后再等 logger.warning(f"Playwright 下载事件捕获失败: {download_err}") - # 二次尝试:可能 SSL 页面刚出现,再尝试绕过 - bypassed = await self._bypass_ssl_interstitial(page) - if bypassed: - logger.info("SSL 拦截已绕过,等待下载...") + # 处理所有已知页面的 SSL 拦截 + all_pages = [page] + popup_pages + [p for p in page.context.pages if p != page] + for p in all_pages: try: - async with page.expect_download(timeout=30000) as dl_info: + await self._bypass_ssl_interstitial(p) + except Exception: + pass + + # 绕过 SSL 后重新等待下载 + for p in all_pages: + try: + async with p.expect_download(timeout=15000) as dl_info: pass download = await dl_info.value filename = download.suggested_filename save_path = os.path.join(self.download_dir, filename) await download.save_as(save_path) - logger.info(f"SSL 绕过后下载成功: {save_path}") + logger.info(f"SSL 绕过后从页面下载成功: {save_path}") return save_path except Exception: - logger.warning("SSL 绕过后仍未触发下载事件") + continue logger.info("尝试文件系统兜底检测...")