Bash Site about Linux


Вернуться к оглавлению

12.12.2012

Курсы обмена валют Сбербанка в conky



В этой статье я расскажу как вывести курсы обмена валют и драг металов Сбербанка РФ в conky. Возможно этот алгоритм пригодиться и для других приложений.

Разделим действия на три этапа:
  1. Получение данных (в *.xls)
  2. Преобразование
  3. Вывод в conky

1. Получение данных

Для этого заходим на сайт сбербанка.
В правой колонке находим "Курсы иностранных валют" и "Котировки драгоценных металлов". Нажимаем на ссылку "подробнее"



В таблице "Динамика изменения курсов иностранных валют" выбираем график с нужной валютой и нажимаем на кнопку excel в правом верхнем углу графика (в нашем примере выбрана "евро").



Во всплывающем окне нам откроется "ТАБЛИЦА ИЗМЕНЕНИЯ КУРСОВ", где в правом верхнем углу находится кнопочка "Excel" (excel).
Щёлкаем по ней правой кнопкой мыши и во всплывающем меню выбираем пункт "Скопировать адрес ссылки".



http://sbrf.ru/common/js/get_quote_values.php?mode=full\
&_date_afrom114=08.11.2012&_date_ato114=08.12.2012&qid%5B%5D=2\
&version=0&inf_block=145&display=excel&cbrf=0&group=1"es_for=
На этом первый этап закончен. Источник данных получен. Осталось отнести его на операционный стол.

2. Преобразование

По ссылке, которую мы скопировали, мы можем скачать котировки сбербанка EUR/RUR за последний месяц в формате *.xls (это такой вот формат электронных таблиц какойто чуждой нам операционной системы).
В этой жуткой абракадабре выделяем четыре части:
  • _date_afrom114=08.11.2012 - котировки с даты 08.11.2012
  • _date_ato114=08.12.2012 - котировки по дату 08.12.2012
  • qid%5B%5D=2 - id котировки (для EUR "2", для USD "3" и т. д.)
  • inf_block=145 - инф. блок (для EUR и USD "145", для AU "246"...)
Чтобы скачать котировки EUR только за сегодняшний день, подставляем вместо дат переменную TODAY=`date +%d.%m.%Y`.
Кусок кода для скрипта преобразуется к следующему виду:
TODAY=`date +%d.%m.%Y`
P=`dirname "$0"` #путь к дериктории от куда запущен скрипт

wget http://sbrf.ru/common/js/get_quote_values.php?mode=full\
&_date_afrom114=${TODAY}&_date_ato114=${TODAY}&qid%5B%5D=2\
&version=0&inf_block=145&display=excel&cbrf=0&group=1"es_for= \
-q -O ${P}/quotes.xls
Преобразуем (чуждый) quotes.xls во всечитаемый quotes.csv. (Для этого должна быть установлена программа xls2csv)
xls2csv -x quotes.xls -s cp1251 -d utf-8 > quotes.csv
и извлекаем из файла quotes.csv необходимые нам данные.
sed -n '4 s/^.\{23\}//; s/\"//g; s/\,/\n/; 4p' \
${P}/quotes.csv > ${P}/tmp

3. Вывод котировок в conky

По мотивам наших действий пишем скрипт, который создаёт файл quotes.txt с котировками USD, EUR и AU.
#! /bin/bash
TODAY=`date +%d.%m.%Y`
P=`dirname "$0"`
COUNTER=0

# Функция скачивания котировок "DowmQuotes"
# аргументы id=$1(1,2,3) block=$2(145,246)
function DowmQuotes {
wget "http://sbrf.ru/common/js/get_quote_values.php?mode=full\
&_date_afrom114=${TODAY}&_date_ato114=${TODAY}&qid%5B%5D=$1\
&version=0&inf_block=$2&display=excel&cbrf=0&group=1"es_for=" \
-q -O ${P}/quotes.xls 
}  

# Функция обработки файлов котировок "QuotProcessing"
function QuotProcessing {
xls2csv -x ${P}/quotes.xls -s cp1251 -d utf-8 > ${P}/quotes.csv
sed -n '4 s/\"//g; s/^.\{20\}//; s/\,/\n/; 4p' ${P}/quotes.csv > ${P}/tmp
VARQ1=`sed -n '1p' ${P}/tmp`  
VARQ2=`sed -n '2p' ${P}/tmp`
}

# Проверка существования файла quotes.txt
# если его нет, то создаю:
if [ ! -e "${P}/quotes.txt" ]
then
    touch "${P}/quotes.txt"
    echo $'\n\n\n\n\n\n\n' > ${P}/quotes.txt
fi

# Основной цикл (переодичность 2 часа).
while [  $COUNTER -lt 1 ]; do

# --------------- USD id=3 block=145 --------------- #
DowmQuotes 3 145
VAR0=$?

if [ $VAR0 -eq 0 ]  # если при закачке не было ошибки
then
	QuotProcessing
fi
if [ $VAR0 -eq 4 ]  # если нет соединения с интернетом
	then
	sed "\
	1 s/^.*/-----/i; \
	2 s/^.*/-----/i; \
	3 s/^.*/-----/i; \
	4 s/^.*/-----/i; \
	5 s/^.*/-----/i; \
	6 s/^.*/-----/i; \
	" ${P}/quotes.txt > ${P}/tmp
	mv ${P}/tmp ${P}/quotes.txt
	while [ $VAR0 -ne 0 ]; do
		DowmQuotes 3 145
		VAR0=$?
		sleep 30
	done
	QuotProcessing
fi
if [ $VAR0 -eq 8 ] # если сервер ответил, что нет файла
	then
	VARQ1=error
	VARQ2=error
fi
sed "1 s/^.*/$VARQ1/i; 2 s/^.*/$VARQ2/i;" ${P}/quotes.txt > ${P}/tmp
mv ${P}/tmp ${P}/quotes.txt

# --------------- EUR id=2 block=145 --------------- #
DowmQuotes 2 145

VAR0=$?
if [ $VAR0 -eq 0 ]
then
	QuotProcessing
fi
if [ $VAR0 -eq 8 ]
	then
	VARQ1=error
	VARQ2=error
fi
sed "3 s/^.*/$VARQ1/i; 4 s/^.*/$VARQ2/i;" ${P}/quotes.txt > ${P}/tmp
mv ${P}/tmp ${P}/quotes.txt

# --------------- AU id=1 block=246 --------------- #
DowmQuotes 1 246

VAR0=$?
if [ $VAR0 -eq 0 ]
then
	QuotProcessing
fi
if [ $VAR0 -eq 8 ]
	then
	VARQ1=error
	VARQ2=error
fi
sed "5 s/^.*/$VARQ1/i; 6 s/^.*/$VARQ2/i;" ${P}/quotes.txt > ${P}/tmp
mv ${P}/tmp ${P}/quotes.txt

sleep 2h
 
done

Скачать скрипт или посмотреть в соседнем окне. (при просмотре кодировка UTF-8)


Мой код для conky:
${font dejavu sans:size=10}${tab 42}${color3}\
USD${tab 48}${color8}EUR${tab 30}${color4}AU${color}
#
buy\
${tab 20}${texeci 100 sed -n '1p' $HOME/.conky/sbrf/quotes.txt}\
${tab 48}${texeci 100 sed -n '3p' $HOME/.conky/sbrf/quotes.txt}\
${tab 30}${texeci 100 sed -n '5p' $HOME/.conky/sbrf/quotes.txt}
#
sell\
${tab 20}${texeci 100 sed -n '2p' $HOME/.conky/sbrf/quotes.txt}\
${tab 48}${texeci 100 sed -n '4p' $HOME/.conky/sbrf/quotes.txt}\
${tab 30}${texeci 100 sed -n '6p' $HOME/.conky/sbrf/quotes.txt}

Скрипт quotes.txt помещаем в папку ~/.conky/sbrf/, делаем его исполняемым и прописываем в автозагузку. Скрипт проверяет котировки каждые 2 часа.


При отсутствии подключения к интернету (wget возвращает переменной $? значение равное 4), вместо значений котировок будут отображаться прочерки "-----". В этом случае скрипт будет проверять подключение каждые 30 секунд. Это сделано по тому, что у меня скрипт работает нетбуке, и подключение не всегда активно.


Иногда бывает (очень редко), что на сайте сбербанка меняются ссылки на *.xls файлы (wget возвращает переменной $? значение равное 8). В этом случае в колонке, котировки которой не удалось скачать, в обоих строках отображается надпись error. В этом случае нужно получить ссылку снова (см. описание выше) и внести соответствующие изменения в скрипт.


PS

Здесь описан принцип получения котировок и мой скрипт и код для conky. Скорее всего вам понадобиться подправить эти коды под собственные нужды (такие, например, как добавление или удаление котировок, отображение прочерков при неактивном соединении и др...).


Вернуться к оглавлению








Яндекс.Метрика
ВебСтолица.РУ: создай свой бесплатный сайт!  | Пожаловаться  
Движок: Amiro CMS