""" 通用工具函数 提供项目中常用的基础功能 """ import os from pathlib import Path from urllib.parse import urlsplit, unquote def clean_env_value(value): """ 清理环境变量值,去除首尾空白字符 Args: value: 环境变量的原始值 Returns: str or None: 清理后的值,如果为空或None则返回None """ if value is None: return None stripped = value.strip() return stripped or None def parse_headless_mode(headless_setting): """ 解析headless模式配置 Args: headless_setting: headless配置值 Returns: bool or str: True表示headless,False表示有界面,'virtual'表示虚拟模式 """ if str(headless_setting).lower() == 'true': return True elif str(headless_setting).lower() == 'false': return False else: return 'virtual' def ensure_dir(path): """ 确保目录存在,如果不存在则创建 Args: path: 目录路径(可以是字符串或Path对象) """ if isinstance(path, str): path = Path(path) os.makedirs(path, exist_ok=True) def parse_proxy_config(proxy_value): """ 解析代理配置字符串为 Playwright/Camoufox 需要的 dict 结构 支持格式: - scheme://user:pass@host:port - scheme://host:port - host:port - user:pass@host:port (默认 http) Returns: dict or None: {"server": "...", "username": "...", "password": "..."} 或 None """ if not proxy_value: return None proxy_value = proxy_value.strip() if not proxy_value: return None if "://" in proxy_value: parsed = urlsplit(proxy_value) if not parsed.hostname: return {"server": proxy_value} scheme = parsed.scheme else: parsed = urlsplit(f"//{proxy_value}") if not parsed.hostname: return {"server": proxy_value} scheme = "http" host = parsed.hostname if host and ":" in host and not host.startswith("["): host = f"[{host}]" server = f"{scheme}://{host}" if parsed.port: server += f":{parsed.port}" result = {"server": server} if parsed.username: result["username"] = unquote(parsed.username) if parsed.password: result["password"] = unquote(parsed.password) return result