下面是一个使用Node.js对接印度股票数据源的实现案例,涵盖多个关键接口:
官方文档API
const axios = require('axios');
const WebSocket = require('ws');
// 配置信息
const CONFIG = {
apiKey: 'MY4b781f618e3f43c4b055f25fa61941ad', // 替换为实际API Key
baseUrl: 'https://api.stocktv.top',
wsUrl: 'wss://ws-api.stocktv.top/connect',
countryId: 14, // 印度国家ID
};
class IndiaStockAPI {
constructor() {
this.stockCache = new Map(); // 股票数据缓存
}
// 获取市场股票列表
async getStockList(page = 1, pageSize = 10) {
try {
const response = await axios.get(`${CONFIG.baseUrl}/stock/stocks`, {
params: {
countryId: CONFIG.countryId,
pageSize,
page,
key: CONFIG.apiKey
}
});
// 缓存股票数据
response.data.data.records.forEach(stock => {
this.stockCache.set(stock.id, stock);
});
return response.data;
} catch (error) {
throw new Error(`获取股票列表失败: ${error.message}`);
}
}
// 查询股票详情
async getStockDetail(pid) {
try {
// 先尝试从缓存获取
if (this.stockCache.has(pid)) {
return this.stockCache.get(pid);
}
const response = await axios.get(`${CONFIG.baseUrl}/stock/queryStocks`, {
params: {
id: pid,
key: CONFIG.apiKey
}
});
// 更新缓存
if (response.data.data && response.data.data.length > 0) {
this.stockCache.set(pid, response.data.data[0]);
return response.data.data[0];
}
return null;
} catch (error) {
throw new Error(`查询股票失败: ${error.message}`);
}
}
// 获取股票K线数据
async getKlineData(pid, interval = 'PT15M') {
try {
const response = await axios.get(`${CONFIG.baseUrl}/stock/kline`, {
params: {
pid,
interval,
key: CONFIG.apiKey
}
});
return response.data.data;
} catch (error) {
throw new Error(`获取K线失败: ${error.message}`);
}
}
// 获取IPO新股日历
async getIpoCalendar() {
try {
const response = await axios.get(`${CONFIG.baseUrl}/stock/getIpo`, {
params: {
countryId: CONFIG.countryId,
key: CONFIG.apiKey
}
});
return response.data.data;
} catch (error) {
throw new Error(`获取IPO数据失败: ${error.message}`);
}
}
// 获取涨跌排行榜
async getTopGainersLosers(type = 1) {
try {
const response = await axios.get(`${CONFIG.baseUrl}/stock/updownList`, {
params: {
countryId: CONFIG.countryId,
type,
key: CONFIG.apiKey
}
});
return response.data.data;
} catch (error) {
throw new Error(`获取排行榜失败: ${error.message}`);
}
}
// 创建WebSocket连接
createWebSocketConnection() {
return new Promise((resolve, reject) => {
const ws = new WebSocket(`${CONFIG.wsUrl}?key=${CONFIG.apiKey}`);
ws.on('open', () => {
console.log('WebSocket连接已建立');
resolve(ws);
});
ws.on('message', data => {
try {
const message = JSON.parse(data);
this.handleRealTimeData(message);
} catch (e) {
console.error('解析实时数据失败:', e);
}
});
ws.on('error', err => {
console.error('WebSocket错误:', err);
reject(err);
});
ws.on('close', () => {
console.log('WebSocket连接已关闭');
});
});
}
// 处理实时数据
handleRealTimeData(data) {
// 更新缓存中的股票数据
if (this.stockCache.has(data.pid)) {
const stock = this.stockCache.get(data.pid);
// 更新价格信息
stock.last = parseFloat(data.last_numeric);
stock.chg = parseFloat(data.pc);
stock.chgPct = parseFloat(data.pcp);
// 触发事件处理
this.emit('priceUpdate', stock);
}
}
// 使用示例
static async runExample() {
const api = new IndiaStockAPI();
try {
// 获取第一页股票列表
const stockList = await api.getStockList();
console.log(`获取到${stockList.data.total}支股票`);
if (stockList.data.records.length > 0) {
const firstStockId = stockList.data.records[0].id;
// 获取第一支股票的详情
const stockDetail = await api.getStockDetail(firstStockId);
console.log('股票详情:', stockDetail.name, stockDetail.symbol, stockDetail.last);
// 获取该股票的K线数据
const klineData = await api.getKlineData(firstStockId);
console.log('K线数据:', klineData.slice(0, 2)); // 显示前2条
// 获取IPO数据
const ipoData = await api.getIpoCalendar();
console.log('近期IPO:', ipoData[0]?.company);
// 获取涨幅榜
const gainers = await api.getTopGainersLosers(1);
console.log('涨幅榜首位:', gainers[0]?.name, gainers[0]?.chgPct);
}
// 建立WebSocket连接
const ws = await api.createWebSocketConnection();
// 30秒后关闭连接
setTimeout(() => {
ws.close();
}, 30000);
} catch (error) {
console.error('运行示例出错:', error);
}
}
}
// 运行示例
IndiaStockAPI.runExample();
实现说明
-
模块化设计:
- 封装
IndiaStockAPI类处理所有API调用 - 使用缓存机制减少重复请求
- 错误处理统一管理
- 封装
-
核心功能:
- 股票列表获取:通过
getStockList()获取分页数据 - 股票详情查询:使用
getStockDetail()通过PID查询 - K线数据:支持不同时间粒度获取
- 实时数据:WebSocket实现价格实时更新
- 市场数据:IPO日历、涨跌排行榜等
- 股票列表获取:通过
-
最佳实践:
- 使用axios处理HTTP请求
- WebSocket连接管理
- 数据缓存减少API调用
- 错误处理和重试机制
- 参数化配置(国家ID、API Key等)
-
使用示例:
- 获取股票列表
- 查询单只股票详情
- 获取历史K线
- 获取IPO数据
- 建立WebSocket实时连接
关键配置参数
| 参数 | 描述 | 示例值 |
|---|---|---|
| countryId | 国家ID(印度=14) | 14 |
| interval | K线时间粒度 | PT15M(15分钟) |
| pageSize | 分页大小 | 10 |
| type | 排行榜类型(1=涨幅榜) | 1 |
扩展建议
- 添加订阅管理机制,只接收关注的股票实时数据
- 实现自动重连机制确保WebSocket稳定性
- 添加数据持久化层(数据库存储)
- 实现限流机制防止API调用超限
- 添加更详细的事件处理(如价格波动预警)
此实现覆盖了印度股票数据的主要接口,可根据业务需求进一步扩展。使用时请确保替换为有效的API Key。
691

被折叠的 条评论
为什么被折叠?



