Pertanyaan Mendengarkan pemberitahuan pemberitahuan masuk menggunakan DBus


Saya mencoba memfilter setiap notifikasi melalui espeak. Namun, saya tidak bisa menemukan cara untuk mendapatkan isi notifikasi dari skrip python, atau bahkan apa yang signal_name untuk dengarkan.

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

Mencoba ke google untuk ini sepertinya hanya menghasilkan hasil yang melibatkan pembuatan pemberitahuan baru, jadi saya benar-benar hilang sekarang.

Adakah yang bisa membantu saya dengan ini?

Singkatnya, yang saya inginkan adalah mendengarkan notifikasi yang masuk menggunakan python, dan mendapatkan atribut "body" dari notifikasi.


9
2017-12-20 17:55


asal


Sepertinya pemberitahuan tidak menghasilkan sinyal, yaitu, dbus-monitor "type='signal',interface='org.freedesktop.Notifications'" tidak menunjukkan apa pun kecuali dbus-monitor "interface='org.freedesktop.Notifications'" menunjukkan pemberitahuan (ketik 'method_call' not 'signal'). - jfs


Jawaban:


Untuk menjaga ini tetap up to date: dari dbus 1.5.sesuatu parameter ekstra diperlukan saat menambahkan string cocok dengan bus.add_match_string_non_blocking untuk memastikan kami menerima semuanya.

Kode yang dihasilkan adalah sebagai berikut:

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

11
2018-04-20 15:25





Dengan pemberitahuan, maksud Anda adalah "gelembung OSD" yang dikirimkan beberapa perangkat lunak, seperti mengubah volume, chat IM, dll? Anda ingin membuat program python untuk menangkapnya?

Nah, Tanya Ubuntu bukan QA programmer, dan pengembangan perangkat lunak agak di luar ruang lingkup, tapi di sini ada sedikit kode yang saya lakukan untuk menangkap gelembung notifikasi:

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

Biarkan ini berjalan di terminal, lalu buka jendela terminal lain dan ujilah:

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

Dan program akan menghasilkan ini:

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

Seperti yang bisa Anda tebak, message.get_args_list()[0] adalah pengirim, [2] untuk ikon, [3] untuk ringkasan dan [4] untuk teks isi.

Untuk arti dari bidang lain, periksa dokumen spesifikasi resmi


6
2017-09-20 00:44



Sepertinya tidak lagi berfungsi pada saat atau sebelum 16.04. Jawaban Joost di bawah tidak memperbaikinya. - Catskul


Saya kesulitan mendapatkan salah satu contoh lain untuk benar-benar bekerja tetapi akhirnya saya sampai di sana. Berikut ini contoh kerja:

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

Jika Anda ingin melihat contoh kerja yang lebih rinci, saya sarankan untuk melihatnya Notifications.py dalam recent_notifications proyek.


3
2018-03-24 13:47