Десктопное уведомление — это всплывающее на рабочем столе сообщение, которое оповещает о каком-либо событии.
Компьютер может прислать вам уведомление по множеству причин, не обязательно связанных с вашей текущей деятельностью: обновление ПО, новое сообщение в мессенджере, низкий заряд батареи и многое другое.
Наиболее подходящий вариант для уведомлений, которые не нуждаются в немедленной реакции пользователя, — это не интерактивное всплывающее уведомление.
Сегодня мы создадим программу, которая будет присылать такие уведомления.
Больше информации об уведомлениях в Linux можно найти в документации Gnome и в документации Arch Linux.
Подготовка
Для отправки уведомлений нам понадобится пакет для языка Python notify2, который можно установить с помощью команды pip install notify2.
Создаем Crypto-Notifier
Давайте напишем инструмент, который будет сообщать текущий курс биткоина к доллару.
Весь процесс работы программы можно разбить на три шага:
Сбор данных для отображения.
Инициализация инструмента отправки уведомлений.
Отображение данных во всплывающем уведомлении.
Сбор данных
Для получения текущего курса биткоина к доллару нам нужно извлечь данные с CoinGecko. Поскольку этот сайт не предоставляет API-интерфейса, нам необходимо получить данные из чистого HTML. Мы сделаем это с помощью библиотеки BeautifulSoup.
Нужные нам данные находятся в тегах <table> и <tr>. Структура страницы показана на скриншоте ниже:
Создадим файл с названием rates.py и поместим в него следующий код:
from bs4 import BeautifulSoup
import requests
def fetch_bitcoin():
# URL с актуальным курсом
url = "https://www.coingecko.com/en/price_charts/bitcoin/usd"
headers = {'User-Agent': 'Mozilla/5.0'}
bitcoin_file = requests.get(url)
# Создаем soup-объект
soup = BeautifulSoup(bitcoin_file.text, "html.parser")
bitcoin_li = []
# Извлекаем необходимые данные из тегов
for table in soup.find_all("table", attrs={"class" : "table table-responsive mt-2"}):
for td in table.find_all("td"):
bitcoin_li.append(td.text)
del bitcoin_li[3:]
# Убираем ненужные символы из элементов списка
bitcoin_li = map(lambda s : s.strip(), bitcoin_li)
return bitcoin_li
Здесь мы определили функцию, которая возвращает детали курса в форме списка после извлечения информации по заданному url.
Инициализация инструмента отправки push-уведомлений
После получения необходимой для отображения информации нам нужно инициализировать инструмент отправки push-уведомлений, как показано ниже:
import notify2
import rates
def notify():
ICON_PATH= "полный путь до иконки"
# Получаем текущий курс
bitcoin = rates.fetch_bitcoin()
# Инициализируем d-bus соединение
notify2.init("Cryptocurrency rates notifier")
# Создаем Notification-объект
n = notify2.Notification("Crypto Notifier", icon = ICON_PATH)
# Устанавливаем уровень срочности
n.set_urgency(notify2.URGENCY_NORMAL)
# Устанавливаем задержку
n.set_timeout(1000)
Давайте пройдемся по коду шаг за шагом:
Прежде чем мы сможем отправлять какие-либо уведомления, нам нужно инициализировать D-Bus соединение. D-Bus — механизм общения между процессами (IPC), который программы под Linux используют, чтобы взаимодействовать друг с другом. Чтобы отобразить уведомление, наша программа должна подключиться через D-Bus к процессу, управляющему системным интерфейсом, и передать ему информацию об уведомлении, такую как его заголовок, текст и значок. Подробнее про то, как это устроено, можно почитать на официальном сайте, но в библиотеке notify2, которую мы используем, всё это уже реализовано. Единственное, что мы должны сделать — вызвать функцию notify2.init(), передав ей имя нашей программы, чтобы notify2 смогла установить и инициализировать подключение к D-Bus:
notify2.init("Средство уведомления о курсе криптовалют")
Затем мы создаем объект уведомлений:
n = notify2.Notification("Crypto Notifier", icon = ICON_PATH)
Общая структура объекта уведомлений:
notify2.Notification(summary, message='body text', icon=ICON_PATH)
При желании мы можем установить уровень срочности с помощью метода set_urgency:
n.set_urgency(notify2.URGENCY_NORMAL)
Другие доступные константы: notify2.URGENCY_LOW, notify2.URGENCY_CRITICAL.
Также мы можем установить задержку между отправкой уведомлений:
n.set_timeout(1000)
Отображение контента
С инициализацией покончено, займемся отображением уведомлений. Во фрагменте кода ниже показано, как это можно сделать:
esult = '{0} — {1}'.format(*bitcoin)
# Обновляем содержимое
n.update("Текущий курс", result)
# Показываем уведомление
n.show()
Проанализируем код:
Сначала мы формируем контент для отображения, используя список, возвращенный функцией fetch_bitcoin.
Затем мы передаем этот контент нашему инструменту для отправки уведомлений.
И наконец мы показываем уведомление с помощью n.show() .
В конечном итоге у нас должно получиться что-то вроде этого: