Выполнение запросов к API. Api курс валют


Курсы валют | API курсов валют

Для того чтобы получить курсs валют по API на сегодняшний день, Вам необходимо осуществить GET запрос по протоколу HTTP на указанные URL

http://currency.vvv.click/api.html?getinfo="ЗНАЧЕНИЕ"&currency="ЗНАЧЕНИЕ"&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&currency=usd&source=0

Ответ

{ "result":true, "exchange":  {   "USD":{"nbu":"23.9492"}  }, "dt":"25.11.2015"}

3.Запрос

http://currency.vvv.click/api.html?getinfo=3&currency=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&currency=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 часть, для этого придерживаемся данного сценария:

  1. Пользователь выбирает нужный день, месяц, год
  2. Нажимает на «ОК«
  3. Выполняется makeRequest
  4. Собираем данные из выпадающих списках
  5. Формируем запрос к XML API от cbr.ru
  6. Выполняем парсинг полученных XML данных
  7. Обновляем текст с курсом валют
  8. ???
  9. 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


Смотрите также

.