Как получить и использовать API Open Exchange Rates в Python

Что такое Open Exchange Rates и для чего нужен API
Open Exchange Rates — провайдер данных о курсах валют по миру. API позволяет программно получать актуальные курсы (обычно относительно доллара США) и использовать их в ваших приложениях для расчёта, отображения цен, аналитики или автоматических конвертаций.
Краткое определение: API — это интерфейс, по которому программа запрашивает данные у сервиса и получает структурированный ответ (обычно JSON).
Важно: бесплатный уровень может иметь ограничения по частоте запросов и доступным базовым валютам. Всегда проверяйте ограничения в вашем плане.
Требования и подготовка
- Python 3.6+ установлен на машине.
- Установлен модуль requests: pip install requests
- Аккаунт Open Exchange Rates и App ID (API-ключ).
- Базовые навыки редактирования файлов и запуска скриптов в терминале.
Как получить App ID (API-токен)
- Перейдите на сайт Open Exchange Rates и войдите в аккаунт или зарегистрируйтесь.
- Выберите подходящий план (например, Free Plan) и активируйте аккаунт:
- В личном кабинете перейдите в раздел App IDs (левое меню):
- Скопируйте существующий App ID или сгенерируйте новый. Этот ключ понадобится для запросов к API.
Совет по безопасности: не храните ключ в репозитории. См. раздел «Безопасность и хранение ключа» ниже.
Полный пример Python-скрипта: конвертер валют
Ниже — упрощённый, но полный пример конвертера, который:
- получает курсы по App ID;
- выводит список доступных валют;
- конвертирует сумму из одной валюты в другую;
- содержит базовую обработку ошибок и защиту от отсутствующих кодов валют.
import os
import sys
import requests
# Получите App ID и сохраните в переменной окружения OPENEXCHANGE_APP_ID
# Пример для Windows (в терминале PowerShell):
# setx OPENEXCHANGE_APP_ID "ваш_app_id"
# Или перед запуском в Linux/macOS:
# export OPENEXCHANGE_APP_ID="ваш_app_id"
api_key = os.environ.get("OPENEXCHANGE_APP_ID")
if not api_key:
print("Ошибка: переменная окружения OPENEXCHANGE_APP_ID не установлена.")
sys.exit(1)
url = f"https://openexchangerates.org/api/latest.json?app_id={api_key}"
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
print("Ошибка при обращении к API:", e)
sys.exit(1)
except ValueError:
print("Ошибка: неверный формат ответа от сервера")
sys.exit(1)
# Курс валют — словарь типа {'USD': 1.0, 'EUR': 0.92, ...}
exchange_rates = data.get("rates")
if not exchange_rates:
print("Ошибка: в ответе отсутствуют курсы валют")
sys.exit(1)
# Показать доступные валюты
available_currencies = ", ".join(sorted(exchange_rates.keys()))
print("Доступные валюты:", available_currencies)
# Ввод от пользователя
from_currency = input("Введите базовую валюту (код, например USD): ").strip().upper()
if from_currency not in exchange_rates:
print(f"Валюта {from_currency} недоступна в списке курсов")
sys.exit(1)
to_currency = input("Введите целевую валюту (код, например EUR): ").strip().upper()
if to_currency not in exchange_rates:
print(f"Валюта {to_currency} недоступна в списке курсов")
sys.exit(1)
try:
amount = float(input("Введите сумму для конвертации: "))
except ValueError:
print("Ошибка: введите числовое значение суммы")
sys.exit(1)
# Курсы в ответе обычно даны относительно USD (по умолчанию база — USD)
# Чтобы конвертировать из A в B: перевести A в USD, затем USD в B
original_in_usd = amount / exchange_rates[from_currency]
converted_amount = original_in_usd * exchange_rates[to_currency]
print(f"{amount} {from_currency} = {converted_amount:.6f} {to_currency}")Как запускать скрипт
- Сохраните файл как currency_exchange_converter.py.
- Откройте терминал и перейдите в папку с файлом, например:
cd C:\Users\<ваш_пользователь>\Desktop- Установите зависимость (если ещё не установлена):
pip install requests- Убедитесь, что переменная окружения OPENEXCHANGE_APP_ID установлена.
- Запустите:
python currency_exchange_converter.py- Введите коды валют и сумму по подсказкам. В результате вы увидите сконвертированную сумму:
Обработка ошибок, ограничения и когда это не сработает
- Неверный или отозванный App ID: сервер вернёт 401/403 — проверяйте правильность ключа.
- Сеть или таймаут: requests.get может выбросить исключение — обрабатывайте и устанавливайте разумный timeout.
- Отсутствие валюты: некоторые коды могут отсутствовать в ответе — проверяйте наличие ключа в словаре rates.
- Частые запросы: бесплатные тарифы обычно ограничены по частоте (rate limit).
- Задержка обновления: иногда данные обновляются с задержкой; не полагайтесь на абсолютную мгновенную точность для критичных финансовых операций.
Безопасность и хранение ключа
- Никогда не храните App ID в публичных репозиториях.
- Используйте переменные окружения или секретные хранилища (Vault, AWS Secrets Manager, GitHub Secrets).
- Для CI/CD — передавайте ключи как защищённые переменные. Ограничьте доступ по ролям.
Пример использования .env (локально) и python-dotenv:
# pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ.get('OPENEXCHANGE_APP_ID')Альтернативные подходы и сервисы
Если Open Exchange Rates не подходит, рассмотрите:
- Fixer.io — простое API с европейским уклоном.
- exchangerate.host — бесплатный, открытый API без ключа (проверяйте SLA).
- Currencylayer — похож по функционалу, разные условия тарификации.
- Использовать данные от центральных банков (ECB, РФЦБ) для официальных курсов.
Выбор зависит от: частоты запросов, доступности базовых валют, ценовой модели и требований к SLA.
Тесты и критерии успешности
Критерии приёмки:
- Скрипт успешно получает JSON от /latest.json и извлекает rates.
- Скрипт корректно обрабатывает несуществующие коды валют и неверный ввод.
- Скрипт не раскрывает App ID (ключи берутся из переменных окружения).
- Результат конвертации соответствует формуле через USD и показывается с корректной точностью.
Примеры тест-кейсов:
- Ввести валидные коды USD→EUR и сравнить с ручным расчётом.
- Ввести несуществующий код — ожидать сообщение об ошибке и выход.
- Убедиться, что при отсутствии сети скрипт выводит понятную ошибку.
Контроль качества и роли
Разработчик:
- Реализует обработку исключений и валидацию ввода.
- Не хранит ключи в коде.
Тестировщик:
- Проводит ручные и автоматические тесты по сценариям выше.
Оператор/DevOps:
- Настраивает секреты в окружении, мониторит ошибки и лимиты запросов.
Ментальные модели и эвристики
- Модель «через базовую валюту»: большинство провайдеров даёт курсы относительно базовой валюты (обычно USD). Для конверсии A→B сначала переводим A→USD, затем USD→B.
- Эвристика точности: для пользовательского интерфейса 2–4 знака после запятой обычно достаточно; для расчётов в бухгалтерии — используйте больше знаков и фиксированную арифметику (Decimal).
Когда не использовать этот подход
- Если нужна строгая нормативная отчётность — используйте официальные данные центрального банка.
- Если требуется высокая частота обновлений и SLA — платный тариф или специализированный провайдер может быть обязательным.
Быстрые подсказки (cheat sheet)
- Переменная окружения: OPENEXCHANGE_APP_ID
- URL запроса: https://openexchangerates.org/api/latest.json?app_id={APP_ID}
- Проверка ключа: response.raise_for_status()
- Конвертация: amount / rates[from] * rates[to]
Короткое резюме
- Получите App ID в личном кабинете Open Exchange Rates.
- Используйте requests в Python, чтобы получить JSON с курсами.
- Конвертируйте суммы через перевод в базовую валюту (обычно USD).
- Не забывайте про безопасность ключа, обработку ошибок и ограничения тарифного плана.
Важно: при переходе в продакшен подумайте о кешировании курсов, чтобы снизить количество вызовов к API и улучшить устойчивость приложения.
Похожие материалы
Удалённая помощь с Schnitz Remote Lite
Исправить зацикливание входа в Ubuntu
sudo: пароль верный, но не принимается — как исправить
Добавить светлую/тёмную тему в контекстное меню Windows 11
Как связывать страницы в Notion: полное руководство