Author

Topic: Импортируем цены с CMC в googlesheet (Read 646 times)

sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
В бесплатном аккаунте это недоступно оказывается.

Делай запрос прямо к АПИ конкретной бирже...
newbie
Activity: 18
Merit: 0
В бесплатном аккаунте это недоступно оказывается.
sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Как можно получить информацию только по определенной паре и из определенной биржи ?

Делаешь запрос к АПИ определенной бирже и по определенной паре. Каков вопрос – такой и ответ...
newbie
Activity: 18
Merit: 0
Доброе время суток !

Как можно получить информацию только по определенной паре и из определенной биржи ?
sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Сделал все на библиотеку. Сверху из меню в скриптами можно вставлять ее. В девелопмент версию добавил и функция parse для прямая обработка JSON объектов.

Script ID: 1moswqalWyN_ahYkjdP-lhBxy4tjHk_-E5RZC3Nfdcyrg77uOQ2xfpVS2
https://script.google.com/d/1moswqalWyN_ahYkjdP-lhBxy4tjHk_-E5RZC3Nfdcyrg77uOQ2xfpVS2/edit?usp=sharing



Функция для таблицу примерно такая:

Code:
var scriptProperties = PropertiesService.getScriptProperties();

function JSONLOAD(url, query, options, apikey, nonce) {
  let params = {
    'headers': {
      'Accept': "application/json",
      'Accept-Charset': "utf-8",
      'Accept-Encoding': "identity",
      'Cache-Control': "no-cache,public,max-age=60,must-revalidate"
    },
    'followRedirects': false,
    'muteHttpExceptions': false
  };
  
  if (typeof apikey == "string") {
    params['headers'][apikey] = scriptProperties.getProperty(apikey);
    params['headers']['Cache-Control'] = "no-cache,private,max-age=60,must-revalidate";
  }
  
  let response = UrlFetchApp.fetch(url, params);
  let jsonObject = JSON.parse(response.getContentText());
  
  return ImportJSON.parse(jsonObject, query, options);
}
full member
Activity: 512
Merit: 109
Круто. А можно как-то стягивать эти цены и вставлять на свой сайт? Не все, а главные - эфир, биток, рипл и т.д.
sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Ничего личного, но проку от этого ноль....

На СМС очень часто данные не верны.
Если где-то был памп, и биржа у монеты перечислена, то сайт нифига не покажет этого....часто это замечал.
Да и бывает монета торгуется, а на сайте этой биржи нет и в помине.

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

Не ограничивай свою фантазию только с CoinMarketCap. Вот пример с Waves DEX биржу:

https://docs.google.com/spreadsheets/d/1_7EZO-70pH5E1PrYyKvwx_5ZwWwYoT-NsHSSADRmBqQ/edit?usp=sharing

... а что нужно анализировать и на чем смотреть это другое дело – тут каждому по заслугам. Cool

PS: Вот прямо с блокчейна скачиваю наличности "аир-дров" и слежу на бирже какая текущая цена и количество на покупки и смогу ли продать их с прибыли.

sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Code: (JSONLOAD-20190909.gs)
// REQUIRE: https://github.com/bradjasper/ImportJSON

/**
 * Imports a JSON feed and returns the results to be inserted
 * into a Google Spreadsheet. The JSON feed is flattened to
 * create a two-dimensional array. The first row contains the
 * headers, with each column header indicating the path to
 * that data in the JSON feed. The remaining rows contain the
 * data.
 *
 * @customfunction
 * @param {"https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest"} url
 *   A full REST API url with endpoint path and parameters.
 * @param {"/data"} query
 *   A comma-separated list of JSON paths. Any path starting
 *   with one of these paths gets imported.
 * @param {"noInherit,noTruncate,noHeaders"} options
 *   A comma-separated list of options that alter processing of
 *   the data: noInherit, noTruncate, rawHeaders, noHeaders,
 *   allHeaders, debugLocation.
 * @param {"X-CMC_PRO_API_KEY"} apikey
 *   An additional HTTP header by the script property key if
 *   needed (add appropriate key/value pair to the properties).
 * @return A two-dimensional array containing the data.
 **/
function JSONLOAD(url, query, options, apikey) {
  const timeout = 1000;
  var scriptLock = LockService.getScriptLock();
  
  while (! scriptLock.tryLock(timeout)) {
    Utilities.sleep(timeout / 10);
  }

  var params = {
    'headers': {
      'Accept': "application/json",
      'Accept-Charset': "utf-8",
      'Accept-Encoding': "identity",
      'Cache-Control': "public, max-age=60, must-revalidate"
    },
    'followRedirects': false,
    'muteHttpExceptions': false
  };
  
  if (apikey && isNaN(apikey) && apikey !== true) {
    var scriptProperties = PropertiesService.getScriptProperties();
    
    apikey = apikey.toString();
    params['headers'][apikey] = properties.getProperty(apikey);
  }
  
  var timer = new Date().getTime();
  var dataArray = ImportJSONAdvanced(url, params, query, options,
                                     includeXPath_, defaultTransform_);
  
  timer = new Date().getTime() - timer;
  Utilities.sleep(Math.max(0, timeout - timer));
  
  return dataArray;
}

В связи с ограничение о запросах в минуту к API...

PS: Также исправил кое что по кешь контроля (public на private или на no-cache можно менят если нужно).
jr. member
Activity: 280
Merit: 1
Ничего личного, но проку от этого ноль....

На СМС очень часто данные не верны.
Если где-то был памп, и биржа у монеты перечислена, то сайт нифига не покажет этого....часто это замечал.
Да и бывает монета торгуется, а на сайте этой биржи нет и в помине.

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


Просто сайту нужно какое-то время, чтобы все данные проанализировать, если памп будет, то и там через какое-то время покажет )
sr. member
Activity: 1778
Merit: 305
Ничего личного, но проку от этого ноль....

На СМС очень часто данные не верны.
Если где-то был памп, и биржа у монеты перечислена, то сайт нифига не покажет этого....часто это замечал.
Да и бывает монета торгуется, а на сайте этой биржи нет и в помине.

Ну и анализировать поведение цен у крипты всей, занятие очень бесполезное....говорю как валютный трейдер со стажем.
На крипте только хаос и везение  Wink
sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Добавлю простой метод как вручную обновлять данные. Примерно в ячейка A1 ставим Menu: Insert / Checkbox и через него запускаем перезагрузку (в A2 до A16 находится ID по каждую монету сортировано):

Code: (ячейка B2)
=transpose(
    jsonload("/v1/cryptocurrency/quotes/latest?id="&join(",",A2:A16),
             join(",",arrayformula("/data/"&A2:A16&"/quote/USD/price")),
             "noInherit,noTruncate,noHeaders","X-CMC_PRO_API_KEY",A1))
copper member
Activity: 504
Merit: 6
Ну мало ли зачем может понадобится, например чтобы потом чтото воротить аналитическое по этим данным. Начинание одобряю.

Согласен. Уверен, что эта инфа будет полезна знатным криптовалютным любителям. Возможно в будущем данная вещь перерастет в что-то более масштабное и приобретет свою популярность среди криптоманов)
jr. member
Activity: 448
Merit: 3
Ну мало ли зачем может понадобится, например чтобы потом чтото воротить аналитическое по этим данным. Начинание одобряю.
copper member
Activity: 504
Merit: 6
Довольно интересная штука, автору пришлось видимо заморочиться с кодами) Тут конечно он молодец. Но у меня, как у хомяка, возник вопрос, для какой цели делать такой документ? Меня устраивают готовые сервисы наподобии блокфолио.
sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Дополнение: иконки и графики

Code: (Пример: ID=1027 – Ethereum)
=image("https://s2.coinmarketcap.com/static/img/coins/16x16/1027.png",3)

=image("https://s2.coinmarketcap.com/generated/sparklines/web/7d/usd/1027.png",2)

Также можно менять 16x16 на 32, 64 и 128, а для графики 7d примерно на 30d, но не проверял верен ли он.





Code: (Формат объема и капитализации в миллионах)
"$"#,##0.000,,"M"
sr. member
Activity: 1026
Merit: 280
🇧🇬 Crypto Since MMXIII
Обновлю информацию в связи с новом Pro-API на CoinMarketCap. Пока не буду затрагивать как сделать триггер для автообновление и т.д. Все что нужно знать, что после как загрузите двух скриптах (File: New / Script file, Rename, Save all), нужно нажать на JSONLOAD.gs (окно активное) и потом сверху на плей-иконку  (срипт закончит с ошибка из за нулевых параметров, но не важно) – откроется окно для авторизации скрипта (чтобы скрипт смог менять таблицу). В этом окне выбираете ваш аккаунт, а потом внизу слева с мельком шрифте Advanced и появится еще внизу Go to <имя скрипта> (unsafe), и в конечное окно подтверждаете. Все!

Замечания: В ваш гугл профил в раздел безопасности надо/сможете подтвердить/удалить статус доступа, иначе в страница поиска внизу будет иконка с предупреждение о безопасности аккаунта (доступ третья сторона). Все будет работать хорошо и без этого (информативно пояснил). Также смотрите в почту – иногда приходят оповещения об ошибки скрипта (более часто, если прикрутите триггер для автоматизации).

ImportJSON.gs – https://github.com/bradjasper/ImportJSON (это оригинальный проект)
ImportJSON-git852565b-patched.gs – https://drive.google.com/open?id=10Xfg4sggU7POQi9GsGyeiehhW8Hz-PgY

Code: (ImportJSON-git852565b.patch)
--- ImportJSON-git852565b.gs 2019-05-08 17:28:29.737736133 +0300
+++ ImportJSON-git852565b-patched.gs 2019-05-08 17:31:03.965516139 +0300
@@ -377,7 +377,7 @@
         }
       }
     }
-  } else if (isObject_(value)) {
+  } else if (value != null && isObject_(value)) {
     for (key in value) {
       if (parseData_(headers, data, path + "/" + key, state, value[key], query, options, includeFunc)) {
         dataInserted = true;

Пач нужен из за оформление JSON-а который возвращает CoinMarketCap – ячейки с стоимости null. Из за них колонки начинающих с пустая ячейка не отображается. Что-то в этом духе (исправлял год назад и не помню), но добавление "value != null" в проверку на 380 строка решает проблема и все верно отображается в таблицу.

Code: (JSONLOAD-20190909.gs)
// REQUIRE: https://github.com/bradjasper/ImportJSON

/**
 * Imports a JSON feed and returns the results to be inserted
 * into a Google Spreadsheet. The JSON feed is flattened to
 * create a two-dimensional array. The first row contains the
 * headers, with each column header indicating the path to
 * that data in the JSON feed. The remaining rows contain the
 * data.
 *
 * @customfunction
 * @param {"https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest"} url
 *   A full REST API url with endpoint path and parameters.
 * @param {"/data"} query
 *   A comma-separated list of JSON paths. Any path starting
 *   with one of these paths gets imported.
 * @param {"noInherit,noTruncate,noHeaders"} options
 *   A comma-separated list of options that alter processing of
 *   the data: noInherit, noTruncate, rawHeaders, noHeaders,
 *   allHeaders, debugLocation.
 * @param {"X-CMC_PRO_API_KEY"} apikey
 *   An additional HTTP header by the script property key if
 *   needed (add appropriate key/value pair to the properties).
 * @return A two-dimensional array containing the data.
 **/
function JSONLOAD(url, query, options, apikey) {
  const timeout = 1000;
  var scriptLock = LockService.getScriptLock();
  
  while (! scriptLock.tryLock(timeout)) {
    Utilities.sleep(timeout / 10);
  }

  var params = {
    'headers': {
      'Accept': "application/json",
      'Accept-Charset': "utf-8",
      'Accept-Encoding': "identity",
      'Cache-Control': "public, max-age=60, must-revalidate"
    },
    'followRedirects': false,
    'muteHttpExceptions': false
  };
  
  if (apikey && isNaN(apikey) && apikey !== true) {
    var scriptProperties = PropertiesService.getScriptProperties();
    
    apikey = apikey.toString();
    params['headers'][apikey] = properties.getProperty(apikey);
  }
  
  var timer = new Date().getTime();
  var dataArray = ImportJSONAdvanced(url, params, query, options,
                                     includeXPath_, defaultTransform_);
  
  timer = new Date().getTime() - timer;
  Utilities.sleep(Math.max(0, timeout - timer));
  
  return dataArray;
}

Help информацию для функцию JSONLOAD не обновлял, но годится... Если будете использовать скрипта для доступ к биржи, то надо удалить строкой с параметром X-CMC_PRO_API_KEY и эвентуально поменять верхней с Cache-Control (сейчас там поставлен кешь на 5 мин * 60 сек = 300 сек). LockService нужен тогда, когда делаете много запросов в одной таблице и они будут исполняются в очереди, а не все сразу в один момент.



















full member
Activity: 224
Merit: 186
Привет всем! Я наконец-то разобрался как перетянуть цены с CoinMarketCap в гугл таблицу.

Первым делом создаем новую таблицу в googlesheet. Нам нужно перетягивать данные в формате JSON, который гуглшит по умолчанию не поддерживает. Поэтому сначала добавим в свою таблицу скрипт. Код берем с этого репозитория - просто копируем всё в буфер. Далее в гугл-таблице переходим в Инструменты - Редактор скриптов. Вставляем скопированный скрипт, переименовываем файл в левом столбце как на картинке.


Сохраняем и возвращаемся к пустой таблице. Теперь мы можем импортировать json с помощью =ImportJSON
Формат формулы следующий: =ImportJSON("url"; "столбцы"; "параметры")
Я для себя остановился на такой формуле

Code:
=ImportJSON("https://api.coinmarketcap.com/v1/ticker/ethereum/"; "/name,/symbol,/price_usd,/percent_change_24h,/percent_change_7d"; "noHeaders")

https://api.coinmarketcap.com/v1/ticker/ethereum/ - вместо ethereum подставляем нужный id валюты. Чтобы его узнать, перейдите на страницу необходимой валюты на сайте CMC - он будет виден в url. Например, у BCH путь выглядит так: https://coinmarketcap.com/currencies/bitcoin-cash/, значит id у него: bitcoin-cash

"/name,/symbol,/price_usd,/percent_change_24h,/percent_change_7d"
тут перечислены выводимые столбцы по такому синтаксису "/имя_столбца1,/имя_столбца2"
Все столбцы можно посмотреть здесь

"noHeaders" - параметр, который убирает названия столбцов. Я их убрал, потому что столбцы назвал сам.



Ну и для тех, кто не хочет заморачиваться, я выложу таблицу с готовым примером. Нажмите файл - создать копию, чтобы перетянуть её себе. Все изменения вносите в столбце А - просто меняете id валюты и у вас подгрузится нужная монета.

Jump to: