From 04d562745f09956630d8ce4017d18339e5b556b3 Mon Sep 17 00:00:00 2001 From: taojianmin Date: Mon, 14 Sep 2026 18:23:06 +0800 Subject: [PATCH] chore: auto release commit (2026-09-14 18:23:05) --- CHANGELOG.md | 9 ++++++ SKILL.md | 2 +- scripts/service/platform_collector.py | 43 ++++++++++++++++++++------- scripts/util/constants.py | 2 +- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a2aecd..cabdc34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ 本文件对应技能市场 **「更新日志」** Tab。 +## 1.1.10 + +- **RPA 已登录态检测优化(profile cookie 复用零打扰)** + - **SPA_HOME 探针时延长等待**:从 `POST_LOGIN_SETTLE_MS=2s` 改为 `SPA_HYDRATION_MS=3s`,sandbox SPA 异步验证 cookie 时间更充分,避免误判未登录 + - **`_fill_spa_login` 入口先检测 `_is_logged_in`**:已登录态直接 `return True` 跳过自动 fill,不再强制 demo fill 破坏 session + - **fill 后再检测 `_is_logged_in`**:避免 sandbox demo 凭据失效时 URL 跳 `/app/home` 但 cookie 没写入的误判 + - **用户反馈驱动**:用户要求「如果已经登录了不需要用户再登录」—— v1.1.8/v1.1.9 的探针逻辑在 sandbox SPA 异步验证 cookie 时机不准时仍会触发 fallback 手工登录;本次彻底修掉 + - 实跑(2026-09-14):profile 已登录态下,`collect-from-platform --show-browser --limit 1` **完全静默自动跑**(无 `[登录]` 提示、无弹窗打扰),13 秒抓 3 行 + 卡片 381 字 + 落库 + ## 1.1.9 - **RPA headed 模式改用系统 Edge(解决浏览器弹窗不可见)** diff --git a/SKILL.md b/SKILL.md index ae4a5d9..0bce66a 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,7 +1,7 @@ --- name: 合同到期智能预警与续聘辅助 description: "每日凌晨扫描全校教职工合同电子台账,对距离到期日 90/60/30 天的合同分级预警,并自动生成《续聘准备任务书》和《本月合同到期人员清单》。" -version: 1.1.9 +version: 1.1.10 author: 深圳匠厂科技有限公司 metadata: openclaw: diff --git a/scripts/service/platform_collector.py b/scripts/service/platform_collector.py index 5565196..8101e7d 100644 --- a/scripts/service/platform_collector.py +++ b/scripts/service/platform_collector.py @@ -232,12 +232,22 @@ def _fill_spa_login(page, settle_ms: int = SPA_LOGIN_SETTLE_MS) -> bool: 返回是否执行了登录(True = 已点登录按钮且 URL 已跳离 login;调用方可继续后续流程)。 失败时**不抛异常**,由调用方决定是否 fallback 到 _wait_for_manual_login。 + v1.1.10 关键修复:**先检测 _is_logged_in,已登录态直接 return True 不再 fill**。 + 之前没这个检查,profile 复用时会被强制 demo fill 破坏 session。 + 修复要点(v1.1.5/v1.1.6 登录时间太短导致采集不到数据): - 默认 settle_ms = SPA_LOGIN_SETTLE_MS(4000ms),给 SPA 异步渲染 + token 写入 cookie 时间 - 等 username input 的 timeout = SPA_LOGIN_INPUT_TIMEOUT_MS(20s) - click 按钮后 wait_for_url timeout = SPA_LOGIN_URL_TIMEOUT_MS(30s) - 多处过渡路径(/login, /signin, /auth/)一并判断 """ + # v1.1.10:先检查是否已登录(profile cookie 复用场景),已登录直接 return True + if _is_logged_in(page): + logger.info( + "platform_collector: 已登录态(profile cookie 复用),跳过自动 fill" + ) + return True + url_lower = page.url.lower() if "/login" not in url_lower and "/signin" not in url_lower and "/auth/" not in url_lower: return False @@ -270,6 +280,13 @@ def _fill_spa_login(page, settle_ms: int = SPA_LOGIN_SETTLE_MS) -> bool: except Exception as e: logger.warning("SPA 登录超时: %s;当前 URL=%s", e, page.url) return False + # v1.1.10:fill 后再检测 _is_logged_in,避免 sandbox demo 凭据失效时 + # 被误判为「已登录」(URL 跳 /app/home 但 cookie 没写入) + if not _is_logged_in(page): + logger.warning( + "platform_collector: SPA URL 跳离 login 但 _is_logged_in=False,登录可能失败" + ) + return False logger.info("platform_collector: SPA 登录后 URL=%s", page.url) return True @@ -344,24 +361,30 @@ def collect_all( # 所有 wait_for_selector 默认 30s,调试时不直观) page.set_default_timeout(DEFAULT_PAGE_TIMEOUT_MS) - # 1. 根域 goto + 根域登录(可选;root login 经常 demo/123456 失败) - _goto(page, ROOT_URL) - _fill_root_login(page) + # 1. v1.1.10:先用**最小侵入**方式检测已登录态 —— 直接 goto SPA_HOME + # (不要先跳 ROOT_URL + 自动 fill,会破坏已登录态) + # 已登录态:SPA_HOME 直接落到 /app/home → _is_logged_in=True → 全跳过 + # 未登录态:SPA_HOME 被踢回 /login → _is_logged_in=False → 走登录分支 + logger.info( + "platform_collector: 检测登录态,goto SPA_HOME 先探 (当前 URL=%s)", + page.url, + ) + _goto(page, SPA_HOME_URL) + # v1.1.10:等 sandbox SPA 异步验证 cookie(之前 POST_LOGIN_SETTLE_MS=2s 不够, + # 探针误判未登录,触发不必要的 fallback 手工登录) + page.wait_for_timeout(SPA_HYDRATION_MS) - # 2. v1.1.8:已登录态优先检测 —— 复用 profile cookie 时(手工登录成功后 - # cookie 已持久化),root 直接跳 SPA home,**不再强制 goto login**, - # 避免打断用户手工登录态导致「已登录却被踢回 login 页」。 if _is_logged_in(page): logger.info( - "platform_collector: 已登录态,跳过 login,直接 goto SPA_HOME, URL=%s", - page.url, + "platform_collector: ✅ 已登录态,**完全跳过登录流程**(不弹窗、不自动 fill、不打扰)" + ",URL=%s", page.url, ) else: - # 未登录:直接 goto sandbox SPA login(绕过 /select 和 root 跳转) logger.info( - "platform_collector: 未登录态,goto sandbox SPA login, 当前 URL=%s", + "platform_collector: 未登录态(SPA_HOME 跳回 login, URL=%s),走登录分支", page.url, ) + # 2. 未登录:直接 goto sandbox SPA login(绕过 /select 和 root 跳转) _goto(page, SPA_LOGIN_URL) # SPA hydration + framework 初始化时间(修复登录时间太短的核心点) page.wait_for_timeout(SPA_HYDRATION_MS) diff --git a/scripts/util/constants.py b/scripts/util/constants.py index e2f90c2..0a9bde7 100644 --- a/scripts/util/constants.py +++ b/scripts/util/constants.py @@ -6,7 +6,7 @@ """ SKILL_SLUG = "alert-contract-expiring-hr" -SKILL_VERSION = "1.1.9" +SKILL_VERSION = "1.1.10" LOG_LOGGER_NAME = "openclaw.skill.alert_contract_expiring_hr" PLATFORM_KIT_MIN_VERSION = "1.2.11"