DBus kullanarak gelen libnotify bildirimlerini dinleme


9

Her bildirimi espeak yoluyla filtrelemeye çalışıyorum. Ancak, bir python komut dosyasından bildirim gövdesi almak için bir yol bulamıyorum, hatta dinlemek için ne sinyal_name.

bus.add_signal_receiver(espeak,
                    dbus_interface="org.freedesktop.Notifications",
                    signal_name="??")

Bunun için google'ı denemek sadece yeni bildirimler oluşturmayı içeren sonuçlar veriyor gibi görünüyor, bu yüzden şimdi tamamen kayboldum.

Herkes bana bu konuda yardımcı olabilir mi?

Kısacası, istediğim python kullanarak gelen bildirimleri dinlemek ve bildirimin "body" niteliğini elde etmektir.


1
Bir bildirim bir sinyal üretmez, yani dbus-monitor "type='signal',interface='org.freedesktop.Notifications'"hiçbir şey dbus-monitor "interface='org.freedesktop.Notifications'"göstermez , ancak bildirimleri gösterir (tür 'sinyal' değil 'method_call' şeklindedir).
jfs

Yanıtlar:


11

Bunu güncel tutmak için: dbus 1.5.something ile bus.add_match_string_non_blockingher şeyi aldığımızdan emin olmak için bir eşleşme dizesi eklerken fazladan bir parametre gerekir .

Ortaya çıkan kod aşağıdaki gibi olacaktır:

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()

Bildirim filtresinin içinde başka bir dbus yöntemi çağırmak istersem işe yaramaz. Tüm aldığım unable to connect to session bus: Operation was cancelled. busFiltreye geçiyoruz .
Khurshid Alam

1
Python kurulumumda (Python 3, Ubuntu) from gi.repository import GLib as glibbu işi yapmam gerekiyordu .
Owen

6

Bildirimlerle, ses seviyesini değiştirmek, anlık mesajlaşma vb. Gibi bazı yazılımların gönderdiği "OSD baloncukları" anlamına mı geliyor? Bunları yakalamak için bir python programı mı oluşturmak istiyorsunuz?

Eh, Ask Ubuntu bir programcının KG değil ve yazılım geliştirme kapsamın biraz ötesinde, ama burada bildirim kabarcıklarını yakalamak için yaptığım küçük bir kod:

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()

Bunu bir terminalde çalışır halde bırakın, ardından başka bir terminal penceresi açın ve test edin:

notify-send --icon=/usr/share/pixmaps/debian-logo.png "My Title" "Some text body"

Ve program bunu çıktılar:

[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'),...

Tahmin edebileceğiniz gibi message.get_args_list()[0], gönderen, simge için [2], özet için [3] ve gövde metni için [4].

Diğer alanların anlamları için resmi şartname belgelerine bakın


Görünüşe göre artık 16.04 veya daha önceki bir tarihte çalışmıyor. Joost'un aşağıdaki cevabı düzeltiyor.
Catskul

3

Çalışmak için diğer örneklerden herhangi birini elde etmekte zorlandım ama sonunda oraya vardım. İşte çalışan bir örnek:

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()

Daha ayrıntılı bir çalışma örneği görmek istiyorsanız , Recent_notifications projesinde Notifications.py dosyasına bakmanızı öneririm .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.