Files
auv/docs/api-data-sources.md

209 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据接口 & 数据源一览
## 架构概览
```
前端 (fetch) → 后端 FastAPI (路由层) → 数据源服务层 → 第三方 API
```
- 前端统一走后端代理,前端不直接调第三方
- 每个接口有主源 + 备选降级,降级对前端透明
- 后端服务层有 SQLite 缓存(6-24h)和内存缓存(60s)
---
## 1. 股票搜索 `/api/stock/search`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchStockSearch(keyword)``src/lib/stock-api.ts` |
| 路由 | `GET /api/stock/search?keyword=``routes/stock.py:12` |
| 用途 | 模糊搜索股票(名称/代码/拼音) |
**数据源:**
| 优先级 | 源 | 方式 | 可靠性 |
|--------|----|------|--------|
| 主选 | 腾讯智能搜索 `smartbox.gtimg.cn` | HTTPS JSONP | ⭐⭐⭐⭐⭐ 稳定,覆盖全 |
| 降级 | 腾讯行情接口 `qt.gtimg.cn` | HTTPS 文本 | ⭐⭐⭐⭐ 仅当 keyword=6位代码且搜索无结果时 |
---
## 2. 实时行情 `/api/stock/quote`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchStockQuote(code)``src/lib/stock-api.ts:137` |
| 路由 | `GET /api/stock/quote?code=``routes/stock.py:38` |
| 用途 | 获取当前实时价格、开盘价、昨收、最高最低、成交量额、盘口 |
| 前端使用 | 股票详情页基本信息区(价格、涨跌幅、内外盘) |
**数据源:**
| 优先级 | 源 | 方式 | 可靠性 |
|--------|----|------|--------|
| 主选 | 腾讯行情 `qt.gtimg.cn` | HTTPS GBK文本 | ⭐⭐⭐⭐⭐ A股全量覆盖,无IP限流 |
| 降级 | 无 | — | 无响应则返回 404 |
**字段映射:** 名称、当前价、昨收、今开、最高、最低、成交量(手)、成交额(万)、外盘、内盘、涨跌额、涨跌幅
---
## 3. 历史 K 线 / 每日行情明细 `/api/stock/history`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchStockHistory(code, days)``src/lib/stock-api.ts:182` |
| 路由 | `GET /api/stock/history?code=&days=``routes/stock.py:49` |
| 用途 | 日K前复权 OHLCV、涨跌幅、成交额 |
| 前端使用 | K线图 + 每日行情明细表(涨跌幅列) |
**数据源:**
| 优先级 | 源 | API | 可靠性 |
|--------|----|-----|--------|
| **主选** | **东方财富 push2his** | `kline/get` (curl_cffi chrome120) | ⚠️ IP 限流严重,常被拒 |
| **备选①** | **腾讯** | `web.ifzq.gtimg.cn` HTTPS | ⭐⭐⭐⭐⭐ 稳定可靠 |
| **备选②** | **新浪** | `money.finance.sina.com.cn` HTTPS | ⭐⭐⭐ 偶有超时 |
**当前实际工作源:** 腾讯(备选①)
**增强字段(东方财富源独有,走腾讯时无):**
- `turnover` — 成交额(元)
- `amplitude` — 振幅(%
- `changePercent` — 涨跌幅(%)(腾讯已通过连续收盘价计算补齐)
- `turnoverRate` — 换手率(%
> 东方财富 push2his kline/get 与 fund-flow 同域名但路径不同,kline/get 有额外反爬。
> 即使使用 curl_cffi + chrome120 指纹也无法绕过,暂不修复。
---
## 4. 资金流向 `/api/stock/fund-flow`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchStockFundFlow(code, name, days)``src/lib/stock-api.ts:248` |
| 路由 | `GET /api/stock/fund-flow?code=&name=&days=``routes/stock.py:147` |
| 用途 | 日度主力净流入、超大单/大单/中单/小单明细、占比、累计值 |
| 前端使用 | 每日行情明细表(主力净流入列 + 成交额列),资金流向图表 |
**数据源:**
| 优先级 | 源 | API | 可靠性 |
|--------|----|-----|--------|
| **主选** | **东方财富 push2his** | `fflow/daykline/get` (httpx) | ⭐⭐⭐⭐⭐ 稳定,无 IP 限流 |
| **备选** | **MX 妙想 API** | `mkapi2.dfcfs.com` (HTTP POST + apikey) | ⚠️ 有每日配额,多 key 轮询+缓存 |
**字段映射(东方财富):**
```
f51=日期, f52=主力净流入, f53=小单, f54=中单, f55=大单, f56=超大单
f57-f61=各占比%, f62=收盘价, f63=涨跌幅
```
> MX API 当前保留为备选。配置 `MX_APIKEY` 或 `MX_APIKEY_{1-9}` 环境变量启用。
> MX 数据只有主力净流入 + 成交额,无大/中/小单拆分(拆分的比例是估算的)。
---
## 5. 公司概况 `/api/stock/profile`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchCompanyProfile(code)``src/lib/stock-api.ts:337` |
| 路由 | `GET /api/stock/profile?code=``routes/stock.py:80` |
| 用途 | 公司全名、行业、高管、联系方式、注册信息、发行信息 |
| 前端使用 | 股票详情页「公司概况」tab |
**数据源:**
| 优先级 | 源 | API | 可靠性 |
|--------|----|-----|--------|
| 主选 | 东方财富 F10 | `emweb.securities.eastmoney.com` HTTPS | ⭐⭐⭐⭐ 稳定,24h 缓存 |
| 降级 | 无 | — | — |
---
## 6. 财务指标 `/api/stock/financial`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchFinancialData(code, years)``src/lib/stock-api.ts:415` |
| 路由 | `GET /api/stock/financial?code=&years=``routes/stock.py:91` |
| 用途 | 每股指标、盈利能力、成长能力、偿债能力、营运能力 |
| 前端使用 | 股票详情页「财务分析」tab(表格+图表) |
**数据源:**
| 优先级 | 源 | API | 可靠性 |
|--------|----|-----|--------|
| 主选 | 东方财富数据中心 | `datacenter.eastmoney.com` HTTPS | ⭐⭐⭐⭐⭐ 稳定,6h 缓存 |
| 降级 | 无 | — | — |
---
## 7. 主营构成 `/api/stock/business-segments`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchBusinessSegments(code, byType, years)``src/lib/stock-api.ts:382` |
| 路由 | `GET /api/stock/business-segments?code=&by_type=&years=``routes/stock.py:119` |
| 用途 | 收入构成(按产品/行业/地区)、成本构成、利润占比、毛利率 |
| 前端使用 | 股票详情页「经营分析」tab(饼图) |
**数据源:**
| 优先级 | 源 | API | 可靠性 |
|--------|----|-----|--------|
| 主选 | 东方财富数据中心 | `datacenter.eastmoney.com` HTTPS | ⭐⭐⭐⭐⭐ 稳定,6h 缓存 |
| 降级 | 无 | — | — |
---
## 8. 板块资金流向 `/api/sectors`
| 项目 | 内容 |
|------|------|
| 前端调用 | `fetchSectors(type)``src/lib/stock-api.ts:461` |
| 路由 | `GET /api/sectors?type=``routes/sectors.py:9` |
| 用途 | 行业/概念板块列表,按主力净流入排序 |
| 前端使用 | `/sectors` 板块资金流向页面 |
**数据源:**
| 优先级 | 源 | API | 可靠性 |
|--------|----|-----|--------|
| **主选** | **东方财富 push2** | `push2.eastmoney.com` (curl_cffi chrome120) | ⭐⭐⭐ 有 IP 限流,60s 内存缓存 + session 重建 |
| **备选** | **AkShare** | `ak.stock_fund_flow_industry/concept` | ⭐⭐ 慢(同步调用),列名需适配 |
**字段映射(东方财富 push2):**
```
f62=主力净流入, f184=主力净流入占比
f66/f69=超大单净流入/占比, f72/f75=大单净流入/占比
f78/f81=中单净流入/占比, f84/f87=小单净流入/占比
f70=成交额
```
> push2.eastmoney.com 有较激进的 IP 限流。通过 curl_cffi 模拟浏览器 TLS 指纹 + 持久化 session + 60s 缓存 + 自动 UT 刷新 + session 重建来缓解。
---
## 9. 估值数据(外部)
> 股票详情页「估值分析」tab 的数据从外部服务加载(landing-page),不由后端代理。
---
## 数据源总结
| 第三方源 | 域名 | 使用场景 | 限流情况 | 是否需要反爬 |
|----------|------|---------|---------|------------|
| **腾讯财经** | `qt.gtimg.cn`, `web.ifzq.gtimg.cn`, `smartbox.gtimg.cn` | 搜索、行情、K线 | 基本无限流 | ❌ |
| **新浪财经** | `money.finance.sina.com.cn` | K线降级 | 宽松 | ❌ |
| **东方财富 push2his** | `push2his.eastmoney.com` | 资金流向、K线 | **部分路径限流**kline/get 被禁,fflow/daykline/get 正常) | ✅ 需 curl_cffi |
| **东方财富 push2** | `push2.eastmoney.com` | 板块数据 | **IP 限流严重** | ✅ 需 curl_cffi |
| **东方财富数据中心** | `datacenter.eastmoney.com` | 财务数据、主营构成 | 宽松 | ❌ |
| **东方财富 F10** | `emweb.securities.eastmoney.com` | 公司概况 | 宽松 | ❌ |
| **MX 妙想** | `mkapi2.dfcfs.com` | 资金流向备选 | 每日配额(113错误码) | ❌ |
| **AkShare** | 同花顺/东方财富 | 板块降级 | 慢但无限制 | ❌ |