对接印度股票数据源的实现案例

下面是一个使用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();

实现说明

  1. 模块化设计

    • 封装IndiaStockAPI类处理所有API调用
    • 使用缓存机制减少重复请求
    • 错误处理统一管理
  2. 核心功能

    • 股票列表获取:通过getStockList()获取分页数据
    • 股票详情查询:使用getStockDetail()通过PID查询
    • K线数据:支持不同时间粒度获取
    • 实时数据:WebSocket实现价格实时更新
    • 市场数据:IPO日历、涨跌排行榜等
  3. 最佳实践

    • 使用axios处理HTTP请求
    • WebSocket连接管理
    • 数据缓存减少API调用
    • 错误处理和重试机制
    • 参数化配置(国家ID、API Key等)
  4. 使用示例

    • 获取股票列表
    • 查询单只股票详情
    • 获取历史K线
    • 获取IPO数据
    • 建立WebSocket实时连接

关键配置参数

参数描述示例值
countryId国家ID(印度=14)14
intervalK线时间粒度PT15M(15分钟)
pageSize分页大小10
type排行榜类型(1=涨幅榜)1

扩展建议

  1. 添加订阅管理机制,只接收关注的股票实时数据
  2. 实现自动重连机制确保WebSocket稳定性
  3. 添加数据持久化层(数据库存储)
  4. 实现限流机制防止API调用超限
  5. 添加更详细的事件处理(如价格波动预警)

此实现覆盖了印度股票数据的主要接口,可根据业务需求进一步扩展。使用时请确保替换为有效的API Key。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值