fix: use --restore-last-session instead of unsigned Preferences restore_on_startup
All checks were successful
技能自动化发布 / release (push) Successful in 5s
All checks were successful
技能自动化发布 / release (push) Successful in 5s
This commit is contained in:
@@ -87,21 +87,29 @@ HUMAN_CHROME_FLAGS = (
|
||||
"--disable-search-engine-choice-screen",
|
||||
)
|
||||
|
||||
# 强制恢复上次会话(含 Session Cookie)。不依赖 Preferences.restore_on_startup
|
||||
#(该项受 Secure Preferences HMAC 保护,裸写会被 Chrome 否掉)。
|
||||
RESTORE_LAST_SESSION_FLAG = "--restore-last-session"
|
||||
|
||||
def human_chrome_launch_args(profile_dir, url=None):
|
||||
|
||||
def human_chrome_launch_args(profile_dir, url=None, restore_session=False):
|
||||
"""chrome.exe 之后的参数(Popen 列表形式,路径不额外加引号)。"""
|
||||
profile_abs = os.path.abspath(profile_dir)
|
||||
args = [f"--user-data-dir={profile_abs}", *HUMAN_CHROME_FLAGS]
|
||||
if restore_session:
|
||||
args.append(RESTORE_LAST_SESSION_FLAG)
|
||||
cleaned = (url or "").strip()
|
||||
if cleaned:
|
||||
args.append(cleaned)
|
||||
return args
|
||||
|
||||
|
||||
def human_chrome_shortcut_arguments(profile_dir, url=None):
|
||||
def human_chrome_shortcut_arguments(profile_dir, url=None, restore_session=False):
|
||||
"""Windows .lnk Arguments 字符串(user-data-dir 带引号)。"""
|
||||
profile_abs = os.path.abspath(profile_dir)
|
||||
parts = [f'--user-data-dir="{profile_abs}"', *HUMAN_CHROME_FLAGS]
|
||||
if restore_session:
|
||||
parts.append(RESTORE_LAST_SESSION_FLAG)
|
||||
cleaned = (url or "").strip()
|
||||
if cleaned:
|
||||
parts.append(cleaned)
|
||||
@@ -307,7 +315,7 @@ def cmd_open(account_id):
|
||||
)
|
||||
return
|
||||
|
||||
# 独立 Profile 默认不会「继续上次会话」,Session Cookie 关窗即丢;打开前写入 Preferences
|
||||
# 清理 exit_type 等(不写 MAC 保护的 restore_on_startup);有会话时靠 --restore-last-session
|
||||
prefs_result = ensure_session_restore(profile_abs)
|
||||
log.info("browser_open_prefs %s", prefs_result)
|
||||
|
||||
@@ -317,21 +325,26 @@ def cmd_open(account_id):
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
# 有可恢复会话时不带 URL;首次/空 Profile 仍打开平台首页便于登录。
|
||||
# 须识别现代 Chrome 的 Default/Sessions/Session_*(仅认旧文件名会导致每次都开首页冲掉 Session Cookie)。
|
||||
# 有可恢复会话:不带 URL + --restore-last-session(恢复标签与 Session Cookie)。
|
||||
# 首次/空 Profile:仍打开平台首页便于登录。
|
||||
has_session = profile_has_restorable_session(profile_abs)
|
||||
launch_url = None if has_session else url
|
||||
cmd = [browser_exe, *human_chrome_launch_args(profile_abs, launch_url)]
|
||||
cmd = [
|
||||
browser_exe,
|
||||
*human_chrome_launch_args(
|
||||
profile_abs, launch_url, restore_session=has_session
|
||||
),
|
||||
]
|
||||
|
||||
log.info(
|
||||
"browser_open_launch exe=%s profile_dir=%s launch_url=%s has_session=%s "
|
||||
"platform=%s restore_on_startup=%s",
|
||||
"restore_last_session=%s platform=%s",
|
||||
browser_exe,
|
||||
profile_abs,
|
||||
launch_url or "(restore)",
|
||||
has_session,
|
||||
has_session,
|
||||
target.get("platform_key"),
|
||||
prefs_result.get("restore_after"),
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -381,6 +394,8 @@ def cmd_open(account_id):
|
||||
"profile_dir": profile_abs,
|
||||
"url": url,
|
||||
"pid": child.pid,
|
||||
"has_session": has_session,
|
||||
"restore_last_session": has_session,
|
||||
"session_restore_on_startup": prefs_result.get("restore_after"),
|
||||
},
|
||||
},
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
"""Chrome/Edge 独立 Profile:启用「继续上次会话」,让 Session Cookie 可跨次打开保留。"""
|
||||
"""Chrome/Edge 独立 Profile:启动前清理退出标记,便于会话文件可被恢复。
|
||||
|
||||
注意:``session.restore_on_startup`` 受 Secure Preferences HMAC 保护,
|
||||
裸写 Preferences 会被 Chrome 校验否掉并回落到新标签页。真正强制恢复会话
|
||||
应在启动参数使用 ``--restore-last-session``(见 browser_service)。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -8,8 +13,6 @@ from typing import Any, Dict
|
||||
|
||||
from util.logging_config import get_skill_logger
|
||||
|
||||
RESTORE_CONTINUE_WHERE_LEFT_OFF = 1
|
||||
|
||||
# Chromium ≤ roughly mid-era: session files lived under Default/
|
||||
_LEGACY_SESSION_FILES = (
|
||||
"Current Session",
|
||||
@@ -55,13 +58,10 @@ def local_state_path(profile_dir: str) -> str:
|
||||
|
||||
|
||||
def _patch_preferences_dict(data: Dict[str, Any]) -> Dict[str, Any]:
|
||||
before = int((data.get("session") or {}).get("restore_on_startup") or 0)
|
||||
"""只改不受 Secure Preferences MAC 保护的退出标记;不动 restore_on_startup。"""
|
||||
restore_before = int((data.get("session") or {}).get("restore_on_startup") or 0)
|
||||
exit_before = str((data.get("profile") or {}).get("exit_type") or "")
|
||||
|
||||
session = data.setdefault("session", {})
|
||||
session["restore_on_startup"] = RESTORE_CONTINUE_WHERE_LEFT_OFF
|
||||
session.pop("startup_urls", None)
|
||||
|
||||
profile = data.setdefault("profile", {})
|
||||
if str(profile.get("exit_type") or "").lower() == "crashed":
|
||||
profile["exit_type"] = "Normal"
|
||||
@@ -71,7 +71,7 @@ def _patch_preferences_dict(data: Dict[str, Any]) -> Dict[str, Any]:
|
||||
browser["has_seen_welcome_page"] = True
|
||||
browser["check_default_browser"] = False
|
||||
|
||||
return {"restore_before": before, "exit_type_before": exit_before}
|
||||
return {"restore_before": restore_before, "exit_type_before": exit_before}
|
||||
|
||||
|
||||
def _patch_local_state(profile_dir: str, log) -> Dict[str, Any]:
|
||||
@@ -102,7 +102,7 @@ def _patch_local_state(profile_dir: str, log) -> Dict[str, Any]:
|
||||
|
||||
|
||||
def ensure_session_restore(profile_dir: str) -> Dict[str, Any]:
|
||||
"""启动浏览器前写入 session.restore_on_startup=1;清 startup_urls;Local State 干净退出。"""
|
||||
"""启动前清理 exit_type / exited_cleanly(不受 MAC 保护);不写 restore_on_startup。"""
|
||||
log = get_skill_logger()
|
||||
profile_abs = os.path.abspath(profile_dir)
|
||||
prefs = preferences_path(profile_abs)
|
||||
@@ -140,12 +140,11 @@ def ensure_session_restore(profile_dir: str) -> Dict[str, Any]:
|
||||
exit_after = str((data.get("profile") or {}).get("exit_type") or "")
|
||||
local = _patch_local_state(profile_abs, log)
|
||||
log.info(
|
||||
"chrome_session_restore_ensured profile_dir=%s prefs=%s existed=%s "
|
||||
"restore_on_startup %s->%s exit_type %s->%s local_state=%s",
|
||||
"chrome_session_restore_prepared profile_dir=%s prefs=%s existed=%s "
|
||||
"restore_on_startup_unchanged=%s exit_type %s->%s local_state=%s",
|
||||
profile_abs,
|
||||
prefs,
|
||||
existed,
|
||||
before,
|
||||
after,
|
||||
exit_before or "-",
|
||||
exit_after or "-",
|
||||
@@ -160,4 +159,5 @@ def ensure_session_restore(profile_dir: str) -> Dict[str, Any]:
|
||||
"exit_type_before": exit_before,
|
||||
"exit_type_after": exit_after,
|
||||
"local_state": local,
|
||||
"prefs_restore_on_startup_touched": False,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user