chore: auto release commit (2026-09-14 18:23:05)
All checks were successful
技能自动化发布 / release (push) Successful in 6s
All checks were successful
技能自动化发布 / release (push) Successful in 6s
This commit is contained in:
@@ -2,6 +2,15 @@
|
|||||||
|
|
||||||
本文件对应技能市场 **「更新日志」** Tab。
|
本文件对应技能市场 **「更新日志」** 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
|
## 1.1.9
|
||||||
|
|
||||||
- **RPA headed 模式改用系统 Edge(解决浏览器弹窗不可见)**
|
- **RPA headed 模式改用系统 Edge(解决浏览器弹窗不可见)**
|
||||||
|
|||||||
2
SKILL.md
2
SKILL.md
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: 合同到期智能预警与续聘辅助
|
name: 合同到期智能预警与续聘辅助
|
||||||
description: "每日凌晨扫描全校教职工合同电子台账,对距离到期日 90/60/30 天的合同分级预警,并自动生成《续聘准备任务书》和《本月合同到期人员清单》。"
|
description: "每日凌晨扫描全校教职工合同电子台账,对距离到期日 90/60/30 天的合同分级预警,并自动生成《续聘准备任务书》和《本月合同到期人员清单》。"
|
||||||
version: 1.1.9
|
version: 1.1.10
|
||||||
author: 深圳匠厂科技有限公司
|
author: 深圳匠厂科技有限公司
|
||||||
metadata:
|
metadata:
|
||||||
openclaw:
|
openclaw:
|
||||||
|
|||||||
@@ -232,12 +232,22 @@ def _fill_spa_login(page, settle_ms: int = SPA_LOGIN_SETTLE_MS) -> bool:
|
|||||||
返回是否执行了登录(True = 已点登录按钮且 URL 已跳离 login;调用方可继续后续流程)。
|
返回是否执行了登录(True = 已点登录按钮且 URL 已跳离 login;调用方可继续后续流程)。
|
||||||
失败时**不抛异常**,由调用方决定是否 fallback 到 _wait_for_manual_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 登录时间太短导致采集不到数据):
|
修复要点(v1.1.5/v1.1.6 登录时间太短导致采集不到数据):
|
||||||
- 默认 settle_ms = SPA_LOGIN_SETTLE_MS(4000ms),给 SPA 异步渲染 + token 写入 cookie 时间
|
- 默认 settle_ms = SPA_LOGIN_SETTLE_MS(4000ms),给 SPA 异步渲染 + token 写入 cookie 时间
|
||||||
- 等 username input 的 timeout = SPA_LOGIN_INPUT_TIMEOUT_MS(20s)
|
- 等 username input 的 timeout = SPA_LOGIN_INPUT_TIMEOUT_MS(20s)
|
||||||
- click 按钮后 wait_for_url timeout = SPA_LOGIN_URL_TIMEOUT_MS(30s)
|
- click 按钮后 wait_for_url timeout = SPA_LOGIN_URL_TIMEOUT_MS(30s)
|
||||||
- 多处过渡路径(/login, /signin, /auth/)一并判断
|
- 多处过渡路径(/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()
|
url_lower = page.url.lower()
|
||||||
if "/login" not in url_lower and "/signin" not in url_lower and "/auth/" not in url_lower:
|
if "/login" not in url_lower and "/signin" not in url_lower and "/auth/" not in url_lower:
|
||||||
return False
|
return False
|
||||||
@@ -270,6 +280,13 @@ def _fill_spa_login(page, settle_ms: int = SPA_LOGIN_SETTLE_MS) -> bool:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning("SPA 登录超时: %s;当前 URL=%s", e, page.url)
|
logger.warning("SPA 登录超时: %s;当前 URL=%s", e, page.url)
|
||||||
return False
|
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)
|
logger.info("platform_collector: SPA 登录后 URL=%s", page.url)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -344,24 +361,30 @@ def collect_all(
|
|||||||
# 所有 wait_for_selector 默认 30s,调试时不直观)
|
# 所有 wait_for_selector 默认 30s,调试时不直观)
|
||||||
page.set_default_timeout(DEFAULT_PAGE_TIMEOUT_MS)
|
page.set_default_timeout(DEFAULT_PAGE_TIMEOUT_MS)
|
||||||
|
|
||||||
# 1. 根域 goto + 根域登录(可选;root login 经常 demo/123456 失败)
|
# 1. v1.1.10:先用**最小侵入**方式检测已登录态 —— 直接 goto SPA_HOME
|
||||||
_goto(page, ROOT_URL)
|
# (不要先跳 ROOT_URL + 自动 fill,会破坏已登录态)
|
||||||
_fill_root_login(page)
|
# 已登录态: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):
|
if _is_logged_in(page):
|
||||||
logger.info(
|
logger.info(
|
||||||
"platform_collector: 已登录态,跳过 login,直接 goto SPA_HOME, URL=%s",
|
"platform_collector: ✅ 已登录态,**完全跳过登录流程**(不弹窗、不自动 fill、不打扰)"
|
||||||
page.url,
|
",URL=%s", page.url,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# 未登录:直接 goto sandbox SPA login(绕过 /select 和 root 跳转)
|
|
||||||
logger.info(
|
logger.info(
|
||||||
"platform_collector: 未登录态,goto sandbox SPA login, 当前 URL=%s",
|
"platform_collector: 未登录态(SPA_HOME 跳回 login, URL=%s),走登录分支",
|
||||||
page.url,
|
page.url,
|
||||||
)
|
)
|
||||||
|
# 2. 未登录:直接 goto sandbox SPA login(绕过 /select 和 root 跳转)
|
||||||
_goto(page, SPA_LOGIN_URL)
|
_goto(page, SPA_LOGIN_URL)
|
||||||
# SPA hydration + framework 初始化时间(修复登录时间太短的核心点)
|
# SPA hydration + framework 初始化时间(修复登录时间太短的核心点)
|
||||||
page.wait_for_timeout(SPA_HYDRATION_MS)
|
page.wait_for_timeout(SPA_HYDRATION_MS)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
SKILL_SLUG = "alert-contract-expiring-hr"
|
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"
|
LOG_LOGGER_NAME = "openclaw.skill.alert_contract_expiring_hr"
|
||||||
PLATFORM_KIT_MIN_VERSION = "1.2.11"
|
PLATFORM_KIT_MIN_VERSION = "1.2.11"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user