mx_fixture.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. """
  2. 妙想 API 本地 Fixture(原始 JSON 回放)
  3. 修前端/解析逻辑时设置 MX_REPLAY_FIXTURES=1,可将已成功请求保存为 JSON,
  4. 按 query 哈希命中文件则不再发起网络请求,节省妙想额度。
  5. 用法见 backend/scripts/capture_mx_fixture.py
  6. """
  7. from __future__ import annotations
  8. import hashlib
  9. import json
  10. from pathlib import Path
  11. from typing import Any, Optional
  12. from app.config import settings
  13. def fixture_path(channel: str, query: str) -> Path:
  14. """channel: mx_data | mx_search | mx_xuangu"""
  15. h = hashlib.sha256(query.strip().encode("utf-8")).hexdigest()[:16]
  16. root: Path = settings.MX_FIXTURE_DIR
  17. return root / f"{channel}_{h}.json"
  18. def try_load_raw_fixture(channel: str, query: str) -> Optional[dict[str, Any]]:
  19. """回放模式且文件存在时返回妙想原始响应 dict,否则 None"""
  20. if not settings.MX_REPLAY_FIXTURES:
  21. return None
  22. path = fixture_path(channel, query)
  23. if not path.is_file():
  24. return None
  25. try:
  26. data = json.loads(path.read_text(encoding="utf-8"))
  27. return data if isinstance(data, dict) else None
  28. except Exception:
  29. return None
  30. def save_raw_fixture(channel: str, query: str, raw: dict[str, Any]) -> Path:
  31. """将一次成功的原始响应写入磁盘,供后续 MX_REPLAY_FIXTURES 使用"""
  32. path = fixture_path(channel, query)
  33. path.parent.mkdir(parents=True, exist_ok=True)
  34. path.write_text(json.dumps(raw, ensure_ascii=False, indent=2), encoding="utf-8")
  35. return path