• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Всплывающие сообщения в Windows и Linux с помощью Python

Всем доброго времени суток. Давайте поговорим сегодня о простой, но далеко не самой очевидной вещи, которая не лежит не виду, а когда с ней сталкиваешься, приходиться некоторое время гуглить информацию. О всплывающих сообщениях. Ведь порою в скриптах нужно отображать информацию не только в консоли. А если приложение имеет еще и пользовательский интерфейс, то сообщения, конечно же, лучше выводить без ее использования.

000.jpg


Что потребуется?

Тут все зависит от операционной системы и способа, которым вы выберете выводить сообщение. Если операционная система Linux, то здесь может не потребоваться ничего, так как будет использоваться функция операционной системы. А можно установить специальную библиотеку notify2. Установка происходит через терминал с помощью команды pip:

pip install notify2

А дальше импортируем в скрипт.

import notify2


Всплывающие сообщения в Linux

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

Python:
icon_path = "/usr/share/icons/gnome/24x24/emotes/face-laugh.png"
notify2.init(text)
mess = notify2.Notification(text, icon=icon_path)
mess.set_urgency(notify2.URGENCY_NORMAL)
mess.show()

Первая переменная здесь – это просто путь до иконки, который будет выводиться в сообщении. Дальше инициализируем соединение d-bus. Это механизм, с помощью которого процессы взаимодействуют друг с другом и который используют программы в Linux. А потому, нужно подключиться через d-bus к процессу, который управляет системным интерфейсом и передать ему такие параметры, как значок, заголовок и текст сообщения.

Далее создаем объект уведомлений, в который передаем сообщение и его иконку. И, если в этом есть необходимость, можно установить уровень срочности сообщения, у которого их целых три: URGENCY_LOW, URGENCY_CRITICAL, URGENCY_NORMAL. Ну и с помощью метода show() показываем сообщение.

Вот в принципе и все. Казалось бы, какие тут могут быть «камни»? Но, я попытался запустить данный код в Kali. И о чудо, я получил ошибку, которая гласила, что d-bus не установлен в системе. Оказывается, бывает и такое. Тогда я сделал обработку ошибки и вывел сообщение уже более простым способом:

Python:
command = f'''notify-send {text}'''
system(command)

где command – это собственно команда и сообщение. А system эту команду исполняет. В итоге, получилась небольшая функция, которую я назвал linux_notify(text), на входе принимающая текст сообщения:

Python:
def linux_notify(text):
    try:
        import notify2
        icon_path = "/usr/share/icons/gnome/24x24/emotes/face-laugh.png"
        notify2.init(text)
        mess = notify2.Notification(text, icon=icon_path)
        mess.set_urgency(notify2.URGENCY_NORMAL)
        mess.show()
    except ModuleNotFoundError:
        command = f'''notify-send {text}'''
        system(command)


Всплывающие сообщение в Windows

Ну и после этого я подумал, а не поискать ли мне простые способы отображения всплывающих сообщений и в Windows. Подумал, поискал и вот, что нашел. Для начала - win10toast. Устанавливаем в терминале. Тут все стандартно:

pip install win10toast

Затем импортируем в скрипт:

from win10toast import ToastNotifier

и уже можно с ней работать.

Python:
ToastNotifier().show_toast("Демо сообщение", text, icon_path=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-"
                                                                 r"deviceexperience_31bf3856ad364e35_10.0.19041.746"
                                                                 r"_none_251e769058968366\sync.ico",
                               duration=3, threaded=True)

Итак. Первый параметр, это заголовок сообщения. Второй, само сообщение. Третий – путь к иконке. Я нашел в недрах винды что-то более-менее подходящее. Не факт, что есть на других машинах, но в теории должно быть, так то. Параметр duration отвечает за количество секунд, которые будет отображаться сообщение. Ну и threaded. Забавный параметр, который обязательно включить, если вы сделали пользовательский интерфейс в PyQt. Иначе, после вывода сообщения окно программы у вас будет просто закрываться. Насколько я понял, это потоковый параметр, который ждет завершения работы уведомления. Это был первый способ.

Второй способ немного проще. Устанавливаем библиотеку plyer:

pip install plyer

и импортируем ее в скрипт:

from plyer import notification

А затем пишем простой код:

Python:
notification.notify(message=text, app_icon=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-deviceexperience_"
                                               r"31bf3856ad364e35_10.0.19041.746_none_251e769058968366\sync.ico")

И все. Сообщение готово. Первый параметр тут текст сообщения. Второй – путь к иконке. И все работает. Причем в любых приложениях на винде. Хоть консольных, хоть с пользовательским интерфейсом.

Такие вот способы, которые более-менее позволяют вывести сообщение в Linux и Windows. Без сомнения, есть и другие, более сложные способы. Но, чтобы не лезть в дебри, а просто вывести сообщение, этих способов будет достаточно. И я оформил все в небольшой код. Который, в общем-то, не обязателен, но так все же приятнее и легче он читается.

Python:
# pip install notify2
# pip install win10toast
# pip install plyer

from platform import system as psystem
import time
from os import system


def linux_notify(text):
    try:
        import notify2
        icon_path = "/usr/share/icons/gnome/24x24/emotes/face-laugh.png"
        notify2.init(text)
        mess = notify2.Notification(text, icon=icon_path)
        mess.set_urgency(notify2.URGENCY_NORMAL)
        mess.show()
    except ModuleNotFoundError:
        command = f'''notify-send {text}'''
        system(command)


def windows_notify(text):
    from plyer import notification
    from win10toast import ToastNotifier
    ToastNotifier().show_toast("Демо сообщение", text, icon_path=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-"
                                                                 r"deviceexperience_31bf3856ad364e35_10.0.19041.746"
                                                                 r"_none_251e769058968366\sync.ico",
                               duration=3, threaded=True)
    time.sleep(4)

    notification.notify(message=text, app_icon=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-deviceexperience_"
                                               r"31bf3856ad364e35_10.0.19041.746_none_251e769058968366\sync.ico")


if __name__ == "__main__":
    message = input('[+] Введите текст сообщение: ')

    if psystem() == "Linux":
        linux_notify(message)
    elif psystem() == "Windows":
        windows_notify(message)

А на этом все. Какой из библиотек пользоваться, решать без сомнения вам.

Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!