capture_mx_fixture.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #!/usr/bin/env python3
  2. """
  3. 将妙想接口返回的原始 JSON 保存到 backend/fixtures/mx_raw/,
  4. 后续设置 MX_REPLAY_FIXTURES=1 即可本地回放同一 query,不再消耗额度。
  5. 在项目根目录执行(需已配置 MX_APIKEY):
  6. set PYTHONPATH=backend
  7. py backend/scripts/capture_mx_fixture.py mx_data "600519 最新价 涨跌幅"
  8. py backend/scripts/capture_mx_fixture.py mx_search "今日A股市场热点 大盘动态 北向资金"
  9. py backend/scripts/capture_mx_fixture.py mx_xuangu "市盈率小于20"
  10. 注意:回放时服务端生成的 query 必须与抓取时字符串完全一致(含空格)。
  11. """
  12. from __future__ import annotations
  13. import argparse
  14. import sys
  15. from pathlib import Path
  16. _BACKEND = Path(__file__).resolve().parent.parent
  17. _ROOT = _BACKEND.parent
  18. sys.path.insert(0, str(_BACKEND))
  19. for p in (
  20. _ROOT / "agents",
  21. _ROOT / "skills" / "金融数据" / "mx-data",
  22. _ROOT / "skills" / "资讯搜索" / "mx-search",
  23. _ROOT / "skills" / "智能选股" / "mx-xuangu",
  24. _ROOT,
  25. ):
  26. sp = str(p)
  27. if sp not in sys.path:
  28. sys.path.insert(0, sp)
  29. def main() -> None:
  30. parser = argparse.ArgumentParser(description="保存妙想原始响应为本地 fixture")
  31. parser.add_argument(
  32. "channel",
  33. choices=("mx_data", "mx_search", "mx_xuangu"),
  34. help="与路由使用的 skill 一致",
  35. )
  36. parser.add_argument("query", help="自然语言查询(须与线上一致)")
  37. args = parser.parse_args()
  38. from app.config import settings
  39. from app.utils.mx_fixture import fixture_path, save_raw_fixture
  40. if not settings.MX_APIKEY or settings.MX_APIKEY == "your-mx-apikey-here":
  41. print("错误:请在 .env 中配置 MX_APIKEY 后再抓取 fixture")
  42. sys.exit(1)
  43. if args.channel == "mx_data":
  44. import mx_data as _mx
  45. raw = _mx.MXData(api_key=settings.MX_APIKEY).query(args.query)
  46. elif args.channel == "mx_search":
  47. import mx_search as _mx
  48. raw = _mx.MXSearch(api_key=settings.MX_APIKEY).search(args.query)
  49. else:
  50. import mx_xuangu as _mx
  51. raw = _mx.MXSelectStock(api_key=settings.MX_APIKEY).search(args.query)
  52. path = save_raw_fixture(args.channel, args.query, raw)
  53. print(f"已写入: {path}")
  54. print(f"哈希文件名对应 query: {args.query!r}")
  55. print("回放:环境变量 MX_REPLAY_FIXTURES=1(可选 MX_FIXTURE_DIR 指向目录),重启后端")
  56. if __name__ == "__main__":
  57. main()