acl_post.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import json
  2. import sys
  3. from pathlib import Path
  4. import requests
  5. from log_util import get_logger, log_request
  6. from session_state import get_sess_key
  7. ROOT = Path(__file__).resolve().parent
  8. CONFIG_PATH = ROOT / "config.json"
  9. def load_config():
  10. if not CONFIG_PATH.exists():
  11. raise FileNotFoundError(f"配置文件未找到: {CONFIG_PATH}")
  12. with open(CONFIG_PATH, "r", encoding="utf-8") as f:
  13. return json.load(f)
  14. DEFAULT_PAYLOAD = {
  15. "func_name": "acl",
  16. "action": "show",
  17. "param": {
  18. "TYPE": "total,data",
  19. "limit": "0,20",
  20. "ORDER_BY": "",
  21. "ORDER": ""
  22. }
  23. }
  24. def get_acl_rules(payload: dict | None = None, timeout: int = 10):
  25. """Send ACL show POST. Returns requests.Response and parsed JSON data.
  26. payload: JSON payload to send. If None, uses DEFAULT_PAYLOAD.
  27. timeout: request timeout in seconds.
  28. """
  29. cfg = load_config()
  30. base = cfg.get("base_url", "").rstrip("/")
  31. url = f"{base}/Action/call"
  32. data = payload or DEFAULT_PAYLOAD
  33. logger = get_logger("acl_post")
  34. # Get sess_key from global state
  35. sess_key = get_sess_key()
  36. if not sess_key:
  37. raise ValueError("未找到 sess_key,请先登录")
  38. cookies = {"sess_key": sess_key.split("=")[1].rstrip(";")} # Extract value from "sess_key=value;"
  39. logger.debug(f"准备发送请求,URL: {url}")
  40. resp = requests.post(url, json=data, cookies=cookies, timeout=timeout)
  41. # 记录请求/响应
  42. try:
  43. log_request(logger, "get_acl_rules", url, data, resp)
  44. except Exception:
  45. logger.exception("记录请求/响应失败")
  46. # Parse JSON response
  47. try:
  48. json_data = resp.json()
  49. except ValueError:
  50. json_data = None
  51. return resp, json_data
  52. def main():
  53. logger = get_logger("main")
  54. try:
  55. resp, data = get_acl_rules()
  56. except FileNotFoundError as e:
  57. logger.error(f"配置错误: {e}")
  58. sys.exit(2)
  59. except ValueError as e:
  60. logger.error(f"会话错误: {e}")
  61. sys.exit(3)
  62. except requests.RequestException as e:
  63. logger.error(f"请求失败: {e}")
  64. sys.exit(1)
  65. # 控制台友好输出
  66. logger.info(f"状态: {resp.status_code}")
  67. if data:
  68. try:
  69. pretty = json.dumps(data, ensure_ascii=False, indent=2)
  70. logger.info(f"响应 JSON:\n{pretty}")
  71. print(pretty)
  72. except Exception:
  73. logger.info(f"响应文本: {resp.text}")
  74. print(resp.text)
  75. else:
  76. logger.info(f"响应文本: {resp.text}")
  77. print(resp.text)
  78. if __name__ == "__main__":
  79. main()