Задать вопрос

Как узнать курс валюты в командной строке терминала?

Пятничное. Может знаете, какой запрос и на какой сайт можно послать в командной строке терминала , чтобы в ответ получить текущий курс валюты по ЦБ (eur / usd)?
  • Вопрос задан
  • 522 просмотра
Подписаться 2 Простой 3 комментария
Решения вопроса 2
xotkot
@xotkot
хорошо есть и хорошо весьма
у ЦБР есть официальная страничка где можно узнать как получить нужные данные

если коротко, то будет примерно так:
$ curl -s "http://www.cbr.ru/scripts/XML_daily.asp" | enconv -x UTF-8 | xq -r '.ValCurs.Valute[] | select(.CharCode == "USD" or .CharCode == "EUR") |.CharCode + " " + .Value'
USD 74,7087
EUR 79,5716


с помощью curl качаем нужные данные в формате xml
далее переводим с помощью утилиты enconv в обще нормальную кодировку
затем с помощью утилиты xq разбираем полученные данные
xq входит в пакет yq которая по сути является надстройкой над jq, то есть здесь xml транслируется в json а после обрабатывается утилитой jq

вот пример вывода всех доступных курсов валют в отформатированном виде с помощью утилиты csview
curl -s "http://www.cbr.ru/scripts/XML_daily.asp" | enconv -x UTF-8 | xq -r '.ValCurs.Valute[] | .CharCode + " " + .Nominal + " " + .Value' | sort | awk 'BEGIN{print "Code Nominal Value"}{print}' | csview -d' '

вывод:
┌──────┬─────────┬─────────┐
│ Code │ Nominal │ Value   │
├──────┼─────────┼─────────┤
│ AED  │ 1       │ 20,3400 │
│ AMD  │ 100     │ 19,1325 │
│ AUD  │ 1       │ 51,0933 │
│ AZN  │ 1       │ 43,9463 │
│ BGN  │ 1       │ 40,7332 │
│ BRL  │ 1       │ 14,3646 │
│ BYN  │ 1       │ 26,6998 │
│ CAD  │ 1       │ 55,2743 │
│ CHF  │ 1       │ 80,5485 │
│ CNY  │ 1       │ 10,8398 │
│ CZK  │ 10      │ 33,5739 │
│ DKK  │ 1       │ 10,7002 │
│ EGP  │ 10      │ 24,4263 │
│ EUR  │ 1       │ 79,5716 │
│ GBP  │ 1       │ 90,6889 │
│ GEL  │ 1       │ 28,3363 │
│ HKD  │ 10      │ 95,3890 │
│ HUF  │ 100     │ 20,7001 │
│ IDR  │ 10000   │ 49,2185 │
│ INR  │ 100     │ 90,1603 │
│ JPY  │ 100     │ 55,4219 │
│ KGS  │ 100     │ 85,4595 │
│ KRW  │ 1000    │ 57,2524 │
│ KZT  │ 100     │ 16,7640 │
│ MDL  │ 10      │ 39,8181 │
│ NOK  │ 10      │ 72,3823 │
│ NZD  │ 1       │ 46,5734 │
│ PLN  │ 1       │ 16,7565 │
│ QAR  │ 1       │ 20,5244 │
│ RON  │ 1       │ 16,1333 │
│ RSD  │ 100     │ 67,8622 │
│ SEK  │ 10      │ 72,2507 │
│ SGD  │ 1       │ 55,7819 │
│ THB  │ 10      │ 21,5775 │
│ TJS  │ 10      │ 69,2908 │
│ TMT  │ 1       │ 21,3453 │
│ TRY  │ 10      │ 39,6051 │
│ UAH  │ 10      │ 20,2313 │
│ USD  │ 1       │ 74,7087 │
│ UZS  │ 10000   │ 66,0995 │
│ VND  │ 10000   │ 31,6013 │
│ XDR  │ 1       │ 99,6569 │
│ ZAR  │ 10      │ 40,6808 │
└──────┴─────────┴─────────┘


ну или конкретно для указанных валют
$ curl -s "http://www.cbr.ru/scripts/XML_daily.asp" | enconv -x UTF-8 | xq -r '.ValCurs.Valute[] | select(.CharCode == "USD" or .CharCode == "EUR") |.CharCode + " " + .Nominal + " " + .Value' | awk 'BEGIN{print "Code Nominal Value"}{print}' | csview -d' '
┌──────┬─────────┬─────────┐
│ Code │ Nominal │ Value   │
├──────┼─────────┼─────────┤
│ EUR  │ 1       │ 79,5716 │
│ USD  │ 1       │ 74,7087 │
└──────┴─────────┴─────────┘
Ответ написан
erge
@erge
Примус починяю
curl + awk
curl -s https://www.cbr.ru/scripts/XML_daily.asp | awk -F '</Valute>'  '{for (i=1; i<=NF; i++) if($i ~ /USD|EUR/) print substr($i, index($i, "CharCode")+9,3)" "substr($i, index($i, "Value")+6,7)}' 2>/dev/null


wget + awk
wget -qO- https://www.cbr.ru/scripts/XML_daily.asp | awk -F '</Valute>'  '{for (i=1; i<=NF; i++) if($i ~ /USD|EUR/) print substr($i, index($i, "CharCode")+9,3)" "substr($i, index($i, "Value")+6,7)}' 2>/dev/null


Perl
perl -MLWP::Simple -e '$_=get("https://www.cbr.ru/scripts/XML_daily.asp");while(m/(USD|EUR).+?Value>([^<]+)/g){print "$1 $2\n"}'


Python
python3 -c 'import requests,re;print("\n".join([" ".join(i.groups()) for i in list(re.finditer(r"(USD|EUR).+?Value>([^<]+)", requests.get("https://www.cbr.ru/scripts/XML_daily.asp").text))]))'


PowerShell
# вариант 1 (RegEx)
(Invoke-WebRequest -UseBasicParsing -URI 'https://www.cbr.ru/scripts/XML_daily.asp').Content | Select-String '(USD|EUR).+?Value>([^<]+)' -AllMatches | foreach {$_.Matches.Groups[1,2,4,5].Value}
# вариант 2 (XML/XPath)
([xml](Invoke-WebRequest -UseBasicParsing -URI 'https://www.cbr.ru/scripts/XML_daily.asp').Content).SelectNodes('//Valute[CharCode="USD" or CharCode="EUR"]') | ft Name,Value


JavaScript (Node.js)
node -e "https.get('https://www.cbr.ru/scripts/XML_daily.asp',r=>{s='';r.on('data',d=>s+=d);r.on('end',()=>[...s.matchAll(/(USD|EUR).+?Value>([^<]+)/g)].forEach(e=>console.log(`${e[1]} ${e[2]}`)))})"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Поставить в PATH wget\curl и им дергать какую то апиху, коих в интернете полно
Ответ написан
trapwalker
@trapwalker
Программист, энтузиаст
Берёте любое API с курсами и получаете инфу, в чем проблема конкретно у вас?
curl https://www.cbr-xml-daily.ru/daily_json.js | jq ".Valute.EUR.Name,.Valute.EUR.Value"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы