Как сделать конвертер валют в python

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

Существует несколько видов систем для автоматической помощи пользователям. Одни боты просто общаются с клиентами, другие – регулярно поставляют информацию. Четко разделить программы на типы нельзя – разработчики нередко сочетают несколько функций в одном боте.

Написать несложный бот для Телеграма с интерактивными элементами в виде экранных кнопок можно за 9 шагов. Рассмотрим каждый из них в подробностях и ответим на несколько вопросов:

  • как запустить бот;
  • как прописать встроенную клавиатуру из одной или нескольких кнопок;
  • как запрограммировать кнопки на нужные функции;
  • что такое встроенный режим и как настроить его для уже существующего бота.

Шаг 0: теоретическая база об API Telegram-ботов

Основной инструмент, который используют при создании Телеграм-ботов – это интерфейс прикладного программирования HTML, или API HTML. Этот элемент принимает запросы посетителей и отправляет ответы в виде информации. Готовые конструкции упрощают работу над программой. Чтобы написать бот для Телеграма, необходимо воспользоваться этим электронным адресом: https://api.telegram.org/bot/METHOD_NAME

Сделал Python программу для отслеживания курса валют

Для правильного функционирования бота также нужен токен – комбинация символов, защищающая программу и открывающая доступ к ней доверенным разработчикам. Каждый токен уникален. Строка присваивается боту при создании. Методы могут быть разными: getUpdates, getChat и прочие. Выбор метода зависит от того, какого алгоритма работы разработчики ожидают от бота. Пример токена:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

В ботах используются запросы GET и POST. Параметры методов нередко приходится дополнять – к примеру, когда по задумке метод sendMessage должен отправить id чата и какой-либо текст. Параметры для доработки метода можно передать строкой запроса URL с помощью application/x-www-form-urlencoded или через application-json. Эти способы не подходят для загрузки файлов.

Также обязательна кодировка UTF-8. Отправив запрос к API, можно получить результат в JSON-формате. Взгляните на ответ программы на извлечение информации через метод getME:

GET https://api.telegram.org/bot/getMe < ok: true, result: < id: 231757398, first_name: «Exchange Rate Bot», username: «exchangetestbot» >>

Результат будет получен, если ok равняется true. В ином случае система укажет на ошибку.

Существует два способа получить пользовательские сообщения в ботах. Обе методики действенны, но подходят в разных случаях. Чтобы получить сообщения, можно вручную написать запрос с методом getUpdates – программа выдаст на экран массив данных Update. Запросы нужно отправлять регулярно, после анализа каждого массива отправка повторяется. Избежать повторного появления проверенных объектов поможет offset – параметр, определяющий количество пропущенных записей перед загрузкой нового результата. Преимущества метода getUpdates проявятся, если:

Конвертер валют с интерфейсом на python (питон)

  • нет возможности настроить HTTPS;
  • используются сложные языки сценариев;
  • сервер бота время от времени меняется;
  • бот нагружен пользователями.

Второй метод, который можно прописать для получения пользовательских сообщений – setWebhook. Он используется один раз, не нужно постоянно отправлять новые запросы. Webhook пересылает обновления данных на указанный адрес URL. Для применения этого способа потребуется SSL-сертификат. Webhook будет полезен в этих случаях:

  • используются веб-языки программирования;
  • бот не перегружен, пользователей не слишком много;
  • сервер не меняется, программа остается на одном сервере на долгое время.

В дальнейших инструкциях применим getUpdates.

Шаг 1: реализация запросов курсов валют

Для начала необходимо написать код, выполняющий запросы. Воспользуемся при написании API ПриватБанка, ниже расположена ссылка на него: https://api.privatbank.ua/p24api/pubinfo?jsoncoursid=5. В коде нужно использовать эти методы:

  • load_exchange – находит курсы валют и выводит закодированную информацию;
  • get_exchange – выводит данные об определенной валюте;
  • get_exchanges – показывает перечисление валют согласно образцу.

В результате код в файле pb.py выглядит так:

import re import requests import json URL = ‘https://api.privatbank.ua/p24api/pubinfo?jsoncoursid=5’ def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key): for exc in load_exchange(): if ccy_key == exc[‘ccy’]: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + ‘.*’ for exc in load_exchange(): if re.match(ccy_pattern, exc[‘ccy’], re.IGNORECASE) is not None: result.append(exc) return result

Программа может выдать такой ответ на указанные запросы:

  • /setdescription – описание;
  • /setabouttext – информация о новом боте;
  • /setuserpic – фотография профиля;
  • /setinline – встроенный режим;
  • /setcommands – описание команд.

На последнем шаге настройки описываем /help и /exchange. Когда все этапы пройдены, пора перейти к составлению кода.

Шаг 3: настройка и запуск бота

Создадим файл config.py. В нем нужно указать уникальный код бота и часовую зону, в которой программа найдет информацию.

TOKEN = » # заменить на токен своего ботаTIMEZONE = ‘Europe/Kiev’ TIMEZONE_COMMON_NAME = ‘Kiev’

Далее создаем еще один файл с импортом ранее написанного pb.py, библиотек и других необходимых компонентов. Недостающие библиотеки устанавливаются из системы управления пакетами (pip).

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

Воспользуемся содержимым pyTelegramBotApi, чтобы создать бот. Отправляем полученный токен с помощью такого кода:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

Параметр none_stop обеспечивает постоянную отправку запросов. На действие параметра не повлияют ошибки метода.

Шаг 4: написание обработчика команды /start

Если все предыдущие шаги выполнены правильно, бот начал работать. Программа регулярно создает запросы, потому что в ней использован метод getUpdates. Перед строкой с элементом none_stop нужна часть кода, обрабатывающая команду /start:

При commands=[‘start’] равном True вызывается start_command. Содержимое сообщения переходит туда. Далее нужно реализовать функцию send_message по отношению к конкретному сообщению.

Шаг 5: создание обработчика команды /help

Команду /help можно реализовать в виде кнопки. Нажав на нее, пользователь попадет в аккаунт разработчика в Telegram. Присвоим кнопке имя – например «Ask the developer». Установим параметр reply_markup, перенаправляющий пользователя по ссылке, для метода send_message. Пропишем в коде параметр, создающий клавиатуру (InlineKeyboardMarkup).

Понадобится только одна кнопка (InlineKeyboardButton).

Финальный код обработчика команды выглядит так:

Действие кода в чате Telegram:

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Шаг 6: добавление обработчика команды /exchange

Этот шаг нужен, чтобы в чате отображались кнопки с обозначениями доступных валют. Экранная клавиатура с вариантами поможет избежать ошибок. ПриватБанк предоставляет информацию о рубле, долларе и евро. Параметр InlineKeyboardButton работает следующим образом:

  1. Пользователь кликает по кнопке с нужным обозначением.
  2. В getUpdates поступает обратный вызов (CallbackQuery).
  3. Становится известно, как обработать нажатие на клавиатуру – передается информация о нажатой кнопке.

Код обработчика /exchange:

Результат работы кода в Телеграме:

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Шаг 7: написание обработчика для кнопок встроенной клавиатуры

Пропишем также метод get_ex_callback:

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

Существует и другой полезный метод – answer_callback_query. Он помогает убрать загрузку между нажатием кнопки и выводом результата на экран. В send_exchange_query можно отправить сообщение, передав код какой-либо валюты и Message. Запишем send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, ‘typing’) ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard(ex), parse_mode=’HTML’ )

Пока чат-бот получает результат запроса из банковского API, посетитель видит надпись «набирает сообщение». Это выглядит так, будто отвечает реальный человек.

Чтобы вывести такой индикатор на экран, потребуется добавить строки о состоянии ввода. Далее воспользуемся get_exchange – с его помощью программа получит обозначение валюты (рублей, евро или долларов). В send_message используются добавочные методы: serialize_ex переводит валюту в другой формат, а get_update_keyboard устанавливает экранные клавиши, обновляющие информацию и пересылающие данные о валютном рынке в другие чаты.

Напишем код для get_update_keyboard. Нужно упомянуть две кнопки – t и e обозначают тип и обмен. Пункт switch_inline_query для кнопки Share нужен, чтобы пользователю открывался выбор из нескольких чатов. Посетитель сможет выбрать, кому отправить актуальный курс доллара, рубля или евро.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( ‘Update’, callback_data=json.dumps( < ‘t’: ‘u’, ‘e’: < ‘b’: ex[‘buy’], ‘s’: ex[‘sale’], ‘c’: ex[‘ccy’] >>).replace(‘ ‘, ») ), telebot.types.InlineKeyboardButton(‘Share’, switch_inline_query=ex[‘ccy’]) ) return keyboard

Иногда необходимо увидеть, насколько изменился курс валют за короткое время. Напишем два метода для кнопки Update, чтобы пользователи могли увидеть курсы в сравнении.

Разница между курсами валют передается в сериализатор через параметр diff.

Прописанные методы срабатывают только после обновления данных, они не повлияют на первое отображение курса.

def serialize_ex(ex_json, diff=None): result = » + ex_json[‘base_ccy’] + ‘ -> ‘ + ex_json[‘ccy’] + ‘:nn’ + ‘Buy: ‘ + ex_json[‘buy’] if diff: result += ‘ ‘ + serialize_exchange_diff(diff[‘buy_diff’]) + ‘n’ + ‘Sell: ‘ + ex_json[‘sale’] + ‘ ‘ + serialize_exchange_diff(diff[‘sale_diff’]) + ‘n’ else: result += ‘nSell: ‘ + ex_json[‘sale’] + ‘n’ return result def serialize_exchange_diff(diff): result = » if diff > 0: result = ‘(‘ + str(diff) + ‘ » src=»https://s.w.org/images/core/emoji/2.3/svg/2197.svg»>» src=»https://s.w.org/images/core/emoji/2.3/svg/2197.svg»>» src=»https://s.w.org/images/core/emoji/72×72/2197.png»>» src=»https://s.w.org/images/core/emoji/72×72/2197.png»>)’ elif diff < 0: result = ‘(‘ + str(diff)[1:] + ‘ » src=»https://s.w.org/images/core/emoji/2.3/svg/2198.svg»>» src=»https://s.w.org/images/core/emoji/2.3/svg/2198.svg»>» src=»https://s.w.org/images/core/emoji/72×72/2198.png»>» src=»https://s.w.org/images/core/emoji/72×72/2198.png»>)’ return result

Представим, что посетитель захотел узнать курс доллара. Вот что произойдет, если выбрать в сообщении USD:

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Шаг 8: реализация обработчика кнопки обновления

Напишем код для обработки действий с кнопкой Update и дополним его часть iq_callback_method. Когда пункты программы начинаются с параметра get‒, необходимо прописать get_ex_callback. В других ситуациях разбираем JSON и пытаемся получить ключ t.

Если t равняется u, потребуется создать программу для метода edit_message_callback. Разберем эту процедуру по шагам:

  1. Загрузка актуальной информации о состоянии валютного рынка (exchange_now = pb.get_exchange(data[‘c’]).
  1. Написание нового сообщения через сериализатор с diff.
  2. Добавление подписи (get_edited_signature).

Если начальное сообщение не меняется, вызовем метод edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)[‘e’] exchange_now = pb.get_exchange(data[‘c’]) text = serialize_ex( exchange_now, get_exchange_diff( get_ex_from_iq_data(data), exchange_now ) ) + ‘n’ + get_edited_signature() if query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode=’HTML’ ) elif query.inline_message_id: bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode=’HTML’ )

Пропишем метод get_ex_from_iq_data, чтобы разобрать JSON:

def get_ex_from_iq_data(exc_json): return

Понадобится еще несколько методов: например, get_exchange_diff, который считывает старую и новую информацию о стоимости валют и выводит разницу.

def get_exchange_diff(last, now): return

Последний – get_edited_signature – показывает время последнего обновления курса.

def get_edited_signature(): return ‘Updated ‘ + str(datetime.datetime.now(P_TIMEZONE).strftime(‘%H:%M:%S’)) + ‘ (‘ + TIMEZONE_COMMON_NAME + ‘)’

В результате обновленное сообщение от бота при стабильном курсе выглядит так:

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Когда курс меняется, различия между значениями отображаются в сообщении благодаря прописанным параметрам.

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Шаг 9: реализация встроенного режима

InlineQuery передается в query_text через библиотеку. В коде применяется функция answer_line – она извлекает результаты поиска в виде массива данных и элемент inline_query_id. Используем get_exchanges, чтобы бот находил несколько валют по запросу.

Передаем массив данных в get_iq_articles, чтобы через этот метод вернуть объекты из InlineQueryResultArticle.

def get_iq_articles(exchanges): result = [] for exc in exchanges: result.append( telebot.types.InlineQueryResultArticle( title=exc[‘ccy’], input_message_content=telebot.types.InputTextMessageContent( serialize_ex(exc), parse_mode=’HTML’ ), reply_markup=get_update_keyboard(exc), description=’Convert ‘ + exc[‘base_ccy’] + ‘ -> ‘ + exc[‘ccy’], thumb_height=1 ) ) return result

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Пользователи могут отфильтровать результаты, если введут обозначение нужной валюты.

После клика по нужной валюте из списка в чат приходит такое же сообщение, какие получают пользователи бота. Кнопкой Update тоже можно пользоваться. На изображении ниже изображено обновленное сообщение, которое отправили через бот:

Телеграм-бот на Python. Полный гид по написанию с нуля бота с курсом валют

Заключение

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

Источник: office-guru.ru

Python — конвертер метрических и не метрических величин

Почти два месяца не кодил, ибо не было времени. Соответственно — многое забыто, что-то на грани забывания Что бы окончательно не потерять то, что было изучено — набросал быстренько калькулятор, конвертирующий из метрической меры в неметрическую и наоборот.

Все очень просто — if, elif, print

var = int(input(‘1: Ru — Engn2: Eng — Run’))
if var == 1:
print(‘Конвертация из метрической в неметрическую’)

convertation = int(input(‘Что считаем: n 1. Температураn 2. Весn 3. Длинаn 4. Объемn 5. Скоростьn ‘))
# Считаем температуру
if convertation == 1:

temperature = int(input(‘ 1. Цельсий -> Фаренгейтn 2. Цельсий -> Кельвинn’))
if temperature == 1:
value_temperature = float(input(‘Сколько градусов по Цельсию? :n’))

print(value_temperature, ‘градусов по Цельсию составляют’, round((((9/5) * value_temperature +32)), 2),
‘градусов по Фаренгейту’)
elif temperature == 2:

value_temperature = float(input(‘Сколько градусов по Цельсию? :n’))
print(value_temperature, ‘градусов по Цельсию составляют’, round((value_temperature + 273.15), 2),
‘градусов по Кельвину’)
# Считаем вес

elif convertation == 2:
massa = int(input(‘ 1. Килограммы -> фунтыn 2. Граммы -> унции n’))
if massa == 1:
value_massa = float(input(‘Сколько килограмм? :n’))

print(value_massa, ‘килограмм составляют’, round((value_massa * 2.20462), 2), ‘фунтов’)
elif massa == 2:
value_massa = float(input(‘Сколько грамм? :n’))

print(value_massa, ‘грамм составляют’, round((value_massa * 0.035274), 2), ‘унций’)
# Считаем длину
elif convertation == 3:

dlina = int(input(‘ 1. Километры -> милиn 2. Метры -> Ярдыn 3. Метры -> футыn 4. Сантиметры -> дюймы
n 5. Миллиметры -> дюймы n’))
if dlina == 1:

value_dlina = float(input(‘Сколько километров? :n’))
print(value_dlina, ‘километров составляют’, round((value_dlina * 1.60934), 2),’миль’)
elif dlina == 2:

value_dlina = float(input(‘Сколько метров? :n’))
print(value_dlina,’метров составляют’, round((value_dlina * 1.09361), 2), ‘ярдов’)
elif dlina == 3:

value_dlina = float(input(‘Сколько метров? :n’))
print(value_dlina,’метров составляют’, round((value_dlina / 0.3048), 2), ‘футов’)
elif dlina == 4:

value_dlina = float(input(‘Сколько сантиметров? :n’))
print(value_dlina,’сантиметров составляют’, round((value_dlina * 2.5400013716), 2), ‘дюймов’)
elif dlina == 5:

value_dlina = float(input(‘Сколько милиметров? :n’))
print(value_dlina,’миллиметров составляет’, round((value_dlina / 0.0393701), 2) ,’дюймов’)
# Считаем объем
elif convertation == 4:

space = int(input(‘ 1. Литры -> галлоныn 2. Литры -> пинтыn’))
if space == 1:
value_space = float(input(‘Сколько литров? : ‘))

print(value_space,’литров составляет’, round((value_space / 3.785411784), 2), ‘галлонов’)
elif space == 2:
value_space = float(input(‘Сколько литров? :n’))

print(value_space, ‘литров составляет’, round((value_space / 0.56826125), 2), ‘пинт’)
elif convertation == 5:
speed = float(input(‘ Сколько километров в час? : ‘))

print(speed, ‘километров в час составляет ‘, round((speed / 1.60934), 2), ‘миль в час’)
elif var == 2:
print(‘Конвертация из неметрической в метрическую’)

convertation = int(input(‘Что считаем: n 1. Температураn 2. Весn 3. Длинаn 4. Объемn 5. Скоростьn ‘))
# Считаем температуру
if convertation == 1:

temperature = int(input(‘ 1. Фаренгейт -> Цельсийn 2. Кельвин -> Цельсийn’))
if convertation == 1:
value_temperature = float(input(‘Сколько градусов по Фаренгейту? :n’))

print(value_temperature, ‘градусов по Фаренгейту = ‘, round(((5/9) * value_temperature — 32), 2), ‘ по Цельсию’)
elif convertation == 2:

value_temperature = float(input(‘Сколько градусов по Кельвину? :n’))
print(value_temperature, ‘градусов по Кельвину = ‘, value_temperature — 273.15, ‘ по Цельсию’)
# Считаем вес
if convertation == 2:

massa = int(input(‘ 1. Фунты — килограммыn 2. Унции — граммыn’))
if massa == 1:
value_massa = float(input(‘Сколько фунтов? :n’))

print(value_massa, ‘фунтов составляет’, round((value_massa * 0.453592), 2),’килограмм’)
elif massa == 2:
value_massa = float(input(‘Сколько унций? :n’))

print(value_massa, ‘унций составляет’, round((value_massa * 28.3), 2),’граммов’)
# Считаем длину
if convertation == 3:

dlina = int(input(‘ 1. Мили -> километрыn 2. Ярды -> метрыn 3. Футы -> метрыn 4. Дюймы -> сантиметрыn’))
if dlina == 1:
value_dlina = float(input(‘Сколько миль? :n’))

print(value_dlina, ‘миль =’, round((value_dlina / 0.621371), 2), ‘километров’)
elif dlina == 2:
value_dlina = float(input(‘Сколько ярдов? :n’))

print(value_dlina, ‘ярдов =’, round((value_dlina / 0.9144), 2), ‘метров’)
elif dlina == 3:
value_dlina = float(input(‘Сколько футов? :n’))

print(value_dlina, ‘футов =’, round((value_dlina / 3.28084), 2), ‘метров’)
elif dlina == 4:
value_dlina = float(input(‘Сколько дюймов? :n’))

print(value_dlina, ‘дюймов =’, round((value_dlina / 0.393701), 2), ‘сантиметров’)
# Считаем объем
if convertation == 4:

space = int(input(‘ 1. Галлоны -> литрыn 2. Пинты -> литрыn’))
if space == 1:
value_space = float(input(‘Сколько галлонов? : n’))

print(value_space,’галлонов =’, round((value_space * 3.785411784), 2), ‘литров’)
if space == 2:
value_space = float(input(‘Сколько пинт? : n’))

print(value_space, ‘пинт =’, round((value_space * 0.473176473), 2), ‘литров’)
# Считаем скорость
if convertation == 5:
speed = float(input(‘Сколько миль в час? :n’))
print(speed,’миль в час =’, round((speed * 1.60934), 2),’километров’)

Источник: lavrynenko.com

Python. Получение данных о курсе валют. Курс валют python

Про Python — Статьи — pycbrf — узнаём курсы валют при помощи Python

June 27, 2016, 8:43 p.m. (ред. June 27, 2016, 8:46 p.m.)

В заметке речь пойдёт о новом пакете, позволяющем получать информацию о курсах валют, установленных Центробанком России.

Сегодня публикую приложение, которое вам пригодится, если требуется узнать курсы валют на определённую дату.

При помощи pycbrf можно получать курсы, как из командной строки, так из вашего приложения на Python.

Узнаём курс доллара США, а затем всех валют из командной строки:

$ pycbrf rates -c USD$ pycbrf ratesЕсть возможность получения данных за определённый день. Укажите ключ -h, чтобы получить краткую справку по использованию данного консольного приложения.

А теперь пример того, как обращаться к пакету из вашего кода:

from pycbrf.toolbox import ExchangeRates

# Запрашиваем данные на 26-е июня.rates = ExchangeRates(‘2016-06-26’)

rates.date_requested # 2016-06-26 00:00:00rates.date_received # 2016-06-25 00:00:00# 26-е был выходной, а курс на выходные установлен 25-гоrates.dates_match # False

# Список всех курсов валют на день доступ в rates.rates.

# Поддерживаются разные идентификаторы валют:rates[‘USD’].name # Доллар СШАrates[‘R01235’].name # Доллар СШАrates[‘840’].name # Доллар США

# Вот, что внутри объекта ExchangeRate:rates[‘USD’]»’ExchangeRate(id=’R01235′,name=’Доллар США’,code=’USD’,num=’840′,value=Decimal(‘65.5287’),par=Decimal(‘1’),rate=Decimal(‘65.5287′))»’

Под капотом приложение производит запрос к одному из сервисов сайта Центробанка. Возможно в будущем оно будет обучено получению и другой информации.

Вы можете принять участие в разработке pycbrf, код проекта доступен на GitHub — https://github.com/idlesign/pycbrf

Python-скрипт для получения курсов валют

  1. Получить из базы список актуальных валют,
  2. Получить и распарсить XML с курсами валют от cbr.ru,
  3. Найти среди списка курсов курсы нужных валют и сохранить в базу,
  4. Отправить сообщение на электронную почту с результатами работы скрипта.
  1. Linux — ну это понятно, я использовал Ubuntu 12, но скорее всего подойдет любой современный дистрибутив,
  2. Python 2.6 и выше
  3. База данных, у меня используется MSSQL 2000
  4. Библиотека pymssql для создания запросов к БД

Затем, получение и парсинг списка курсов валют:

u = urllib2.urlopen(«http://www.cbr.ru/scripts/XML_daily.asp», timeout=10) parser = xml.sax.make_parser() handler = CurrencyRateHandler() parser.setContentHandler(handler) parser.parse(u) print handler.mapping Для загрузки файла используется метод urlopen из библиотеки urllib2. Он возвращает поток, который можно сохранить в файл, а можно напрямую передать парсеру, как в данном случае. Для разбора полученного XML используется стандартный SAX-парсер.

Чтобы парсер мог что-то сделать с полученным файлом ему необходим обработчик. Код обработчика представлен в классе CurrencyRateHandler, который наследуется от библиотечного класса xml.sax.handler.ContentHandler.

Код обработчика: class CurrencyRateHandler(xml.sax.handler.ContentHandler): def __init__(self): self.inTag = «» self.charCode = «» self.mapping = <> def startElement(self, name, attributes): if name in set([«CharCode»,»Nominal», «Value»]): self.buffer = «» self.inTag = name else: self.inTag = «» def characters(self, data): if self.inTag: self.buffer += data def endElement(self,name): if name == «CharCode»: self.charCode = self.buffer self.mapping[self.charCode] = <> elif name == «Nominal»: self.mapping[self.charCode][self.inTag] = int(self.buffer) elif name == «Value»: self.mapping[self.charCode][self.inTag] = float(self.buffer.replace(‘,’,’.’)) self.inTag = «» SAX-обработчик получает события startElement и endElement при обработке открывающего и закрывающего тегов XML соответственно. Содержимое тега поступает в метод characters.

Обработчик устроен достаточно просто он проверяет на соответствие имени тега с определенными шаблонами и аггрегирует данные в словарь mapping. В результате разбора получается словарь ключами, которого являются коды валют, а значениями словари, каждый из которых содержит информацию о курсе валюты и номинале обмена (1, 10 или 100 единиц).

Затем нам нужно из полученного от парсера словаря отфильтровать только те валюты, которые нас интересуют и записать значения их курсов в базу. Фильтрация словаря выполняется с помощью функции filter: update_rates(filter(lambda c: rates.has_key(c[‘Name’]), currencies), rates) Функция update_rates выполняет запись в базу следующим образом: def update_rates(currencies, rates): conn = get_connection() try: cur = conn.cursor() cur.executemany(‘INSERT INTO Currency_Exchange_Rate(Date,ListID, FromCurrency, Factor,Amount) VALUES(dbo.GetDay(GETDATE()),1,%d,%d,%s)’, map(lambda c: (c[‘ID’], rates[c[‘Name’]][‘Nominal’], rates[c[‘Name’]][‘Value’]), currencies)) conn.commit() finally: conn.close() самое интересное в этой функции находится в строке 6, там для формирования списка значений для команды INSERT используется функция map и лямбда-функция, возвращающая кортеж значений для вставки в базу из словаря курсов валют. Вот в общем-то и все, остаются всякие полезные мелочи вроде логгирования и отправки сообщения по электронной почте. Полученный скрипт можно поместить в /etc/cron.daily, чтобы он выполнялся ежедневно по расписанию. Для этого в заголовке нужно указать оболочке какой интерпретатор следует использовать (python конечно же): #!/usr/bin/env python import sys import pymssql import urllib2 import xml.sax.handler и дать файлу разрешение на выполнение: sudo chmod 744 updater.py

Извлекаем данные о ежедневных курсах валют с сайта ЦБ РФ

В этой статье хочу рассмотреть пример скрипта на языке программирования Python3, который извлекает данные о текущем курсе валют с официального сайта Центрального Банка РФ и сохраняет их в отдельном файле, который в дальнейшем можно открыть с помощью LibreOffice Calc и применить к ним всю его мощь.

Пример больше интересен тем, что в нём используется парсинг XML-файла.

Сам скрипт находится здесь. Условно, скрипт решает три задачи:

  1. Скачивает XML-файл с курсами валют с сайта ЦБ РФ;
  2. Анализирует (парсит) XML-файл и извлекает оттуда информацию о курсах валют в нужной нам форме;
  3. Сохраняет полученную информацию в текстовом файле в виде значений, разделённых запятыми (CSV).

1-й этап

Сайт Центрального Банка РФ позволяет получать данные в виде XML-файлов. Подобнее об этом здесь.

В нашем примере мы получаем данные о ежедневных курсах валют, которые находятся по адресу http://www.cbr.ru/scripts/XML_daily.asp.

Для скачивания XML-файла с сайта ЦБ РФ используется модуль urllib.request:

import urllib.request url = «http://www.cbr.ru/scripts/XML_daily.asp»

Открываем URL и считываем его:

webFile = urllib.request.urlopen(url) data = webFile.read()

Далее нам надо сохранить данные в файл на жестком диске. По задумке файл должен иметь такое же название, как и конец URL-адреса, но с расширением .xml. Для этого сначала по слэшам разбивается весь URL-адрес и извлекается его концовка.

Затем концовка отсеченной части URL-адреса (XML_daily.asp) заменяется на xml:

ExtSplit = UrlSplit.split(«.»)[1] FileName = UrlSplit.replace(ExtSplit, «xml»)

Теперь открывается(или создается) на жестком диске файл, в который записываются информация, полученная с интернет страницы:

with open(FileName, «wb») as localFile: localFile.write(data)

И в конце выполняется закрытие веб-станицы:

На этом первый этап завершен.

2-й и 3-й этапы

Парсинг XML-файла осуществляется с помощью стандартного модуля xml:

from xml.dom import minidom

Открываем для парсинга скачанный файл:

Извлекаем дату из корневого элемента, которая прописана в качестве его первого атрибута:

XML-код этого элемента выглядит так:

Теперь создаем строку с датой, которая позже будет записана в выходной файл в качестве заголовка:

date = «Текущий курс валют на г. n».format(date= root.getAttribute(‘Date’))

Создадим еще одну строку, которая также будет записана в выходной файл и будет служить строкой таблицы с названиями столбцов (каждый столбец отделен от другого точкой с запятой ;):

head = «Идентификатор; Номинал; Название валюты; Сокращение; Курс (руб) n»

Следующий кусок кода объединяет в себе два этапа. Сначала получаем все данные по валютам:

Затем открываем файл, в который будут записываться данные. Открывается он также с помощью менеджера контекста With . as:

with open(«exchange.txt»,»w») as out:

Записываем раннее подготовленные строки с датой и заголовками столбцов:

Извлекаем данные по каждой валюте и записываем их в удобной для нас форме:

for rate in currency: sid = rate.getAttribute(«ID») charcode = rate.getElementsByTagName(«CharCode»)[0] name = rate.getElementsByTagName(«Name»)[0] value = rate.getElementsByTagName(«Value»)[0] nominal = rate.getElementsByTagName(«Nominal»)[0] str = «; ; ; ; n».format(sid, nominal.firstChild.data, name.firstChild.data, charcode.firstChild.data, value.firstChild.data) out.write(str)

Все, скрипт готов. Запускаем его командой python3 daily_rate.py и ищем в папке со скриптом файл exchange.txt.

Открываем CSV в LibreOffice и Google Документах

По сути у нас получился CSV-файл, который представляется собой таблицу, столбцы которой отделяются точкой с запятой, а строки — строками. LibreOffice Calc отлично понимает такие файлы (говорят, гораздо лучше чем Exсel).

Достаточно просто открыть наш файл exchange.txt с помощью LibreOffice Calc. Появится диалоговое окно, в котором необходимо поставить галочку напротив Точка с запятой и обязательно снять галочку напротив Запятая, так как запятая используется в качестве разделителя десятичных знаков в столбце с курсом валют.

Теперь можно использовать всю мощь LibreOffice Calc для дальнейшего анализа и построения графиков.

С таким же успехом CSV-файлы понимают и Google Документы.

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

Источники

Python. Получение данных о курсе валют.

В процессе изучения языка python, а именно работа с XML, мной в учебных целях был написан скрипт получающий значения валют в рублях с сайта ЦБР (http://www.cbr.ru/).

Получаемый XMl файл выглядит следующим образом:

036 AUD 1 Австралийский доллар 51,2242 944 AZN 1 Азербайджанский манат 83,9695 826 GBP 1 Фунт стерлингов Соединенного королевства 100,2974 .

полную его версию можно посмотреть по ссылке: http://www.cbr.ru/scripts/XML_daily.asp?date_req

Чтоб получить значения здесь и сейчас:

#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from xml.etree import ElementTree as ET id_dollar = «R01235» id_evro = «R01239» valuta = ET.parse(urllib.urlopen(«http://www.cbr.ru/scripts/XML_daily.asp?date_req»)) for line in valuta.findall(‘Valute’): id_v = line.get(‘ID’) if id_v == id_dollar: rub = line.find(‘Value’).text print «nКурс доллара»,rub,»рублей» if id_v == id_evro: rub = line.find(‘Value’).text print «nКурс евро»,rub,»рублей»

#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from xml.etree import ElementTree as ET id_dollar = «R01235» id_evro = «R01239» valuta = ET.parse(urllib.urlopen(«http://www.cbr.ru/scripts/XML_daily.asp?date_req»)) for line in valuta.findall(‘Valute’): id_v = line.get(‘ID’) if id_v == id_dollar: rub = line.find(‘Value’).text print «nКурс доллара»,rub,»рублей» if id_v == id_evro: rub = line.find(‘Value’).text print «nКурс евро»,rub,»рублей»

Чтоб использовать функцию в других скриптах:

import urllib import datetime from xml.etree import ElementTree as ET def dollar_evro(): «»»Получает значения доллара и евро в рублях на время запуска. Данные берутся с сайта ЦБР. Возвращает значение доллара в рублях, евро в рублях, дату.»»» id_dollar = «R01235» id_evro = «R01239» valuta = ET.parse(urllib.urlopen(«http://www.cbr.ru/scripts/XML_daily.asp?date_req»)) for line in valuta.findall(‘Valute’): id_v = line.get(‘ID’) if id_v == id_dollar: rub_dollar = line.find(‘Value’).text if id_v == id_evro: rub_evro = line.find(‘Value’).text today = datetime.date.today() return rub_dollar,rub_evro,today if __name__ == «__main__»: print dollar_evro()

import urllib import datetime from xml.etree import ElementTree as ET def dollar_evro(): «»»Получает значения доллара и евро в рублях на время запуска. Данные берутся с сайта ЦБР. Возвращает значение доллара в рублях, евро в рублях, дату.»»» id_dollar = «R01235» id_evro = «R01239» valuta = ET.parse(urllib.urlopen(«http://www.cbr.ru/scripts/XML_daily.asp?date_req»)) for line in valuta.findall(‘Valute’): id_v = line.get(‘ID’) if id_v == id_dollar: rub_dollar = line.find(‘Value’).text if id_v == id_evro: rub_evro = line.find(‘Value’).text today = datetime.date.today() return rub_dollar,rub_evro,today if __name__ == «__main__»: print dollar_evro()

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

Аналогично можно получить значения и других валют.

Источник: forex-pros.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
Заработок в интернете или как начать работать дома