import asyncio
from winrt.windows.ui.notifications.management import UserNotificationListener
from winrt.windows.ui.notifications import KnownNotificationBindings
async def notification_handler(listener, seen_notifications):
print("Слушатель уведомлений запущен. Ожидание новых уведомлений...")
# Бесконечно слушаем уведомления
while True:
try:
# Получение всех текущих уведомлений
notifications = await listener.get_notifications_async(0)
for notification in notifications:
notification_id = notification.id # Получаем уникальный ID уведомления
# Проверяем, было ли это уведомление уже обработано
if notification_id not in seen_notifications:
seen_notifications.add(notification_id) # Добавляем ID в множество обработанных уведомлений
try:
# Получение информации об уведомлении
app_name = notification.app_info.display_info.display_name
binding = notification.notification.visual.get_binding(KnownNotificationBindings.get_toast_generic())
if binding:
text_elements = binding.get_text_elements()
title = text_elements[0].text if len(text_elements) > 0 else "Без заголовка"
body = text_elements[1].text if len(text_elements) > 1 else "Без текста"
print(f"Новое уведомление!")
print(f"Приложение: {app_name}")
print(f"Заголовок: {title}")
print(f"Текст: {body}")
print("-" * 50)
# Проверяем что ув. от нужного приложения и делаем всякое нужное с ним.
except Exception as e:
print(f"Ошибка при обработке уведомления: {e}")
# Задержка перед следующим циклом
await asyncio.sleep(1)
except Exception as e:
print(f"Ошибка при получении уведомлений: {e}")
await asyncio.sleep(5) # Задержка перед повторной попыткой в случае ошибки
async def main():
# Получение текущего слушателя уведомлений
listener = UserNotificationListener.get_current()
# Смотрим есть ли разрешение на доступ к уведомлениям. Если нет, лезем в настройки уведомлений.
access_status = await listener.request_access_async()
if access_status != 1:
print("Нет разрешения на доступ к уведомлениям. Проверьте настройки конфиденциальности.")
return
seen_notifications = set() # Множество для хранения ID уже обработанных уведомлений
await notification_handler(listener, seen_notifications)
if __name__ == "__main__":
asyncio.run(main())