import json import sys from pathlib import Path import requests from log_util import get_logger, log_request from session_state import get_sess_key ROOT = Path(__file__).resolve().parent CONFIG_PATH = ROOT / "config.json" def load_config(): if not CONFIG_PATH.exists(): raise FileNotFoundError(f"配置文件未找到: {CONFIG_PATH}") with open(CONFIG_PATH, "r", encoding="utf-8") as f: return json.load(f) DEFAULT_PAYLOAD = { "func_name": "acl", "action": "show", "param": { "TYPE": "total,data", "limit": "0,20", "ORDER_BY": "", "ORDER": "" } } def get_acl_rules(payload: dict | None = None, timeout: int = 10): """Send ACL show POST. Returns requests.Response and parsed JSON data. payload: JSON payload to send. If None, uses DEFAULT_PAYLOAD. timeout: request timeout in seconds. """ cfg = load_config() base = cfg.get("base_url", "").rstrip("/") url = f"{base}/Action/call" data = payload or DEFAULT_PAYLOAD logger = get_logger("acl_post") # Get sess_key from global state sess_key = get_sess_key() if not sess_key: raise ValueError("未找到 sess_key,请先登录") cookies = {"sess_key": sess_key.split("=")[1].rstrip(";")} # Extract value from "sess_key=value;" logger.debug(f"准备发送请求,URL: {url}") resp = requests.post(url, json=data, cookies=cookies, timeout=timeout) # 记录请求/响应 try: log_request(logger, "get_acl_rules", url, data, resp) except Exception: logger.exception("记录请求/响应失败") # Parse JSON response try: json_data = resp.json() except ValueError: json_data = None return resp, json_data def main(): logger = get_logger("main") try: resp, data = get_acl_rules() except FileNotFoundError as e: logger.error(f"配置错误: {e}") sys.exit(2) except ValueError as e: logger.error(f"会话错误: {e}") sys.exit(3) except requests.RequestException as e: logger.error(f"请求失败: {e}") sys.exit(1) # 控制台友好输出 logger.info(f"状态: {resp.status_code}") if data: try: pretty = json.dumps(data, ensure_ascii=False, indent=2) logger.info(f"响应 JSON:\n{pretty}") print(pretty) except Exception: logger.info(f"响应文本: {resp.text}") print(resp.text) else: logger.info(f"响应文本: {resp.text}") print(resp.text) if __name__ == "__main__": main()