Bitcoin Forum
August 18, 2019, 10:47:55 PM *
News: Latest Bitcoin Core release: 0.18.0 [Torrent] (New!)
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Импортируем цены с CMC в googlesheet  (Read 401 times)
temarazin
Full Member
***
Offline Offline

Activity: 224
Merit: 145


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), diks (1), xandry (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 валюты и у вас подгрузится нужная монета.

Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1566168475
Hero Member
*
Offline Offline

Posts: 1566168475

View Profile Personal Message (Offline)

Ignore
1566168475
Reply with quote  #2

1566168475
Report to moderator
1566168475
Hero Member
*
Offline Offline

Posts: 1566168475

View Profile Personal Message (Offline)

Ignore
1566168475
Reply with quote  #2

1566168475
Report to moderator
JohnSilver
Full Member
***
Offline Offline

Activity: 686
Merit: 228


🇧🇬 Trader Since MMXIII


View Profile
May 08, 2019, 01:12:35 PM
Last edit: July 20, 2019, 08:35:01 PM by JohnSilver
Merited by suchmoon (4), chimk (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-20190509.gs)
// REQUIRE: https://github.com/bradjasper/ImportJSON

var scriptLock = LockService.getScriptLock();
var scriptProperties = PropertiesService.getScriptProperties();

var wait = 100;
var timeout = 1000;
var params = {'headers': {
  'Accept': "application/json",
  'Accept-Charset': "utf-8",
  'Accept-Encoding': "identity",
  'Cache-Control': "no-cache, public, max-age=60",
  'Pragma': "no-cache",
  'X-CMC_PRO_API_KEY': scriptProperties.getProperty('CMC_PRO_API_KEY')
}};

/**
 * 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://api.coinmarketcap.com/v2/listings/"} url
 *        The full API-URL address to a public JSON feed.
 * @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,
 *        noHeaders, rawHeaders, debugLocation.
 * @return A two-dimensional array containing the data.
 **/
function JSONLOAD(url, query, options) {
  var data = [[]];
  
  while (!scriptLock.tryLock(timeout)) {
    Utilities.sleep(wait);
  }
  data = ImportJSONAdvanced(url, params, query, options,
                            includeXPath_, defaultTransform_);
  scriptLock.releaseLock();
  
  return data;
}

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



















JohnSilver
Full Member
***
Offline Offline

Activity: 686
Merit: 228


🇧🇬 Trader 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
Newbie
*
Offline Offline

Activity: 490
Merit: 0

Join FlipNpik Telegram : t.me/flipnpikico


View Profile WWW
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
Newbie
*
Offline Offline

Activity: 490
Merit: 0

Join FlipNpik Telegram : t.me/flipnpikico


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

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

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

JohnSilver
Full Member
***
Offline Offline

Activity: 686
Merit: 228


🇧🇬 Trader Since MMXIII


View Profile
June 04, 2019, 06:36:44 AM
Last edit: June 04, 2019, 10:27:40 AM by JohnSilver
 #7

Добавлю простой метод как вручную обновлять данные. Примерно в ячейка A1 ставим Menu: Insert / Checkbox и через него запускаем перезагрузку (в A2 до A16 находится ID по каждую монету):

Code: (ячейка B2)
=transpose(
    coinmarketcap("/v1/cryptocurrency/quotes/latest?id="&join(",",A2:A16),
                  join(",",arrayformula("/data/"&A2:A16&"/quote/USD/price")),
                  "noInherit,noTruncate,noHeaders",A1))

Другой вариант скрипта только для КМК:

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

var scriptProperties = PropertiesService.getScriptProperties();

/**
 * 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 {"/v1/cryptocurrency/listings/latest?start=1&limit=200"} path
 *   The CMC Pro-API full endpoint path (version, category etc).
 * @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.
 * @return A two-dimensional array containing the data.
 **/
function COINMARKETCAP(path, query, options) {
  var params = {'headers': {
    'Accept': "application/json",
    'Accept-Charset': "utf-8",
    'Accept-Encoding': "identity",
    'Cache-Control': "public, no-cache, max-age=60",
    'X-CMC_PRO_API_KEY': scriptProperties.getProperty('CMC_PRO_API_KEY'),
  }};
  
  return ImportJSONAdvanced("https://pro-api.coinmarketcap.com" + path,
                            params, query, options, includeXPath_, defaultTransform_);
}

Andrey123
Sr. Member
****
Offline Offline

Activity: 1036
Merit: 266



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

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

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

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

Hello! Any donations that will go to develop coins.
34bwEhH3GMx6swYXt2NBfFbYGkdTcaWtXz....BTC

Pages: [1]
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!