Выполнение запросов к API. Api курс валют
Курсы валют | API курсов валют
Для того чтобы получить курсs валют по API на сегодняшний день, Вам необходимо осуществить GET запрос по протоколу HTTP на указанные URL
http://currency.vvv.click/api.html?getinfo="ЗНАЧЕНИЕ"¤cy="ЗНАЧЕНИЕ"&source="ЗНАЧЕНИЕ" ПАРАМЕТР - getinfoДОПУСТИМЫЕ ЗНАЧЕНИЯ:3 ПАРАМЕТР - currencyНЕОБЯЗАТЕЛЬНЫЙ ПАРАМЕТРДОПУСТИМЫЕ ЗНАЧЕНИЯ:usd - курс доллара США (USD)eur - курс евро (EUR)rub - курс российского рубля (RUB) ПАРАМЕТР - sourceНЕОБЯЗАТЕЛЬНЫЙ ПАРАМЕТРДОПУСТИМЫЕ ЗНАЧЕНИЯ:0 - курс НБУ1 - курсы покупки и продажи "Приват-банк"В ответ на такой запрос Вы получите ответ такого типа в формате JSON:
{ "result":true, "exchange": { ИНФОРМАЦИЯ О КУРСАХ ВАЛЮТ }, "dt":ДАТА}В ответ на некорректный запрос Вы получите следующий ответ в формате JSON:
{ "result":false, "exchange":false}Примеры запросов:
1.Запрос
http://currency.vvv.click/api.html?getinfo=3&source=0Ответ
{ "result":true, "exchange": { "USD":{"nbu":"23.9492"}, "EUR":{"nbu":"25.5083"}, "RUB":{"nbu":"0.36496"} }, "dt":"25.11.2015"}2.Запрос
http://currency.vvv.click/api.html?getinfo=3¤cy=usd&source=0Ответ
{ "result":true, "exchange": { "USD":{"nbu":"23.9492"} }, "dt":"25.11.2015"}3.Запрос
http://currency.vvv.click/api.html?getinfo=3¤cy=eur&source=1Ответ
{ "result":true, "exchange": { "USD":{"pcb":"24.4","pcs":"25.4"} }, "dt":"25.11.2015"}4.Запрос
http://currency.vvv.click/api.html?getinfo=3¤cy=usdОтвет
{ "result":true, "exchange": { "USD":{"nbu":"23.9492","pcb":"24.4","pcs":"25.4"} }, "dt":"25.11.2015"}5.Запрос
http://currency.vvv.click/api.html?getinfo=3Ответ
{ "result":true, "exchange": { "USD": {"nbu":"23.9492","pcb":"24.4","pcs":"25.4"}, "EUR": {"nbu":"25.5083","pcb":"26","pcs":"27"}, "RUB": {"nbu":"0.36496","pcb":"0.375","pcs":"0.39"} }, "dt":"25.11.2015"}currency.vvv.click
История курса рубля на PyQt5 + XML от ЦБ РФ
В данной статье мы создадим десктопное приложение используя PyQt5 и XML API от ЦБ РФ для получения курса валют. Интерфейс нашей программы будет достаточно простой. У нас будут несколько выпадающих списков для выбора дня, месяца и года. После выбора всех настроек, наше приложение сделает запрос к XML API от cbr.ru (Центральный Банк России) для получения курса доллара и евро на указанную дату.
Данный урок нацелен на улучшение знаний полученных после прочтения:
Скачать исходники: скрипт и изображения (33.4 кб)
Каркас приложения
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import (QWidget, QLabel, QApplication, QComboBox, QPushButton) from PyQt5.QtGui import QPixmap, QFont class CBR_API(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setFixedSize(300, 400) self.setWindowTitle('История курса рубля') self.show() if __name__ == '__main__': app = QApplication(sys.argv) money = CBR_API() sys.exit(app.exec_())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/usr/bin/python3 # -*- coding: utf-8 -*-
import sys from PyQt5.QtWidgets import (QWidget, QLabel, QApplication, QComboBox, QPushButton) from PyQt5.QtGui import QPixmap, QFont
class CBR_API(QWidget):
def __init__(self): super().__init__() self.initUI()
def initUI(self): self.setFixedSize(300, 400) self.setWindowTitle('История курса рубля') self.show()
if __name__ == '__main__': app = QApplication(sys.argv) money = CBR_API() sys.exit(app.exec_()) |
В данном примере у нас обычный каркас для PyQt5 приложения. Мы указали фиксированный размер для нашего окна. Настроили заголовок приложения.
Лого приложения
Мы быстро создали лого для нашего приложения и загрузили её в PyQt5 с помощью QPixmap. Вот так выглядит метод initUI после добавления лого.
def initUI(self): # Загружаем лого нашей программы. logo_label = QLabel(self) logo_label.setPixmap(QPixmap("img/logo.png")) logo_label.move(0, 0) self.setFixedSize(300, 400) self.setWindowTitle('История курса рубля') self.show()
def initUI(self): # Загружаем лого нашей программы. logo_label = QLabel(self) logo_label.setPixmap(QPixmap("img/logo.png")) logo_label.move(0, 0)
self.setFixedSize(300, 400) self.setWindowTitle('История курса рубля') self.show() |
Запускаем наш скрипт.
Выпадающие списки в PyQt5
После загрузки лого, нам понадобятся небольшие настройки для выбора дня, месяца и года. Тем самым, мы сформируем правильный запрос к API cbr.ru. Для создания выпадающих списков вы воспользуемся классом QComboBox из под-модуля PyQt5.QtWidgets.
Мы создадим 3 новых метода метода:
- self.days() — создаем выпадающий список дней (1-30).
- self.month() — создает выпадающий список номеров месяцев (1-12).
- self.year() — создаем выпадающий список годов начиная с 2005.
def days(self): """ Выпадающий список дней. """ # Создаем выпадающий список. self.days_combo = QComboBox(self) # Заголовок списка. day_label = QLabel("День", self) day_label.move(20, 170) for day in range(1, 31): # Наполняем список. self.days_combo.addItem('%d' % day) # Фиксируем список. self.days_combo.move(20, 200) def month(self): """ Выпадающий список месяцев. """ # Создаем выпадающий список. self.month_combo = QComboBox(self) # Заголовок списка. month_label = QLabel("Месяц", self) month_label.move(80, 170) for month_num in range(1, 13): # Наполняем список. self.month_combo.addItem('%d' % month_num) # Фиксируем список. self.month_combo.move(80, 200) def year(self): """ Выпадающий список годов. """ # Создаем выпадающий список. self.year_combo = QComboBox(self) # Заголовок списка. month_label = QLabel("Год", self) month_label.move(140, 170) for year_num in range(2005, 2018): # Наполняем список. self.year_combo.addItem('%d' % year_num) # Фиксируем список. self.year_combo.move(140, 200)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
def days(self): """ Выпадающий список дней. """
# Создаем выпадающий список. self.days_combo = QComboBox(self)
# Заголовок списка. day_label = QLabel("День", self) day_label.move(20, 170)
for day in range(1, 31): # Наполняем список. self.days_combo.addItem('%d' % day)
# Фиксируем список. self.days_combo.move(20, 200)
def month(self): """ Выпадающий список месяцев. """
# Создаем выпадающий список. self.month_combo = QComboBox(self)
# Заголовок списка. month_label = QLabel("Месяц", self) month_label.move(80, 170)
for month_num in range(1, 13): # Наполняем список. self.month_combo.addItem('%d' % month_num)
# Фиксируем список. self.month_combo.move(80, 200)
def year(self): """ Выпадающий список годов. """
# Создаем выпадающий список. self.year_combo = QComboBox(self)
# Заголовок списка. month_label = QLabel("Год", self) month_label.move(140, 170)
for year_num in range(2005, 2018): # Наполняем список. self.year_combo.addItem('%d' % year_num)
# Фиксируем список. self.year_combo.move(140, 200) |
После создания методов внутри класса CBR_API мы должны вызвать методы в initUI. Мы создадим и кнопку «OK» после нажатия на которую выполнится запрос к API банка.
def initUI(self): # Загружаем лого нашей программы. logo_label = QLabel(self) logo_label.setPixmap(QPixmap("img/logo.png")) logo_label.move(0, 0) # Загружаем выпадающие списки для дней, месяцев и годов. self.days() self.month() self.year() # Создаем кнопку "OK". ok_button = QPushButton('ОК', self) ok_button.resize(50, 25) ok_button.move(220, 200) # Каждый клик кнопки вызывает метод "makeRequest" ok_button.clicked.connect(self.makeRequest) self.setFixedSize(300, 400) self.setWindowTitle('История курса рубля') self.show() def makeRequest(self): return True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def initUI(self): # Загружаем лого нашей программы. logo_label = QLabel(self) logo_label.setPixmap(QPixmap("img/logo.png")) logo_label.move(0, 0)
# Загружаем выпадающие списки для дней, месяцев и годов. self.days() self.month() self.year()
# Создаем кнопку "OK". ok_button = QPushButton('ОК', self) ok_button.resize(50, 25) ok_button.move(220, 200)
# Каждый клик кнопки вызывает метод "makeRequest" ok_button.clicked.connect(self.makeRequest)
self.setFixedSize(300, 400) self.setWindowTitle('История курса рубля') self.show()
def makeRequest(self): return True |
Запускаем код и у нас должен появится вот такой результат.
Вывод курса валют
У нас слишком много места под выпадающими списками, нужно их заполнить иконками доллара и евро. Так-же, мы изменим шрифт текста для курса валют. Текст с курсом валют будет обновляться каждый раз как мы нажмем на кнопку «OK». Создаем метод load_result_image который загрузит иконки и выполнит позиционирование текста для каждой валюты.
def load_result_image(self): # Настройки шрифта текста. font = QFont() font.setFamily("Arial") font.setPointSize(18) # Загружаем иконку доллара. dollar_label = QLabel(self) dollar_label.setPixmap(QPixmap("img/dollar.png")) dollar_label.move(60, 260) # Текст с выводом курса доллара. self.dollar_value = QLabel("0 руб.", self) self.dollar_value.setFont(font) self.dollar_value.move(130, 263) # Загружаем иконку евро. euro_label = QLabel(self) euro_label.setPixmap(QPixmap("img/euro.png")) euro_label.move(50, 320) # Текст с выводом курса евро. self.euro_value = QLabel("0 руб.", self) self.euro_value.setFont(font) self.euro_value.move(130, 320)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def load_result_image(self): # Настройки шрифта текста. font = QFont() font.setFamily("Arial") font.setPointSize(18)
# Загружаем иконку доллара. dollar_label = QLabel(self) dollar_label.setPixmap(QPixmap("img/dollar.png")) dollar_label.move(60, 260)
# Текст с выводом курса доллара. self.dollar_value = QLabel("0 руб.", self) self.dollar_value.setFont(font) self.dollar_value.move(130, 263)
# Загружаем иконку евро. euro_label = QLabel(self) euro_label.setPixmap(QPixmap("img/euro.png")) euro_label.move(50, 320)
# Текст с выводом курса евро. self.euro_value = QLabel("0 руб.", self) self.euro_value.setFont(font) self.euro_value.move(130, 320) |
Не забываем добавить вызов данного метода в initUI. После чего запускаем наш код.
Backend приложения
Интерфейс нашего приложения готов. Теперь, нужно доделать и backend часть, для этого придерживаемся данного сценария:
- Пользователь выбирает нужный день, месяц, год
- Нажимает на «ОК«
- Выполняется makeRequest
- Собираем данные из выпадающих списках
- Формируем запрос к XML API от cbr.ru
- Выполняем парсинг полученных XML данных
- Обновляем текст с курсом валют
- ???
- Profit!
Для начала создадим недостающие методы:
- makeRequest — получает данные из выпадающих списков и отправляет их в getResult.
- getResult — выполняет запрос к XML cbr.ru и обрабатывает полученные данные.
def getResult(self, day, month, year): """ Выполняет запрос к API Банка России. :param day: Выбранный день. :param month: Выбранный номер месяца. :param year: Выбранный код :return: dict """ result = { 'usd': 0, 'eur': 0, } if int(day) < 10: day = '0%s' % day if int(month) < 10: month = '0%s' % month try: # Выполняем запрос к API. get_xml = requests.get( 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=%s/%s/%s' % (day, month, year) ) # Парсинг XML используя ElementTree structure = ET.fromstring(get_xml.content) except: return result try: # Поиск курса доллара (USD ID: R01235) dollar = structure.find("./*[@ID='R01235']/Value") result['dollar'] = dollar.text.replace(',', '.') except: result['dollar'] = 'x' try: # Поиск курса евро (EUR ID: R01239) euro = structure.find("./*[@ID='R01239']/Value") result['euro'] = euro.text.replace(',', '.') except: result['euro'] = 'x' return result def makeRequest(self): """ После нажатия на "ОК" выполняется запрос к API с выбранными данными. """ # Получаем текущие значения из выпадающих списках. day_value = self.days_combo.currentText() month_value = self.month_combo.currentText() year_value = self.year_combo.currentText() # Выполняем запрос к API с выбранными данными. result = self.getResult(day_value, month_value, year_value) # Заменяем текст для доллара. self.dollar_value.setText('%s руб.' % result['dollar']) self.dollar_value.adjustSize() # Заменяем текст для евро. self.euro_value.setText('%s руб.' % result['euro']) self.euro_value.adjustSize()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
def getResult(self, day, month, year): """ Выполняет запрос к API Банка России.
:param day: Выбранный день. :param month: Выбранный номер месяца. :param year: Выбранный код :return: dict """
result = { 'usd': 0, 'eur': 0, }
if int(day) < 10: day = '0%s' % day
if int(month) < 10: month = '0%s' % month
try: # Выполняем запрос к API. get_xml = requests.get( 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=%s/%s/%s' % (day, month, year) )
# Парсинг XML используя ElementTree structure = ET.fromstring(get_xml.content) except: return result
try: # Поиск курса доллара (USD ID: R01235) dollar = structure.find("./*[@ID='R01235']/Value") result['dollar'] = dollar.text.replace(',', '.') except: result['dollar'] = 'x'
try: # Поиск курса евро (EUR ID: R01239) euro = structure.find("./*[@ID='R01239']/Value") result['euro'] = euro.text.replace(',', '.') except: result['euro'] = 'x'
return result
def makeRequest(self): """ После нажатия на "ОК" выполняется запрос к API с выбранными данными. """
# Получаем текущие значения из выпадающих списках. day_value = self.days_combo.currentText() month_value = self.month_combo.currentText() year_value = self.year_combo.currentText()
# Выполняем запрос к API с выбранными данными. result = self.getResult(day_value, month_value, year_value)
# Заменяем текст для доллара. self.dollar_value.setText('%s руб.' % result['dollar']) self.dollar_value.adjustSize()
# Заменяем текст для евро. self.euro_value.setText('%s руб.' % result['euro']) self.euro_value.adjustSize() |
Структура XML ответа от cbr.ru
Скрипт выполняет запрос к URL:
http://www.cbr.ru/scripts/XML_daily.asp?date_req=ДД/ММ/ГГГ
http://www.cbr.ru/scripts/XML_daily.asp?date_req=ДД/ММ/ГГГ |
Получаем такой ответ:
<ValCurs Date="22.04.2017" name="Foreign Currency Market"> <Valute> <NumCode>840</NumCode> <CharCode>USD</CharCode> <Nominal>1</Nominal> <Name>Доллар США</Name> <Value>56,2307</Value> </Valute> <Valute> <NumCode>978</NumCode> <CharCode>EUR</CharCode> <Nominal>1</Nominal> <Name>Евро</Name> <Value>60,3187</Value> </Valute> </ValCurs>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<ValCurs Date="22.04.2017" name="Foreign Currency Market"> <Valute> <NumCode>840</NumCode> <CharCode>USD</CharCode> <Nominal>1</Nominal> <Name>Доллар США</Name> <Value>56,2307</Value> </Valute>
<Valute> <NumCode>978</NumCode> <CharCode>EUR</CharCode> <Nominal>1</Nominal> <Name>Евро</Name> <Value>60,3187</Value> </Valute> </ValCurs> |
Мы получим более длинный список, но для экономии места показываем только для евро и доллара. Можете заметить, что каждая валюта имеет свой уникальный идентификационный номер.
- ID Доллара: R01235
- ID Евро: R01239
По данному идентификационному номеру мы и выполнили поиск нужной нам валюты используя библиотеку ElementTree и метод find.
# Выполняем запрос к API. get_xml = requests.get( 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=%s/%s/%s' % (day, month, year) ) # Парсинг XML используя ElementTree structure = ET.fromstring(get_xml.content) # Поиск курса доллара (USD ID: R01235) dollar = structure.find("./*[@ID='R01235']/Value") result['dollar'] = dollar.text.replace(',', '.') # Поиск курса евро (EUR ID: R01239) euro = structure.find("./*[@ID='R01239']/Value") result['euro'] = euro.text.replace(',', '.')
# Выполняем запрос к API. get_xml = requests.get( 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=%s/%s/%s' % (day, month, year) )
# Парсинг XML используя ElementTree structure = ET.fromstring(get_xml.content)
# Поиск курса доллара (USD ID: R01235) dollar = structure.find("./*[@ID='R01235']/Value") result['dollar'] = dollar.text.replace(',', '.')
# Поиск курса евро (EUR ID: R01239) euro = structure.find("./*[@ID='R01239']/Value") result['euro'] = euro.text.replace(',', '.') |
После получения курса мы заменяем текст для каждой валюты.
# Заменяем текст для доллара. self.dollar_value.setText('%s руб.' % result['dollar']) self.dollar_value.adjustSize() # Заменяем текст для евро. self.euro_value.setText('%s руб.' % result['euro']) self.euro_value.adjustSize()
# Заменяем текст для доллара. self.dollar_value.setText('%s руб.' % result['dollar']) self.dollar_value.adjustSize()
# Заменяем текст для евро. self.euro_value.setText('%s руб.' % result['euro']) self.euro_value.adjustSize() |
Давайте узнаем какой сейчас курс рубля!
Благодарю за внимание!Если есть вопросы — прошу в комментариях.
python-scripts.com
Технические ресурсы | Банк России
В этом разделе сайта Вы найдете описание интерфейса для работы с веб-сервисами и примеры их использования. Данная информация предназначена для IT-специалистов, выполняющих задачи по интеграции информационных систем.
Web Services - это технология построения распределенных систем. Она основана на открытых стандартах - XML, SOAP, WSDL и HTTP. Данная технология позволяет легко интегрировать приложения, используя глобальную сеть Интернет, независимо от платформы и языка разработки. При использовании Web-сервисов Вы получаете непосредственно данные, и эти данные могут быть легко использованы в Ваших приложениях.
Информация, полученная с помощью данной системы, является справочно - информационной и опирается на базу данных сайта Банка России; в связи с этим актуальность информации в рамках этой системы зависит исключительно от ее наличия в Базе данных сайта.
Пожалуйста, ознакомьтесь с правилами использования веб-сервисов:- Использование данной системы является бесплатным и общедоступным в полном объеме сервисом.
- Банк России не несет ответственности за использование Вами данных, полученных при использовании данной системы, а так же не гарантирует наличие, актуальность, и достоверность передаваемой в рамках данной системы информации.
- Банк России оставляет за собой право прекратить оказание данной услуги любому из ее пользователей без указания причин.
- Банк России не оказывает консультационной и технической поддержки по данной системе в устном, письменном или ином виде.
- минимизируйте количество вызовов;
- минимизируйте количество передаваемой информации;
- оптимизируйте логику работы с нашими веб-сервисами;
- при использовании полученных данных в своих приложениях и особенно для публикации их на своих интернет или интранет серверах используйте промежуточное хранение информации!
Помните! Вы пользуетесь нашей информацией наравне с остальными пользователями, и завышенное количество вызовов системы сказывается на работе остальных пользователей.
www.cbr.ru