Использование coinmarketcap api v2 с гугл листами - добавление в js объект несколькими вызовами - PullRequest
0 голосов
/ 30 мая 2018

Я пользуюсь coinmarketcap api, чтобы заполнить Google листами данных.https://coinmarketcap.com/api/

Они вносят некоторые изменения, которые усложнят это.Два изменения, которые меня запутывают, - это разбиение на страницы и изменение структуры JSON.

Раньше у меня был столбец идентификаторов монет на листах Google.Я бы взял все данные о монетах из coinmarketcap, а затем перебрал массив javascript, чтобы получить нужные мне данные.Вот пример

function getMarketCap(sheetname) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetname);

  var assets = [];

  var idRange = sheet.getRange("B1:B");
  var lastRow = getLastRowOfRange(idRange);

  var cellRange = sheet.getRange(1, 2, lastRow).getValues();
  var mcRange = sheet.getRange(1, 3, lastRow);

  var mcValues = [];

   for (var i = 0; i < cellRange.length; i++) {
    assets[i] = cellRange[i];
  }

  var CMCdata = JSON.parse(UrlFetchApp.fetch('https://api.coinmarketcap.com/v1/ticker/?limit=0')); 
  for (var i = 0; i < assets.length; i++) {

    mcValues[i] = [];
    for (var x = 0; x < CMCdata.length; x++) {
      if (assets[i] == CMCdata[x]["id"]) {
        mcValues[i][0] = CMCdata[x]["market_cap_usd"];
      }
      if (!mcValues[i][0]) {
        mcValues[i][0] = 'xxx';
      }      
    }
  }

  mcRange.setValues(mcValues); 
}

Теперь с v2 они делают это, так что вы можете получить только 100 результатов за раз вместо всех сразу https://api.coinmarketcap.com/v2/ticker/ против https://api.coinmarketcap.com/v1/ticker/?limit=0.

Как я могу сделать то, что делал раньше с этими изменениями?Можно ли сделать 12 запросов (100 монет за один раз, всего около 1200), каждый раз добавляя результаты, а затем перебирая данные?Как бы я это сделал?У меня есть только базовые знания по кодированию, и кто-то помог мне с кодом, показанным выше.

1 Ответ

0 голосов
/ 30 мая 2018

Как насчет этой модификации?

Точки модификации:

  • С v1 по v2 в вашем скрипте есть следующие модификации.
    • id стало website_slug.
    • market_cap_usd стало USD.market_cap.
    • Идентификационный номер стал ключом каждого элемента.
  • Для запроса 12 API-вызовов используется метод fetchAll.

Модифицированный скрипт:

function getMarketCap(sheetname) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetname);
  var assets = [];
  var idRange = sheet.getRange("B1:B");
  var lastRow = getLastRowOfRange(idRange);
  var cellRange = sheet.getRange(1, 2, lastRow).getValues();
  var mcRange = sheet.getRange(1, 3, lastRow);
  var mcValues = [];
  for (var i = 0; i < cellRange.length; i++) {
    assets[i] = cellRange[i];
  }

  // Added script --- begin
  var req = [];
  for (var i = 0; i < 12; i++) {
    req.push({
      muteHttpExceptions: true,
      method: "get",
      url: "https://api.coinmarketcap.com/v2/ticker/?start=" + (i * 100 + 1),
    });
  }
  var responses = UrlFetchApp.fetchAll(req);
  var res = responses.filter(function(e){return e.getResponseCode() == 200}).map(function(e){return JSON.parse(e.getContentText())});
  if (responses.length != res.length) Logger.log("%s errors occurred.", responses.length - res.length);
  var mcValues = [];
  assets.forEach(function(e, h) {
    mcValues[h] = [];
    res.some(function(f) {
      Object.keys(f.data).some(function(g) {
        if (f.data[g].website_slug == e[0]) {
          mcValues[h][0] = f.data[g].quotes.USD.market_cap;
          return true;
        }        
      });
      if (mcValues[h][0]) return true;
    });
    if (!mcValues[h][0]) mcValues[h][0] = 'xxx';
  });
  // Added script --- end

  mcRange.setValues(mcValues); 
}

Примечание:

  • Когда я тестировал этот скрипт, я заметил, что иногда возникает ошибка из-за ограничения скорости.
    • В этом случае возвращается HTML, включая <title>Access denied | api.coinmarketcap.com used Cloudflare to restrict access</title>.
    • В этом скрипте при возникновении ошибки «произошли ошибки».выводится с использованием Logger.log().
    • Когда возникает ошибка ограничения, пожалуйста, подождите, пока ограничение не будет снято.Я подумал, что если есть токен доступа и токены для каждого пользователя, пользователи могут настроить вызовы API.Но я не мог найти такие токены.Извините.

Ссылка:

В моем окруженииЯ мог бы подтвердить, что этот модифицированный скрипт работал.Но если это не то, что вы хотите, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...