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

десктопное уведомление

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

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

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

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

Больше информации об уведомлениях в Linux можно найти в документации Gnome и в документации Arch Linux.

Подготовка

Для отправки уведомлений нам понадобится пакет для языка Python notify2, который можно установить с помощью команды pip install notify2.

Создаем Crypto-Notifier

Давайте напишем инструмент, который будет сообщать текущий курс биткоина к доллару.

Весь процесс работы программы можно разбить на три шага:

  1. Сбор данных для отображения.
  2. Инициализация инструмента отправки уведомлений.
  3. Отображение данных во всплывающем уведомлении.

Сбор данных

Для получения текущего курса биткоина к доллару нам нужно извлечь данные с 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)

Отображение контента

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

result = '{0} — {1}'.format(*bitcoin) 

# Обновляем содержимое 
n.update("Текущий курс", result) 

# Показываем уведомление
n.show()

Проанализируем код:

  1. Сначала мы формируем контент для отображения, используя список, возвращенный функцией fetch_bitcoin.
  2. Затем мы передаем этот контент нашему инструменту для отправки уведомлений.
  3. И наконец мы показываем уведомление с помощью n.show() .

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

Перевод статьи «Building a desktop notification tool for Linux using Python»