151 lines
4.0 KiB
Markdown
151 lines
4.0 KiB
Markdown
# NBA 比赛数据获取实现
|
||||
|
|
|
|||
|
|
## 一、概述
|
|||
|
|
|
|||
|
|
本系统从 NBA Stats API 实时获取 NBA 比赛数据:
|
|||
|
|
- **数据源**:NBA Stats API(官方数据源,实时、准确、完整)
|
|||
|
|
- **不依赖数据库**:所有数据从 API 实时获取
|
|||
|
|
|
|||
|
|
## 二、实现架构
|
|||
|
|
|
|||
|
|
### 2.1 数据流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 从 NBA Stats API 获取比赛列表(实时)
|
|||
|
|
↓
|
|||
|
|
2. 解析 API 响应,转换为 DTO
|
|||
|
|
↓
|
|||
|
|
3. 返回比赛数据给前端
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.2 关于 Polymarket 市场匹配
|
|||
|
|
|
|||
|
|
**当前实现**:
|
|||
|
|
- 不进行市场匹配(因为 Polymarket API 限制)
|
|||
|
|
- 比赛数据中的 `polymarketMarketId` 字段为 `null`
|
|||
|
|
|
|||
|
|
**未来扩展**:
|
|||
|
|
- 如果将来有办法获取 condition_ids,可以从 Polymarket API 实时获取市场信息
|
|||
|
|
- 已保留 `NbaMarketNameParser` 工具类,可用于市场名称解析
|
|||
|
|
|
|||
|
|
### 2.2 核心组件
|
|||
|
|
|
|||
|
|
#### 1. NbaGameService
|
|||
|
|
- **功能**:从 NBA Stats API 实时获取比赛数据
|
|||
|
|
- **数据源**:NBA Stats API(官方数据源)
|
|||
|
|
- **特点**:
|
|||
|
|
- 实时获取,不依赖数据库
|
|||
|
|
- 支持日期范围查询
|
|||
|
|
- 支持按状态过滤
|
|||
|
|
|
|||
|
|
#### 2. NbaMarketNameParser(保留,供将来使用)
|
|||
|
|
- **功能**:解析 Polymarket 市场名称,提取球队和日期信息
|
|||
|
|
- **支持格式**:
|
|||
|
|
- "Team1 vs Team2"
|
|||
|
|
- "Team1 @ Team2"
|
|||
|
|
- "Will Team1 beat Team2"
|
|||
|
|
- "Team1 win"
|
|||
|
|
- **日期格式**:
|
|||
|
|
- "Dec 15, 2024"
|
|||
|
|
- "2024-12-15"
|
|||
|
|
- "12/15/2024"
|
|||
|
|
- **说明**:当前未使用,保留以备将来扩展
|
|||
|
|
|
|||
|
|
## 三、实现细节
|
|||
|
|
|
|||
|
|
### 3.1 比赛数据获取
|
|||
|
|
|
|||
|
|
**获取流程**:
|
|||
|
|
1. 根据日期范围,每天调用一次 NBA Stats API
|
|||
|
|
2. 解析 Scoreboard 响应,提取比赛信息
|
|||
|
|
3. 组合 GameHeader 和 LineScore 数据
|
|||
|
|
4. 转换为 NbaGameDto 返回
|
|||
|
|
|
|||
|
|
**数据字段**:
|
|||
|
|
- 比赛基本信息(球队、日期、时间)
|
|||
|
|
- 实时比分和状态
|
|||
|
|
- 比赛节次和剩余时间
|
|||
|
|
- 球队统计信息
|
|||
|
|
|
|||
|
|
### 3.2 关于市场匹配(未来扩展)
|
|||
|
|
|
|||
|
|
**当前状态**:
|
|||
|
|
- 不进行市场匹配
|
|||
|
|
- `polymarketMarketId` 字段为 `null`
|
|||
|
|
|
|||
|
|
**未来扩展方案**:
|
|||
|
|
如果将来需要匹配市场,可以考虑:
|
|||
|
|
1. 从其他来源获取 condition_ids(如爬取、手动维护等)
|
|||
|
|
2. 使用 Polymarket API 实时查询这些市场
|
|||
|
|
3. 使用 `NbaMarketNameParser` 解析市场名称并匹配
|
|||
|
|
|
|||
|
|
### 3.3 数据返回
|
|||
|
|
|
|||
|
|
**NbaGameDto** 包含:
|
|||
|
|
- 比赛基本信息(从 NBA Stats API)
|
|||
|
|
- `polymarketMarketId`:当前为 `null`(未来可扩展)
|
|||
|
|
|
|||
|
|
## 四、使用方式
|
|||
|
|
|
|||
|
|
### 4.1 API 调用
|
|||
|
|
|
|||
|
|
```kotlin
|
|||
|
|
// 获取比赛列表(自动匹配市场)
|
|||
|
|
val request = NbaGameListRequest(
|
|||
|
|
startDate = "2024-12-15",
|
|||
|
|
endDate = "2024-12-22"
|
|||
|
|
)
|
|||
|
|
val result = nbaGameService.getNbaGames(request)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 返回数据
|
|||
|
|
|
|||
|
|
```kotlin
|
|||
|
|
data class NbaGameDto(
|
|||
|
|
val nbaGameId: String?,
|
|||
|
|
val homeTeam: String,
|
|||
|
|
val awayTeam: String,
|
|||
|
|
val gameDate: LocalDate,
|
|||
|
|
val gameStatus: String,
|
|||
|
|
val homeScore: Int,
|
|||
|
|
val awayScore: Int,
|
|||
|
|
val polymarketMarketId: String? // 匹配的市场 ID
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 五、优势
|
|||
|
|
|
|||
|
|
1. **数据完整**:从 NBA Stats API 获取完整的比赛数据
|
|||
|
|
2. **实时更新**:比赛数据实时获取,不依赖数据库
|
|||
|
|
3. **简单高效**:直接调用 API,无需维护数据库
|
|||
|
|
4. **官方数据源**:数据准确可靠
|
|||
|
|
|
|||
|
|
## 六、注意事项
|
|||
|
|
|
|||
|
|
1. **API 限制**:
|
|||
|
|
- NBA Stats API 需要设置正确的请求头
|
|||
|
|
- 建议控制请求频率(< 10 请求/秒)
|
|||
|
|
|
|||
|
|
2. **市场匹配**:
|
|||
|
|
- 当前不进行市场匹配
|
|||
|
|
- 如果需要匹配,需要解决 Polymarket API 的限制(需要知道 condition_ids)
|
|||
|
|
|
|||
|
|
3. **性能考虑**:
|
|||
|
|
- 日期范围查询会多次调用 API(每天一次)
|
|||
|
|
- 建议合理设置日期范围,避免查询过长的时间段
|
|||
|
|
|
|||
|
|
## 七、后续优化
|
|||
|
|
|
|||
|
|
1. **缓存机制**:
|
|||
|
|
- 缓存 API 响应,减少重复请求
|
|||
|
|
- 设置合理的缓存时间(如 30 秒)
|
|||
|
|
|
|||
|
|
2. **错误处理**:
|
|||
|
|
- 实现重试机制(指数退避)
|
|||
|
|
- 处理 API 临时不可用的情况
|
|||
|
|
|
|||
|
|
3. **市场匹配(可选)**:
|
|||
|
|
- 如果将来有办法获取 condition_ids,可以实现市场匹配
|
|||
|
|
- 使用 `NbaMarketNameParser` 进行市场名称解析
|
|||
|
|
|