Увидеть курс доллара вскоре после того, как ЦБ его объявит — удачная идея, правда? Реализуем ее в Linux простыми средствами.
Краткая предыстория: изначально наработка не моя, решение подсмотрел в скрипте на форуме xStarter — есть такая интересная программа для Windows, автоматизирует рутинные задачи. Умеет много чего полезного, и в Windows я к ней крепко привык. В том числе и к тому, что курс доставляется прямо на десктоп.
Начнем, поделив задачу на части:
- получаем данные от ЦБ;
- находим интересующие нас цифры;
- отображаем их на экране.
С первым пунктом отлично поможет cUrl, которого мы попросим скачать документ с сервера. cUrl может куда больше, но нам хватит и этого.
Нужно учесть еще один нюанс — в запросе на сервере Центробанка следует указать текущую дату. Поэтому перед скачиванием мы ее получим и присоединим к постоянной части имени файла, известной заранее.
Теперь, когда в переменной freshPage хранится полный адрес запроса к серверу, забираем страницу и пишем ее в каталог /temp:
Примечание
если по каким-то причинам у вас на cUrl аллергия, используйте wget (по идее, он идет в штатной поставке ОС):
Однако, «все не так прозаично»© — ХML-документ скачивается в кириллической кодировке Windows (CP1251). Вполне резонно, учитывая наличие .asp в адресе. «Импортозамещение» в сердце финансовой системы, да-да, вы абсолютно правы.
Конкретно для нас это означает, что искать какие-то осмысленные фразы в полученном файле не выйдет, нужно его конвертировать в Unicode. На помощь приходит enconv из пакета enca, я даже не стану указывать ему исходную кодировку текста, он прекрасно определит ее сам:
Этап второй — находим нужные цифры и помещаем их в переменную currentRate:
Не представляю, что скажут о такой конструкции настоящие знатоки, могу сообщить лишь то, что она работает :) Текущий курс у нас есть, теперь нужно все это вывести.
Третий этап. Я изначально собирался показывать сообщение на рабочем столе, а не в консоли, поэтому воспользовался программой zenity — для Cinnamon, использующей библиотеки Gnome, это естественный выбор. Использующим KDE подойдёт kdialog со сходным функционалом. Показываем:

Отлично, но есть ещё кое-что: я не хочу запускать скрипт вручную, тем более — каждый рабочий день. Буду использовать Cron, конечно же. И вот тут меня поджидал сюрприз: скрипт, прекрасно работавший до этого, перестал выводить что-либо на экран, будучи прописан как задание cron. Спасла статья на Хабре.
Подводим итоги:
- вот готовый сценарий, назовем его getrate.sh
#!/bin/bash
freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req='$(date +%d.%m.%Y)
curl $freshPage > /tmp/ratePage
enconv /tmp/ratePage
currentRate=$(grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/ratePage | grep -o '[0-9]*,[0-9]*' | head -1)
zenity --info --title='USD' --text='Курс доллара на сегодня:\n'$currentRate
rm /tmp/ratePage
exit 0
- вот задача для cron — выводить курс доллара в 11:45 (на всякий случай напомню, что задачи в cron дописываются командой crontab -e): 45 11 * * * export DISPLAY=:0 && /home/dk/scripts/getrate.sh
- C минимальными усилиями скрипт модифицируется под ваши нужды — никто не мешает запросить разные валюты (они все есть в файле ratePage) или оформить сообщение о курсе в виде уведомления, поменяв zenity на notify-send (напомню, речь идет о DE, использущем библиотеки Gnome):
Всплывающее уведомление в среде Mate
Примечания
Есть у ЦБ неприятная привычка — менять формат выдачи файла. Может случиться и так, что выражение для поиска курса не работает, я с таким уже сталкивался. В таком случае статья, конечно же, будет обновлена. Но куда больше удовольствия вы получите, исправив регулярное выражение самостоятельно. Ну, мне так кажется :)
Поскольку не все программы, используемые в статье, поставляются в составе дистрибутива:
- enconv входит в состав пакета enca, предназначенного для конвертации кодировок. В любом случае, программа необходимая, почитать о ней можно, например, тут. Устанавливается обычным образом:
sudo apt-get install enca
(Ubuntu) - curl —
sudo apt-get install curl
. Ни за что не поверю, что у вас его нет :)
- enconv входит в состав пакета enca, предназначенного для конвертации кодировок. В любом случае, программа необходимая, почитать о ней можно, например, тут. Устанавливается обычным образом: