Приветствуем в специальной рубрике Python Проекты для новичков!
В данной статье мы будем создавать сервис уведомлений о ценах на биткоин. В ходе этого проекта, вы узнаете больше о запросах HTTP и о том, как их рассылать при помощи (как удобно) пакета requests на примерах.
Содержание:
- Настройка проекта
- Получение цены Биткоина
- Отправка тестового уведомления IFTTT
- Создание IFTTT апплетов
- Собираем все это вместе
- Закрепляем и идем дальше
Вы узнаете побольше о webhook, и как их использовать для подключения вашего приложения Python к внешним сервисам, таким как уведомления в телефоне или сообщения Telegram.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
С относительно коротким кодом (около 50 строк), вы запустите рабочий сервис уведомлений о цене на биткоин, который легко можно расширить для других криптовалют и возможностей.
Приступим!
Уведомления о цене на биткоин при помощи Python
Как мы знаем, курс биткоина – вещь непостоянная. Нельзя с уверенностью сказать, какой курс будет к концу дня. Так что вместо того, чтобы постоянно мониторить различные ресурсы, чтобы узнать последние обновления, мы создадим приложение Python, которое будет выполнять всю работу за вас!
Для этого мы используем популярный сайт автоматизации IFTTT. IFTTT (с анг. if this, then that. Букв. Перевод – если это, значит то) – это веб сервис, который соединяет разрыв между различными приложениями и устройствами.
Мы создадим два апплета IFTTT:
- Один для срочных уведомлений, когда курс биткоина упадет ниже определенной отметки;
- Второй для регулярных уведомлений в Telegram о курсе биткоина.
Оба апплета будут инициированы нашим приложением Python, которое будет использовать данные из Coinmarketcap.
Апплет IFTTT состоит из двух частей: триггер и действие.
В нашем случае, триггером будет сервис webhook (далее – вебхук), предоставляемый IFTTT. Вы можете расценивать webhook как «пользовательские обратные вызовы HTTP», с которыми вы можете поближе ознакомиться в интернете.
Наше приложение Python будет создавать HTTP запрос для URL вебхука, который вызовет действие. Сейчас веселая часть – этим действием может быть практически все, что придет в голову. IFTTT предоставляет множество действий, таких как отправка email, обновление таблиц Google, даже звонок на ваш телефон.
Настройка проекта
Начнем с настройки виртуальной среды. Запустите эту команду, чтобы получить новую виртуальную среду Python 3:
1 |
mkvirtualenv -p $(which python3) bitcoin_notifications |
Перед тем, как продолжить, вам нужно активировать виртуальную среду и установить необходимые зависимости:
1 2 |
$ workon bitcoin_notifications # активация виртуальной среды $ pip install requests==2.18.4 # нам нужен только пакет requests |
Вы можете деактивировать виртуальное пространство, запустив команду оболочки deactivate.
Получаем цену на биткоин
Теперь немного грязной работы. Мы можем начать с получения последней цены на биткоин из интерфейса Coinmarketcap в консоли Python:
Для начала, нам нужно импортировать модуль requests и определить переменную bitcoin_api_url, которая содержит URL интерфейса Coinmarketcap для биткоина.
Далее, мы отсылаем запрос HTTP GET по ссылке, используя функцию requests.get() и сохраняем ответ. Так как интерфейс (API) выдает ответ в формате json, мы можем конвертировать его в объект Python, вызвав функцию .json() в ответе. Как вы видите, интерфейс выдал список с одним элементом, содержащим данные о курсе биткоина:
1 2 3 4 5 6 7 8 9 |
import requests bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' response = requests.get(bitcoin_api_url) response_json = response.json() print(type(response_json)) # <class 'list'> print(response_json[0]) |
Результат:
1 2 3 4 5 6 |
{'id': 'bitcoin', 'name': 'Bitcoin', 'symbol': 'BTC', 'rank': '1', 'price_usd': '10226.7', 'price_btc': '1.0', '24h_volume_usd': '7585280000.0', 'market_cap_usd': '172661078165', 'available_supply': '16883362.0', 'total_supply': '16883362.0', 'max_supply': '21000000.0', 'percent_change_1h': '0.67', 'percent_change_24h': '0.78', 'percent_change_7d': '-4.79', 'last_updated': '1519465767'} |
Вещь, которая нас интересует больше всего – это ‘price_usd‘ — цена на биткоин в долларах США.
Отправка тестового уведомления IFTTT
Теперь мы можем перейти к части IFTTT. Чтобы использовать IFTTT, вам, в первую очередь, нужно завести новый аккаунт и установить их мобильное приложение (если вы хотите получать уведомления от вашего приложения Python именно на телефон). После того, как вы сделаете это, мы перейдем к созданию нового апплета IFTTT для тестовых нужд.
Для создания нового тестового апплета, нужно выполнить следующее:
- нажать на большую кнопку “this”;
- найти сервис “webhooks” и выбрать триггер “Receive a web request”;
- назовем событие test_event;
- теперь жмем на большую кнопку “that”;
- ищем сервис уведомлений “notifications” и выбираем “Send a notification from the IFTTT app” (отправить уведомление с приложения IFTTT);
- Меняем сообщение на «I just triggered my first IFTTT action!» ( с анг. я только что тригернул мое первое действие в IFTTT!) и жмем на “Create action”;
- Нажимаем на кнопку “Finish”. Это все.
Рекомендуем ознакомиться с документацией об использовании вебхуков IFTTT. Документация содержит URL вебхука, который выглядит вот так:
1 |
https://maker.ifttt.com/trigger/{event}/with/key/{your-IFTTT-key} |
Далее, нам нужно заменить часть {event} любым названием, которое вы дали в третьем шаге, создавая апплет. Часть {your-IFTTT-key} уже заполнена вашим ключом IFTTT.
Теперь копируем URL вебхука и запускаем еще одну консоль Python. Мы снова импортируем модуль requests и определяем переменную URL вебхука. Теперь нам остается только запрос HTTP POST URL-у вебхука IFTTT используя функцию requests.post():
1 2 3 4 5 |
import requests # Убедитесь в том, что ваш ключ находится в URL. ifttt_webhook_url = 'https://maker.ifttt.com/trigger/test_event/with/key/{your-IFTTT-key}' requests.post(ifttt_webhook_url) |
После запуска последней строки, вы должны увидеть уведомление в вашем телефоне:
Создание апплетов IFTTT
Теперь мы наконец готовы к тому, чтобы приступить к главной части. Перед тем как перейти к коду, нам нужно создать два новых апплета IFTTT: один для срочных уведомлений о курсе биткоина, второй – для регулярных обновлений.
Апплет для срочных уведомлений о курсе биткоина:
- Выбираем сервис “webhooks”, после этого выбираем триггер “Receive a web request” (получить веб запрос);
- Называем событие bitcoin_price_emergency
- Для действия выбираем сервис “Notifications” и выбираем действие “Send a rich notification from the IFTTT app” (прислать подробное уведомление от приложение IFTTT);
- Выбираем заголовок, например «Курс биткоина, срочно!»
- Прописываем сообщение, например: «Курс биткоина в долларах США {{Value1}} Покупайте или продавайте сейчас!» (мы вернемся к {{Value1}} попозже);
- На свой вкус вы можете добавить линк URL-а страницы биткоина Coinmarketcap.
- Создаем действие и заканчиваем настройку апплета.
Апплет для регулярных уведомлений:
- Снова выбираем сервис “webhooks” и выбираем триггер “Receive a web request”;
- Называем событие bitcoin_price_update;
- Для действия выбираем сервис “Telegram” и выбираем действие “Send message”;
- Прописываем текст сообщение, например: «Актуальная цена на биткоин: {{Value1}}»
- Создаем действие и заканчиваем с апплетом.
Обратите внимание: При создании апплета вам нужно провести авторизацию бота IFTTT в Telegram.
Собираем все это вместе
Теперь, когда у нас есть IFTTT, приступим к написанию кода! Вам нужно будет начать с создания стандартного командного скелета приложения Python, показанного ниже. Используйте этот код и сохраните файл под названием bitcoin_notifications.py:
1 2 3 4 5 6 7 8 9 |
import requests import time from datetime import datetime def main(): pass if __name__ == '__main__': main() |
Далее, нам нужно перенести две предыдущие сессии консоли Python в две функции, которые будут выдавать последние данные о курсе биткоина и постить в вебхук IFTTT соответственно. Добавьте следующие функции над основными функциями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
BITCOIN_API_URL = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{}/with/key/{your-IFTTT-key}' def get_latest_bitcoin_price(): response = requests.get(BITCOIN_API_URL) response_json = response.json() # Конвертирует курс в число с плавающей запятой return float(response_json[0]['price_usd']) def post_ifttt_webhook(event, value): data = {'value1': value} # Вставка желаемого события ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event) # Отправка запроса HTTP POST в URL вебхука requests.post(ifttt_event_url, json=data) |
get_latest_bitcoin_price, в целом, выполняется таким же образом, за одним исключением: часть где нам нужно конвертировать цену из строки в число с плавающей запятой. post_ifttt_webhook принимает два параметра: событие и значение.
Параметр event соответствует любому названию, которое мы дали нашему триггеру при настройке апплета IFTTT. Кстати, вебхуки IFTTT позволяют нам отправлять дополнительные данные вместе с запросом в качестве данных в формате JSON.
Поэтому нам нужен параметр value: При настройке наших апплетов мы оставили тег {{Value1}} в поле сообщения. Это тег был заменен на текст ‘value1‘ из данных JSON. Функция requests.post() позволяет нам отправлять дополнительные данные JSON, просто добавив ключевое слово json.
Теперь мы можем перейти к ядру нашего приложения в функции main. Она будет состоять из вечного цикла while True, поскольку мы хотим, чтобы наше приложение работало всегда. В цикле мы можем вызвать интерфейс Coinmarketcap для получения последних данных о курсе биткоина и записать актуальные дату и время.
На основании нынешнего курса, мы будем решать, нужно ли отправлять срочное уведомление. Для регулярных обновлений в Telegram мы добавим нынешний курс и дату в список bitcoin_history. После того, как содержимое списка достигнет определенного количества (к примеру, 5), мы отформатируем содержимое, отправим обновление в Telegram и сбросим историю для будущих обновлений.
Фух! Как видите, в этом приложении происходит много всякого. Если вы испытываете сложности в понимании происходящего, сделайте небольшой перерыв и перечитайте предыдущий раздел еще раз, внимательно. Это не самая простая затея, так что уделите время и не переживайте из-за того, что с первого раза все выйдет не совсем гладко.
Важный момент: старайтесь не рассылать запросы слишком часто. На это есть две причины:
- В Coinmarketcap утверждают, что они обновляют свои данные каждые 5 минут, так что нет смысла в обновлении данных о курсе на биткоин чаще этого интервала;
- Если ваше приложение отправляет слишком много запросов Coinmarketcap, ваш IP могут отправить в бан, или временно заблокировать.
По этой причине нам нужно «пойти отдохнуть» (остановить выполнение цикла) как минимум на 5 минут, перед получением новых данных. Написанный ниже код выполняет все необходимые функции, которые только что были упомянуты:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
BITCOIN_PRICE_THRESHOLD = 10000 # Настройте так, как вам угодно def main(): bitcoin_history = [] while True: price = get_latest_bitcoin_price() date = datetime.now() bitcoin_history.append({'date': date, 'price': price}) # Отправка срочного уведомления if price < BITCOIN_PRICE_THRESHOLD: post_ifttt_webhook('bitcoin_price_emergency', price) # Отправка уведомления Telegram # После получения 5 объектов в bitcoin_history – отправляем обновление if len(bitcoin_history) == 5: post_ifttt_webhook('bitcoin_price_update', format_bitcoin_history(bitcoin_history)) # Сброс истории bitcoin_history = [] # Сон на 5 минут # (Для тестовых целей вы можете указать меньшее число) time.sleep(5 * 60) |
Мы почти закончили! Единственное, чего не хватает – это функции format_bitcoin_history. Она принимает bitcoin_history в качестве аргумента и форматирует его, используя несколько базовых HTML тегов, принимаемых в Telegram, таких как <br>, <b>, <i> и т.д. Скопируйте эту функцию над главной функцией:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def format_bitcoin_history(bitcoin_history): rows = [] for bitcoin_price in bitcoin_history: # Форматирует дату в строку: '24.02.2018 15:09' date = bitcoin_price['date'].strftime('%d.%m.%Y %H:%M') price = bitcoin_price['price'] # тег <b> делает текст полужирным # 24.02.2018 15:09: $<b>10123.4</b> row = '{}: $<b>{}</b>'.format(date, price) rows.append(row) # Используйте тег <br> для создания новой строки return '<br>'.join(rows) |
Результат в вашем телефоне должен выглядеть следующим образом:
Чтобы запустить ваше приложение для уведомлений о курсе биткоина, выполните следующее в терминале вашей командной строки:
1 |
python bitcoin_notifications.py |
Ву а ля! Вложившись в 50 строк кода Python, вы создали собственное приложение для уведомлений о курсе биткоина. Поздравляем! Ниже будет изложен целый код, чтобы вы могли сравнить его со своим:
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 |
import requests import time from datetime import datetime BITCOIN_PRICE_THRESHOLD = 10000 BITCOIN_API_URL = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{}/with/key/{your-IFTTT-key}' def get_latest_bitcoin_price(): response = requests.get(BITCOIN_API_URL) response_json = response.json() return float(response_json[0]['price_usd']) # Конвертирует курс в число с плавающей запятой def post_ifttt_webhook(event, value): data = {'value1': value} ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event) # Вставка желаемого события requests.post(ifttt_event_url, json=data) # Отправка запроса HTTP POST в URL вебхука def format_bitcoin_history(bitcoin_history): rows = [] for bitcoin_price in bitcoin_history: date = bitcoin_price['date'].strftime('%d.%m.%Y %H:%M') # Форматирует дату в строку: '24.02.2018 15:09' price = bitcoin_price['price'] # тег <b> делает текст полужирным row = '{}: $<b>{}</b>'.format(date, price) # 24.02.2018 15:09: $<b>10123.4</b> rows.append(row) # Используйте тег <br> для создания новой строки return '<br>'.join(rows) def main(): bitcoin_history = [] while True: price = get_latest_bitcoin_price() date = datetime.now() bitcoin_history.append({'date': date, 'price': price}) # Отправка срочного уведомления if price < BITCOIN_PRICE_THRESHOLD: post_ifttt_webhook('bitcoin_price_emergency', price) # Отправка уведомления в Telegram if len(bitcoin_history) == 5: # После получения 5 объектов в bitcoin_history – отправляем обновление post_ifttt_webhook('bitcoin_price_update', format_bitcoin_history(bitcoin_history)) # Сброс истории bitcoin_history = [] time.sleep(5 * 60) # Сон на 5 минут(Для тестовых целей вы можете указать меньшее число) if __name__ == '__main__': main() |
Закрепляем и идем дальше
В данной статье мы создали собственное приложение, которое мониторит и уведомляет о курсе биткоина. Вы узнали, как рассылать запросы HTTP GET и POST при помощи пакета requests. Вы увидели, как легко подключить ваше приложение Python к внешним сервисам при помощи вебхуков и IFTTT.
Что же теперь? С Python и IFTTT – море по колено. Однако, существует несколько интересных предложений, которые помогут вам начать:
- Любите таблицы? Используйте действие IFTTT, которое будет добавлять цены на биткоин в таблицы Google;
- Вы можете улучшить условие if price < BITCOIN_PRICE_THRESHOLD для получения уведомлений только раз в день (в противном случае, это будет раздражать, если биткоин будет постоянно на низкой позиции);
- Предпочитаете Ethereum/Litecoin/Dogecoin? Поменяйте get_latest_bitcoin_price на get_latest_cryptocurrency_price, которая выберет любую криптовалюту в качестве параметра и выдаст её курс;
- Хотите видеть курс в другой валюте? Проверьте Coinmarketcap параметр конвертации Coinmarketcap;
Желаем удачи в работе с Python! Дайте знать, что за приложение вы лично построили при помощи Python и IFTTT в коментарях!
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»