Найти тему
Удалёнка

push-уведомления на рабочий стол в Linux с помощью Python

Десктопное уведомление — это всплывающее на рабочем столе сообщение, которое оповещает о каком-либо событии.

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

Наиболее подходящий вариант для уведомлений, которые не нуждаются в немедленной реакции пользователя, — это не интерактивное всплывающее уведомление.

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

Больше информации об уведомлениях в 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() .

В конечном итоге у нас должно получиться что-то вроде этого: