В 2017 года Yahoo свернуло свое API для Yahoo Finance, однако со временем обнаружилось что в качестве альтернативы можно использовать API фронтенда самих сервисов Яху.

Я собрал небольшой класс на Google Apps Script, который можно использовать в качестве составной части в других проектах. На моём Гитхабе есть версия в виде библиотеки — https://github.com/pamnard/YahooFinanceApp, но мне самому не нравится как работают библиотеки в GAS, поэтому я переписал все на встраиваемый класс.

class YahooFinanceApp {
  constructor() {
    this.connect = function api(symbol, module) {
      const baseUrl = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/',
        options = {
          'muteHttpExceptions': true,
          'headers': get_headers(),
          'method': 'GET',
          'contentType': 'application/json; charset=utf-8',
        },
        fullUrl = `${baseUrl}${symbol}?modules=${module}`;
      var json;
      while (json == undefined) {
        Utilities.sleep(500); //Avoids HTTP 429 (Too many requests)
        var response = UrlFetchApp.fetch(fullUrl, options);
        var json = JSON.parse(response);
      }
      if (!!json.quoteSummary) {
        if (json.quoteSummary.error != null) {
          return json.quoteSummary
        } else {
          return json.quoteSummary.result[0]
        }
      } else {
        throw new Error('Обращение заблокировано');
      }
      function get_headers() {
        return {
          'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
          'accept-encoding': 'gzip, deflate, br',
          'accept-language': 'en-GB,en;q=0.9,en-US;q=0.8,ml;q=0.7',
          'cache-control': 'max-age=0',
          'dnt': '1',
          'sec-fetch-dest': 'document',
          'sec-fetch-mode': 'navigate',
          'sec-fetch-site': 'none',
          'sec-fetch-user': '?1',
          'upgrade-insecure-requests': '1',
          'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
        }
      }
    }
  }
  assetProfile(symbol) {
    return this.connect(symbol, 'assetProfile');
  }
  incomeStatementHistory(symbol) {
    return this.connect(symbol, 'incomeStatementHistory');
  }
  incomeStatementHistoryQuarterly(symbol) {
    return this.connect(symbol, 'incomeStatementHistoryQuarterly');
  }
  balanceSheetHistory(symbol) {
    return this.connect(symbol, 'balanceSheetHistory');
  }
  balanceSheetHistoryQuarterly(symbol) {
    return this.connect(symbol, 'balanceSheetHistoryQuarterly');
  }
  cashflowStatementHistory(symbol) {
    return this.connect(symbol, 'cashflowStatementHistory');
  }
  cashflowStatementHistoryQuarterly(symbol) {
    return this.connect(symbol, 'cashflowStatementHistoryQuarterly');
  }
  defaultKeyStatistics(symbol) {
    return this.connect(symbol, 'defaultKeyStatistics');
  }
  financialData(symbol) {
    return this.connect(symbol, 'financialData');
  }
  calendarEvents(symbol) {
    return this.connect(symbol, 'calendarEvents');
  }
  secFilings(symbol) {
    return this.connect(symbol, 'secFilings');
  }
  recommendationTrend(symbol) {
    return this.connect(symbol, 'recommendationTrend');
  }
  upgradeDowngradeHistory(symbol) {
    return this.connect(symbol, 'upgradeDowngradeHistory');
  }
  institutionOwnership(symbol) {
    return this.connect(symbol, 'institutionOwnership');
  }
  fundOwnership(symbol) {
    return this.connect(symbol, 'fundOwnership');
  }
  majorDirectHolders(symbol) {
    return this.connect(symbol, 'majorDirectHolders');
  }
  majorHoldersBreakdown(symbol) {
    return this.connect(symbol, 'majorHoldersBreakdown');
  }
  insiderTransactions(symbol) {
    return this.connect(symbol, 'insiderTransactions');
  }
  insiderHolders(symbol) {
    return this.connect(symbol, 'insiderHolders');
  }
  netSharePurchaseActivity(symbol) {
    return this.connect(symbol, 'netSharePurchaseActivity');
  }
  earnings(symbol) {
    return this.connect(symbol, 'earnings');
  }
  earningsHistory(symbol) {
    return this.connect(symbol, 'earningsHistory');
  }
  earningsTrend(symbol) {
    return this.connect(symbol, 'earningsTrend');
  }
  industryTrend(symbol) {
    return this.connect(symbol, 'industryTrend');
  }
  indexTrend(symbol) {
    return this.connect(symbol, 'indexTrend');
  }
  sectorTrend(symbol) {
    return this.connect(symbol, 'sectorTrend');
  }
};

Добавьте класс в отдельный файл проекта, и вызывайте его откуда угодно. Например, вот такой запрос, вернет вам данные по бумагам AAPL (Apple):

var json = new YahooFinanceApp().financialData('AAPL');

Как будто вы бы перешли в браузере по ссылке https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?modules=financialData

Все методы класса аналогичны модулям самого API. Если уже пользовались раньше — все будет интуитивно понятно.

Ещё интересное


Добавить комментарий