Я пытаюсь отфильтровать каждое уведомление через espeak. Тем не менее, я не могу найти способ получить тело уведомления из скрипта Python или даже какое имя_сигнала для прослушивания.
bus.add_signal_receiver(espeak,
dbus_interface="org.freedesktop.Notifications",
signal_name="??")
Попытка Google для этого только, кажется, дает результаты, связанные с созданием новых уведомлений, поэтому я полностью потерян.
Кто-нибудь может мне помочь с этим?
Короче говоря, я хочу слушать входящие уведомления, используя python, и получать атрибут «body» уведомления.
Чтобы поддерживать это в актуальном состоянии: начиная с dbus 1.5. Что-то требует дополнительного параметра при добавлении строки совпадения с bus.add_match_string_non_blocking
, чтобы убедиться, что мы получаем все.
Полученный код будет следующим:
import glib
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def notifications(bus, message):
print [arg for arg in message.get_args_list()]
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string_non_blocking("eavesdrop=true, interface='org.freedesktop.Notifications', member='Notify'")
bus.add_message_filter(notifications)
mainloop = glib.MainLoop()
mainloop.run()
У меня были проблемы с тем, чтобы заставить работать какие-либо другие примеры, но в конце концов я попал туда. Вот рабочий пример:
import glib
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def print_notification(bus, message):
keys = ["app_name", "replaces_id", "app_icon", "summary",
"body", "actions", "hints", "expire_timeout"]
args = message.get_args_list()
if len(args) == 8:
notification = dict([(keys[i], args[i]) for i in range(8)])
print notification["summary"], notification["body"]
loop = DBusGMainLoop(set_as_default=True)
session_bus = dbus.SessionBus()
session_bus.add_match_string("type='method_call',interface='org.freedesktop.Notifications',member='Notify',eavesdrop=true")
session_bus.add_message_filter(print_notification)
glib.MainLoop().run()
Если вы хотите увидеть более подробный рабочий пример, я рекомендую взглянуть на Notifications.py в проекте недавних уведомлений .
Уведомлениями Вы имеете в виду "пузыри OSD", которые некоторое программное обеспечение отправляет, как изменяющийся объем, чат IM, и т.д.? Вы хотите создать программу Python для получения их?
Ну, Попросите, чтобы Ubuntu не был QA программиста, и разработка программного обеспечения немного выходит за рамки, но здесь является небольшим кодом, я действительно делал пузыри уведомления о получении:
import glib
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def notifications(bus, message):
if message.get_member() == "Notify":
print [arg for arg in message.get_args_list()]
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string_non_blocking("interface='org.freedesktop.Notifications'")
bus.add_message_filter(notifications)
mainloop = glib.MainLoop()
mainloop.run()
Оставьте это выполнение в терминале, затем откройте другое окно терминала и протестируйте его:
notify-send --icon=/usr/share/pixmaps/debian-logo.png "My Title" "Some text body"
И программа произведет это:
[dbus.String(u'notify-send'), dbus.UInt32(0L), dbus.String(u'/usr/share/pixmaps/debian-logo.png'), dbus.String(u'My Title'), dbus.String(u'Some text body'),...
Поскольку Вы, возможно, предположили, message.get_args_list()[0]
отправитель, [2] для значка, [3] для сводки и [4] для основного текста.
Для значения других полей проверьте официальные документы спецификации