[ПОЛЕЗНО] Скрипт Google Spreadsheets для парсинга курсов криптовалют через API + ЗАПРОС ПОМОЩИ [СКРИПТ]
Меня тут попросили помочь с криптоаналитикой, а я как раз свою обновлять собирался, и вот занялся частью автоматизации загрузки информации с API бирж прямо в Google Scripts (без выхода из гугл-таблиц).
Аналитику делаем с Аней (@anikanaum), за подробные критерии и большую проделанную работу уже сейчас ей отдельное спасибо! Но перейду к автоматизации, к той части, которой занимаюсь я.
Задача была достаточно простая - загружать через API бирж курсы котировок на сейчас и месяц назад по имени валюты, и сохранять эти данные в таблицу. Обрабатывая возвращающийся JSON.
Всё это реализуемо при помощи гугл-скрипта ниже. Если у вас есть опыт работы с этой штукой, ниже будет один вопрос. А пока рассмотрим сам скрипт (работает, но с определенными "моментами").
Что надо иметь для начала
- Гугл-таблица, в которой, например, такие колонки:
** Колонка C - имена валют (большими буквами, без пробелов и знаков, пример: LTC, XMR, XPM)
** Колонка D - оставляйте пустой, туда запишутся текущие курсы
** Колонка E - оставляете пустой, туда запишутся курсы 30 дней назад - Если приготовили таблицу с колонкой C и именами валют, запомните номера строк, на которых эти валюты указаны. Например, если у вас 16 валют в строках с 5 по 20, то скрипт для вас заработает из коробки. Если нет - в range укажите строки, где записаны требуемые валюты, через запятую
Как запустить
- В таблице нажмите "Инструменты - редактор скриптов"
- Скопируйте скрипт ниже и вставьте его основное поле.
- Если условия выше выполнены и менять ничего не нужно, нажмите стрелку вправо (кнопку "плей"), вернитесь в таблицу и смотрите как примерно раз в 2-4 секунды заполняются соответствующие поля
function myFunction() {
var range = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
var source = "C"; // Из какой колонки берем значения
var target = "D"; // В какую колонку пишем значения
var historical = "E"; // Куда пишем исторические значения
var historicaltime = "2592000"; // Сколько секунд назад значения интересуют (60*60*24*30, т.е. за месяц)
var currentunixtime = Date.now();
var monthago = currentunixtime - historicaltime // Рассчет времени месяц назад
var base = "BTC" // Базовая валюта
//var url = 'https://www.poloniex.com/public?command=returnTicker'
var ss = SpreadsheetApp.getActiveSpreadsheet(); // Выбираем активную таблицу
var sheet = ss.getSheetByName("Биржа"); // Выбираем нужную страницу
var index;
for (index = 0; index < range.length; ++index) {
var currency = sheet.getRange(source+range[index]).getValue(); // Берём название валюты из таблицы
var url = 'https://min-api.cryptocompare.com/data/price?fsym='+base+'&tsyms='+currency; // Загружаем URL
var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true}); // Получаем ответ
var json = response.getContentText(); // Обрабатываем ответ
var data = JSON.parse(json); // Парсим json
var buf = 'data.'+currency // Формируем переменную по которой парсить результаты
SpreadsheetApp.getActiveSheet().getRange(target+range[index]).setValue(eval(buf)); // Пишем в ячейку распарсенный результат (eval(buf))
Utilities.sleep(2000);
url = 'https://min-api.cryptocompare.com/data/pricehistorical?fsym='+base+'&tsyms='+currency+'&ts='+monthago
response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
json = response.getContentText();
data = JSON.parse(json);
buf = 'data.'+base+'.'+currency
//eval(buf);
SpreadsheetApp.getActiveSheet().getRange(historical+range[index]).setValue(eval(buf));
Utilities.sleep(2000);
}
}
Проблемы скрипта
- Маленькая проблема. Пока что не обрабатываются ошибки. Если вдруг вы постаивли пробел в названии валюты или неправильно указали его (указали несуществущую валюту), скрипт остановится на "этом месте". Вам придется редактировать Range или перезапускать с начала. Подробности об ошибке можно посмотреть, запустив скрипт кнопкой Bug (с жучком), вместо кнопки Play.
- Большая проблема. Rate limit exceeded (что-то вроде "лимит запросов достигнут"). Примерно после 100 запросов, на вскидку, постоянно начинает выскакивать эта ошибка. Подробности об ошибке можно посмотреть, запустив скрипт кнопкой Bug (с жучком), вместо кнопки Play. Если подождать около часа, точно не могу сказать - проходит. На следующий день, точно!
картинка просто в тему
Нужна помощь
Я пока не понял почему такие низкие лимиты на обработку гуглом (вроде как указано - 1 запрос в секунду, и не сказано ничего о лимитах после 100 запросов), и как с ними бороться (не хотелось бы внешними обработчиками). Если вы знаете как обойти эти ограничения или вписаться в них, просьба - комментируйте! Да и вообще, просто так. Комментируйте :)
Чуть более старая версия скрипта
https://pastebin.com/LgAHskux
С вами на связи линуксоид, альтернативщик,
Den Ivanov aka @SXIII