Bitcoin Forum
May 07, 2024, 12:39:55 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Импортируем цены с CMC в googlesheet  (Read 617 times)
temarazin (OP)
Full Member
***
Offline Offline

Activity: 224
Merit: 186


View Profile
February 17, 2018, 07:16:45 PM
Last edit: June 18, 2019, 03:06:22 AM by temarazin
Merited by suchmoon (4), klarki (2), Symmetrick (2), xandry (1), diks (1), TheFuzzStone (1), JohnSilver (1)
 #1

Привет всем! Я наконец-то разобрался как перетянуть цены с 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 валюты и у вас подгрузится нужная монета.

1715042395
Hero Member
*
Offline Offline

Posts: 1715042395

View Profile Personal Message (Offline)

Ignore
1715042395
Reply with quote  #2

1715042395
Report to moderator
1715042395
Hero Member
*
Offline Offline

Posts: 1715042395

View Profile Personal Message (Offline)

Ignore
1715042395
Reply with quote  #2

1715042395
Report to moderator
1715042395
Hero Member
*
Offline Offline

Posts: 1715042395

View Profile Personal Message (Offline)

Ignore
1715042395
Reply with quote  #2

1715042395
Report to moderator
"The nature of Bitcoin is such that once version 0.1 was released, the core design was set in stone for the rest of its lifetime." -- Satoshi
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1715042395
Hero Member
*
Offline Offline

Posts: 1715042395

View Profile Personal Message (Offline)

Ignore
1715042395
Reply with quote  #2

1715042395
Report to moderator
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
May 08, 2019, 01:12:35 PM
Last edit: September 20, 2019, 06:58:58 AM by JohnSilver
Merited by suchmoon (4), chimk (4), Symmetrick (4), Halab (2), temarazin (2), xandry (1), TheFuzzStone (1), IeSua (1), Roman_P (1)
 #2

Обновлю информацию в связи с новом 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 нужен тогда, когда делаете много запросов в одной таблице и они будут исполняются в очереди, а не все сразу в один момент.



















JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
May 11, 2019, 12:00:58 PM
Last edit: May 14, 2019, 10:25:44 AM by JohnSilver
 #3

Дополнение: иконки и графики

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"
melomanskiy
Copper Member
Jr. Member
*
Offline Offline

Activity: 504
Merit: 6


View Profile
May 23, 2019, 07:51:32 PM
 #4

Довольно интересная штука, автору пришлось видимо заморочиться с кодами) Тут конечно он молодец. Но у меня, как у хомяка, возник вопрос, для какой цели делать такой документ? Меня устраивают готовые сервисы наподобии блокфолио.
btcleks
Jr. Member
*
Offline Offline

Activity: 448
Merit: 3


View Profile
May 24, 2019, 01:43:48 PM
 #5

Ну мало ли зачем может понадобится, например чтобы потом чтото воротить аналитическое по этим данным. Начинание одобряю.
melomanskiy
Copper Member
Jr. Member
*
Offline Offline

Activity: 504
Merit: 6


View Profile
May 31, 2019, 08:25:37 PM
 #6

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

Согласен. Уверен, что эта инфа будет полезна знатным криптовалютным любителям. Возможно в будущем данная вещь перерастет в что-то более масштабное и приобретет свою популярность среди криптоманов)
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
June 04, 2019, 06:36:44 AM
Last edit: September 09, 2019, 09:48:24 PM by JohnSilver
 #7

Добавлю простой метод как вручную обновлять данные. Примерно в ячейка 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))
Andrey123
Sr. Member
****
Offline Offline

Activity: 1750
Merit: 305



View Profile
June 04, 2019, 09:39:10 AM
 #8

Ничего личного, но проку от этого ноль....

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

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

Hello! Voluntary donations that will go towards the development of my coin.
34bwEhH3GMx6swYXt2NBfFbYGkdTcaWtXz....BTC

thefever333
Jr. Member
*
Offline Offline

Activity: 280
Merit: 1


View Profile
September 04, 2019, 09:12:50 AM
 #9

Ничего личного, но проку от этого ноль....

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

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


Просто сайту нужно какое-то время, чтобы все данные проанализировать, если памп будет, то и там через какое-то время покажет )
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
September 08, 2019, 09:22:19 PM
Last edit: September 20, 2019, 07:00:01 AM by JohnSilver
 #10

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 можно менят если нужно).
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
September 09, 2019, 09:23:16 PM
Last edit: September 09, 2019, 10:10:45 PM by JohnSilver
 #11

Ничего личного, но проку от этого ноль....

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

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

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

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

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

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

Fartovy
Full Member
***
Offline Offline

Activity: 512
Merit: 109


View Profile
September 13, 2019, 08:14:25 AM
 #12

Круто. А можно как-то стягивать эти цены и вставлять на свой сайт? Не все, а главные - эфир, биток, рипл и т.д.
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
February 10, 2020, 01:41:59 PM
Last edit: February 10, 2020, 03:26:34 PM by JohnSilver
Merited by Symmetrick (2)
 #13

Сделал все на библиотеку. Сверху из меню в скриптами можно вставлять ее. В девелопмент версию добавил и функция 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);
}
Kzc_support
Newbie
*
Offline Offline

Activity: 18
Merit: 0


View Profile WWW
March 07, 2020, 03:00:11 AM
 #14

Доброе время суток !

Как можно получить информацию только по определенной паре и из определенной биржи ?
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
March 07, 2020, 06:51:55 AM
 #15

Как можно получить информацию только по определенной паре и из определенной биржи ?

Делаешь запрос к АПИ определенной бирже и по определенной паре. Каков вопрос – такой и ответ...
Kzc_support
Newbie
*
Offline Offline

Activity: 18
Merit: 0


View Profile WWW
March 23, 2020, 11:09:31 PM
 #16

В бесплатном аккаунте это недоступно оказывается.
JohnSilver
Sr. Member
****
Offline Offline

Activity: 1026
Merit: 280


🇧🇬 Crypto Since MMXIII


View Profile
March 25, 2020, 09:49:12 AM
 #17

В бесплатном аккаунте это недоступно оказывается.

Делай запрос прямо к АПИ конкретной бирже...
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!