"""代理IP白名单管理模块(兼容层)。 核心逻辑已迁移至 proxy_platforms/xiequ.py,本模块仅做向后兼容包装。 旧代码仍可 from .whitelist import WhitelistManager 正常使用。 """ from typing import Optional from loguru import logger from .proxy_platforms.xiequ import XiequAdapter from .proxy_platforms.base import ( BaseWhitelistAdapter, _get_local_exit_ip, get_exit_ip_via_proxy, ) # 全局锁保留(基类内部使用,此处导出供旧代码引用) from .proxy_platforms.base import _whitelist_sync_lock class WhitelistManager: """携趣代理IP白名单管理器(兼容层,委托给 XiequAdapter)。""" MEMO_PREFIX = XiequAdapter.MEMO_PREFIX BASE_URL = XiequAdapter.BASE_URL def __init__(self, uid: str, ukey: str): self._adapter = XiequAdapter({"uid": uid, "ukey": ukey}) self.uid = uid self.ukey = ukey @property def memo(self) -> str: return self._adapter.memo def _build_url(self, **params) -> str: """构建请求URL(兼容旧代码直接调用)。""" return self._adapter._build_url(**params) def get_whitelist_json(self) -> list[dict]: """ 获取白名单列表(JSON格式,协固原始格式)。 Returns: [{"IP": "x.x.x.x", "MEMO": "备注"}, ...] """ records = self._adapter.get_whitelist() # 将统一格式映射回调固原始格式 return [{"IP": r["ip"], "MEMO": r["memo"]} for r in records] def add_ip(self, ip: str, retry: bool = True) -> tuple[bool, str]: """添加IP到白名单。""" return self._adapter.add_ip(ip, retry=retry) def delete_ip(self, ip: str) -> bool: """删除指定IP。""" ok, _ = self._adapter.delete_ip(ip) return ok def get_memo_ip(self) -> Optional[str]: """获取当前备注对应的IP。""" records = self._adapter.get_whitelist() for record in records: if record.get("memo") == self.memo: return record.get("ip") return None def get_memo_records(self) -> list[dict]: """获取当前备注的所有记录(协固原始格式)。""" records = self._adapter.get_whitelist() return [ {"IP": r["ip"], "MEMO": r["memo"]} for r in records if r.get("memo") == self.memo ] def sync_ip(self, current_ip: str, keep_recent: int = 3) -> tuple[bool, str]: """同步白名单IP。""" return self._adapter.sync_ip(current_ip, keep_recent) def test_connection(self) -> tuple[bool, str]: """测试白名单API连接。""" return self._adapter.test_connection() def get_local_exit_ip() -> Optional[str]: """获取本机当前公网出口IP(不走代理)。""" return _get_local_exit_ip()