Files
EMWebApi/utils/_emchoice.py
T
toor 11ddbd3c49 实现全部 CHOICE 财务接口, 补充测试/文档/部署配置
- 新增 9 个抓取模块: 三大报表/盈利能力/资本结构/营运能力/成长能力/杜邦/分红
- api.py 新增 10 个 /fin/* 接口并统一无数据返回
- 新增 _emchoice.py 共享请求辅助 (emws 跳转取 URL / datacenter 报表拉取)
- 新增冒烟测试 tests/test_interfaces.py (24 用例)
- 新增接口文档 api_manual.md 与施工蓝图 blueprint.md
- 新增 Dockerfile / docker-compose.yml / deploy.sh 部署配置
2026-08-15 09:19:11 +08:00

39 lines
1.5 KiB
Python

"""东方财富 CHOICE 接口公共请求辅助 (仅内部模块复用, 不对外暴露)。"""
from __future__ import annotations
import requests
from utils.fin_summary import HEADERS, TIMEOUT
# emchoicews2 的 f9 页面接口, 返回带 urls 的跳转结构
_EMWS_URL = "https://emchoicews2.eastmoney.com"
# datacenter-choice 报表数据接口
_BASE_URL = "https://datacenter-choice.eastmoney.com/api/data/v1/get"
def get_data_url(path: str, params: dict[str, str]) -> str:
"""调用 emchoicews2 的 f9 路径, 返回真正的报表数据接口 URL."""
r = requests.get(_EMWS_URL + path, headers=HEADERS, params=params, timeout=TIMEOUT)
r.raise_for_status()
payload = r.json()
urls = payload.get("urls") or []
if not urls:
raise RuntimeError(f"{path}: 接口未返回数据 URL: {payload}")
return urls[0]
def fetch_report(url_or_params: str | dict[str, str]) -> list[dict]:
"""拉取 datacenter-choice 报表数据, 返回行 dict 列表.
支持直接传完整 URL (由 get_data_url 得到), 或传 reportName 等参数 dict.
"""
if isinstance(url_or_params, dict):
r = requests.get(_BASE_URL, headers=HEADERS, params=url_or_params, timeout=TIMEOUT)
else:
r = requests.get(url_or_params, headers=HEADERS, timeout=TIMEOUT)
r.raise_for_status()
payload = r.json()
if not payload.get("success"):
raise RuntimeError(f"接口返回失败: {payload}")
return payload.get("result", {}).get("data") or []