Bitcoin Forum
May 10, 2024, 03:32:14 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 валюты и у вас подгрузится нужная монета.

1715311934
Hero Member
*
Offline Offline

Posts: 1715311934

View Profile Personal Message (Offline)

Ignore
1715311934
Reply with quote  #2

1715311934
Report to moderator
There are several different types of Bitcoin clients. The most secure are full nodes like Bitcoin Core, which will follow the rules of the network no matter what miners do. Even if every miner decided to create 1000 bitcoins per block, full nodes would stick to the rules and reject those blocks.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
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!