У Мосбиржи есть отличное API, которое без ключа отдает много полезного.
Обращаясь к эндпоинту moex.com/iss/statistics/engines/currency/markets/selt/rates мы получаем XML, с курсами йены, доллара и евро к рублю.
Вариант скрипта, в котором мы парсим XML как нормальные люди:
function usdClose() {
const url = 'moex.com/iss/statistics/engines/currency/markets/selt/rates'
const r = UrlFetchApp.fetch(url);
var d = XmlService.parse(r);
var root = d.getRootElement();
var dataElement = root.getChild('data');
var rowsElement = dataElement.getChild('rows');
var rowElement = rowsElement.getChild('row');
var closePrice = rowElement.getAttribute('USDTOM_UTS_CLOSEPRICE').getValue();
Logger.log(closePrice); // 93.0351
return closePrice
};И вариант, где мы просто выдергиваем регулярным выражением нужное поле:
function eurLast() {
...
const regExp = /"EURRUB_TOM" price="(.+?)"/;
const lastPrice = r.toString().match(regExp)?.[1];
Logger.log(lastPrice); //
return lastPrice; //93.0351
};
Обходим проблему недоступности серверов
Иногда сервер Мосбиржи недоступен и скрипт падает с ошибкой, давайте для этих случаев напишем
//так запускать, дадим скрипту три попытки
function go() {
retry(3, eurLast);
}//сама обертка
function retry(n, func, ...args) {
for (let i = 0; i < Math.min(n, 9); i++) {
try {
return func(...args)
} catch (e) {
Logger.log("Retry " + (i + 1) + " failed, waiting")
Logger.log(e)
Utilities.sleep(i * 1000)
}
}
throw "Number of tries exceeded, aborting"
}
