login_post.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import json
  2. import sys
  3. from pathlib import Path
  4. import requests
  5. from log_util import get_logger, log_request
  6. ROOT = Path(__file__).resolve().parent
  7. CONFIG_PATH = ROOT / "config.json"
  8. def load_config():
  9. if not CONFIG_PATH.exists():
  10. raise FileNotFoundError(f"配置文件未找到: {CONFIG_PATH}")
  11. with open(CONFIG_PATH, "r", encoding="utf-8") as f:
  12. return json.load(f)
  13. DEFAULT_PAYLOAD = {
  14. "username": "xiaobai",
  15. "passwd": "dc81b4427df07fd6b3ebcb05a7b34daf",
  16. "pass": "c2FsdF8xMXhpYW9iYWku",
  17. "remember_password": ""
  18. }
  19. def login(payload: dict | None = None, timeout: int = 10):
  20. """Send login POST. Returns requests.Response.
  21. payload: JSON payload to send. If None, uses DEFAULT_PAYLOAD.
  22. timeout: request timeout in seconds.
  23. """
  24. cfg = load_config()
  25. base = cfg.get("base_url", "").rstrip("/")
  26. url = f"{base}/Action/login"
  27. data = payload or DEFAULT_PAYLOAD
  28. logger = get_logger("login_post")
  29. logger.debug(f"准备发送请求,URL: {url}")
  30. resp = requests.post(url, json=data, timeout=timeout)
  31. # Try to extract sess_key from cookies or Set-Cookie header.
  32. sess_cookie = None
  33. try:
  34. # requests exposes cookies in resp.cookies
  35. sess_val = resp.cookies.get("sess_key")
  36. if sess_val:
  37. sess_cookie = f"sess_key={sess_val};"
  38. else:
  39. set_cookie = resp.headers.get("Set-Cookie", "")
  40. import re
  41. m = re.search(r"(sess_key=[^;]+;?)", set_cookie)
  42. if m:
  43. sess_cookie = m.group(1)
  44. except Exception:
  45. # Non-fatal: if extraction fails, return None for sess_cookie
  46. sess_cookie = None
  47. # 记录请求/响应
  48. try:
  49. log_request(logger, "login", url, data, resp)
  50. except Exception:
  51. logger.exception("记录请求/响应失败")
  52. return resp, sess_cookie
  53. def main():
  54. logger = get_logger("main")
  55. try:
  56. resp, sess_cookie = login()
  57. except FileNotFoundError as e:
  58. logger.error(f"配置错误: {e}")
  59. sys.exit(2)
  60. except requests.RequestException as e:
  61. logger.error(f"请求失败: {e}")
  62. sys.exit(1)
  63. # 控制台友好输出
  64. logger.info(f"状态: {resp.status_code}")
  65. # Try to pretty-print JSON if possible
  66. content_type = resp.headers.get("Content-Type", "")
  67. if "application/json" in content_type:
  68. try:
  69. pretty = json.dumps(resp.json(), ensure_ascii=False, indent=2)
  70. logger.info(f"响应 JSON:\n{pretty}")
  71. print(pretty)
  72. except ValueError:
  73. logger.info(f"响应文本: {resp.text}")
  74. print(resp.text)
  75. else:
  76. logger.info(f"响应文本: {resp.text}")
  77. print(resp.text)
  78. if sess_cookie:
  79. # Print the raw sess_key cookie string
  80. logger.info(f"提取到 sess_key: {sess_cookie}")
  81. print(f"sess_key: {sess_cookie}")
  82. if __name__ == "__main__":
  83. main()