Курс доллара по расписанию

Увидеть курс доллара вскоре после того, как ЦБ его объявит — удачная идея, правда? Реализуем ее в Linux простыми средствами.

Краткая предыстория: изначально наработка не моя, решение подсмотрел в скрипте на форуме xStarter — есть такая интересная программа для Windows, автоматизирует рутинные задачи. Умеет много чего полезного, и в Windows я к ней крепко привык. В том числе и к тому, что курс доставляется прямо на десктоп.

Начнем, поделив задачу на части:

  1. получаем данные от ЦБ;
  2. находим интересующие нас цифры;
  3. отображаем их на экране.

С первым пунктом отлично поможет cUrl, которого мы попросим скачать документ с сервера. cUrl может куда больше, но нам хватит и этого.

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

freshPage='http://www.cbr.ru/scripts/xml_daily.asp?date_req='$(date +%d.%m.%Y)

Теперь, когда в переменной freshPage хранится полный адрес запроса к серверу, забираем страницу и пишем ее в каталог /temp:

curl $freshPage > /tmp/ratePage
Примечание

если по каким-то причинам у вас на cUrl аллергия, используйте wget (по идее, он идет в штатной поставке ОС):

wget -O /tmp/ratePage $freshPage

Однако, «все не так прозаично»© — ХML-документ скачивается в кириллической кодировке Windows (CP1251). Вполне резонно, учитывая наличие .asp в адресе. «Импортозамещение» в сердце финансовой системы, да-да, вы абсолютно правы.
Конкретно для нас это означает, что искать какие-то осмысленные фразы в полученном файле не выйдет, нужно его конвертировать в Unicode. На помощь приходит enconv из пакета enca, я даже не стану указывать ему исходную кодировку текста, он прекрасно определит ее сам:

enconv /tmp/ratePage

Этап второй — находим нужные цифры и помещаем их в переменную currentRate:

currentRate=$(grep -o 'Доллар США.*[0-9]*,[0-9]*' /tmp/ratePage | grep -o '[0-9]*,[0-9]*' | head -1)

Не представляю, что скажут о такой конструкции настоящие знатоки, могу сообщить лишь то, что она работает :) Текущий курс у нас есть, теперь нужно все это вывести.

Третий этап. Я изначально собирался показывать сообщение на рабочем столе, а не в консоли, поэтому воспользовался программой zenity — для Cinnamon, использующей библиотеки Gnome, это естественный выбор. Использующим KDE подойдёт kdialog со сходным функционалом. Показываем:

zenity --info --title='USD' --text='Курс доллара на сегодня:\n'$currentRate
Диалоговое окно zenity в среде Mate

Отлично, но есть ещё кое-что: я не хочу запускать скрипт вручную, тем более — каждый рабочий день. Буду использовать Cron, конечно же. И вот тут меня поджидал сюрприз: скрипт, прекрасно работавший до этого, перестал выводить что-либо на экран, будучи прописан как задание cron. Спасла статья на Хабре.

Подводим итоги:

  1. вот готовый сценарий, назовем его 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

  2. вот задача для cron — выводить курс доллара в 11:45 (на всякий случай напомню, что задачи в cron дописываются командой crontab -e):
    45 11 * * * export DISPLAY=:0 && /home/dk/scripts/getrate.sh
  3. C минимальными усилиями скрипт модифицируется под ваши нужды — никто не мешает запросить разные валюты (они все есть в файле ratePage) или оформить сообщение о курсе в виде уведомления, поменяв zenity на notify-send (напомню, речь идет о DE, использущем библиотеки Gnome):
    Всплывающее уведомление в среде Mate
Примечания
  • Есть у ЦБ неприятная привычка — менять формат выдачи файла. Может случиться и так, что выражение для поиска курса не работает, я с таким уже сталкивался. В таком случае статья, конечно же, будет обновлена. Но куда больше удовольствия вы получите, исправив регулярное выражение самостоятельно. Ну, мне так кажется :)

  • Поскольку не все программы, используемые в статье, поставляются в составе дистрибутива:

    • enconv входит в состав пакета enca, предназначенного для конвертации кодировок. В любом случае, программа необходимая, почитать о ней можно, например, тут. Устанавливается обычным образом: sudo apt-get install enca (Ubuntu)
    • curl — sudo apt-get install curl. Ни за что не поверю, что у вас его нет :)