Nghe thông báo libnotify đến bằng DBus


9

Tôi đang cố gắng lọc mọi thông báo thông qua đặc biệt. Tuy nhiên, tôi dường như không thể tìm cách lấy nội dung thông báo từ tập lệnh python hoặc thậm chí là signal_name để nghe.

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

Cố gắng google cho điều này dường như chỉ mang lại kết quả liên quan đến việc tạo thông báo mới, vì vậy bây giờ tôi hoàn toàn bị mất.

có ai giúp tôi cái này không?

Nói tóm lại, điều tôi muốn là lắng nghe các thông báo đến bằng python và có được thuộc tính "cơ thể" của thông báo.


1
Có vẻ như một thông báo không tạo ra tín hiệu tức là, dbus-monitor "type='signal',interface='org.freedesktop.Notifications'"không hiển thị gì ngoài dbus-monitor "interface='org.freedesktop.Notifications'"hiển thị thông báo (loại là 'method_call' không phải 'signal').
jfs

Câu trả lời:


11

Để luôn cập nhật thông tin này: từ dbus 1.5. Một cái gì đó cần có một tham số bổ sung khi thêm chuỗi khớp bus.add_match_string_non_blockingđể đảm bảo chúng tôi nhận được mọi thứ.

Mã kết quả sẽ như sau:

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

Nếu tôi muốn gọi một phương thức dbus khác trong bộ lọc thông báo, nó không hoạt động. Tất cả tôi nhận được unable to connect to session bus: Operation was cancelled. Chúng tôi đang chuyển qua busbộ lọc.
Khurshid Alam

Khi cài đặt Python (Python 3, Ubuntu) tôi cần from gi.repository import GLib as glibđể thực hiện công việc này.
Owen

6

Theo thông báo, bạn có nghĩa là "bong bóng OSD" mà một số phần mềm gửi, như thay đổi âm lượng, trò chuyện IM, v.v.? Bạn muốn tạo một chương trình python để bắt những người đó?

Chà, hỏi Ubuntu không phải là QA của lập trình viên và việc phát triển phần mềm hơi vượt quá phạm vi, nhưng đây là một đoạn mã nhỏ tôi đã thực hiện để chụp bong bóng thông báo:

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

Để nó chạy trong một thiết bị đầu cuối, sau đó mở một cửa sổ thiết bị đầu cuối khác và kiểm tra nó:

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

Và chương trình sẽ xuất ra điều này:

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

Như bạn có thể đoán, message.get_args_list()[0]là người gửi, [2] cho biểu tượng, [3] cho tóm tắt và [4] cho văn bản cơ thể.

Để biết ý nghĩa của các trường khác, hãy kiểm tra tài liệu đặc tả chính thức


Có vẻ như nó không còn hoạt động vào khoảng trước hoặc trước ngày 16.04. Câu trả lời của Joost dưới đây không khắc phục được.
Catskul

3

Tôi gặp khó khăn khi lấy bất kỳ ví dụ nào khác để thực sự hoạt động nhưng cuối cùng tôi đã đến đó. Đây là một ví dụ hoạt động:

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

Nếu bạn muốn xem một ví dụ làm việc chi tiết hơn, tôi khuyên bạn nên xem Notifying.py trong dự án Recent_notifying .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.