"""配置:按《插件配置文件标准》注册到统一 Web 管理台。 3 个配置项都与 BF2042 取数通道有关:浏览器扩展桥的端口 / token (``services/fetchers/tracker_bridge.py``),以及取数浏览器专用配置目录 (登录态所在,诊断提示用)。来源是模块运行态,Web 保存后由 setter 热更新、 立即生效;重启后依次按 plugin_config.json 值、`HEXI_BF_*` 环境变量、默认值回退。 读取一律走本模块的 helper(内部 `get_effective_value`),不要在别处缓存值。 """ from __future__ import annotations import os from hexi.web_hub.config_standard import register_config_items from hexi.web_hub.web_config import get_effective_value from .paths import DEFAULT_COOKIES_PATH, EDGE_PROFILE_DIR _PLUGIN_ID = __package__ or __name__.rsplit(".", 1)[0] _KEY_EDGE_PROFILE = "bf_edge_profile_dir" _KEY_EXT_WS_PORT = "bf_ext_ws_port" _KEY_EXT_WS_TOKEN = "bf_ext_ws_token" # 旧 cookie 通道的配置键:仅保留读取 helper 兼容旧调用,不再注册 _KEY_COOKIES = "bf_tracker_cookies_path" # 运行态现值:启动时用环境变量兜底初始化(ENV 名与 Web 写回的 .env 名一致) _state: dict[str, object] = { _KEY_EDGE_PROFILE: os.environ.get("HEXI_BF_EDGE_PROFILE") or str(EDGE_PROFILE_DIR), _KEY_EXT_WS_PORT: os.environ.get("HEXI_BF_EXT_WS_PORT") or "39272", _KEY_EXT_WS_TOKEN: os.environ.get("HEXI_BF_EXT_WS_TOKEN") or "hexi-bf2042", _KEY_COOKIES: os.environ.get("HEXI_BF_TRACKER_COOKIES") or str(DEFAULT_COOKIES_PATH), } def edge_profile_dir() -> str: """BF2042 取数浏览器专用配置目录(内含登录态、CF 信任与捕获桥扩展)。""" value = get_effective_value(_PLUGIN_ID, _KEY_EDGE_PROFILE, None) if value: return str(value) return str(_state[_KEY_EDGE_PROFILE] or EDGE_PROFILE_DIR) def ext_ws_port() -> int: """扩展桥 WS 服务端端口(仅本机回环)。""" value = get_effective_value(_PLUGIN_ID, _KEY_EXT_WS_PORT, None) if value is None: value = _state[_KEY_EXT_WS_PORT] try: return int(str(value)) except (TypeError, ValueError): return 39272 def ext_ws_token() -> str: """扩展桥共享 token(扩展 background.js 顶部常量需与之保持一致)。""" value = get_effective_value(_PLUGIN_ID, _KEY_EXT_WS_TOKEN, None) if value: return str(value) return str(_state[_KEY_EXT_WS_TOKEN] or "hexi-bf2042") def tracker_cookies_path() -> str: """[旧通道兼容] Netscape 格式 cookie 文件路径。""" value = get_effective_value(_PLUGIN_ID, _KEY_COOKIES, None) if value: return str(value) return str(_state[_KEY_COOKIES] or DEFAULT_COOKIES_PATH) def _set(key: str, value: object) -> None: _state[key] = value def register_config() -> None: """注册 3 个取数通道配置项(Web 可读可改,保存即生效)。""" register_config_items( _PLUGIN_ID, [ { "key": _KEY_EXT_WS_PORT, "label": "扩展桥 WS 端口", "type": "string", "default": "39272", "env": "HEXI_BF_EXT_WS_PORT", "description": ( "扩展桥在本机 127.0.0.1 的监听端口(仅回环)。" "改后需重启 bot,且扩展 background.js 顶部常量要同步。" ), "getter": lambda: _state[_KEY_EXT_WS_PORT], "setter": lambda v: _set(_KEY_EXT_WS_PORT, v), }, { "key": _KEY_EXT_WS_TOKEN, "label": "扩展桥 token", "type": "password", "default": "hexi-bf2042", "env": "HEXI_BF_EXT_WS_TOKEN", "description": ( "扩展连接时的共享密钥(防本机其它程序误连)。" "与扩展 background.js 顶部 WS_TOKEN 保持一致;保存即生效。" ), "getter": lambda: _state[_KEY_EXT_WS_TOKEN], "setter": lambda v: _set(_KEY_EXT_WS_TOKEN, v), }, { "key": _KEY_EDGE_PROFILE, "label": "取数浏览器配置目录", "type": "path", "default": str(EDGE_PROFILE_DIR), "env": "HEXI_BF_EDGE_PROFILE", "description": ( "取数浏览器的专用用户数据目录(登录态 + CF 信任 + 捕获桥扩展都在这)。" "会话过期时用它打开 Edge 手动登录一次即可。" ), "getter": lambda: _state[_KEY_EDGE_PROFILE], "setter": lambda v: _set(_KEY_EDGE_PROFILE, v), }, ], )