DBus를 사용하여 수신 libnotify 알림 청취


9

espeak를 통해 모든 알림을 필터링하려고합니다. 그러나 파이썬 스크립트에서 알림 본문을 가져 오는 방법을 찾을 수 없거나 심지어 어떤 signal_name을 (를) 청취할지 모릅니다.

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

이를 위해 Google에 시도하면 새로운 알림을 만드는 것과 관련된 결과 만 나오는 것처럼 보이므로 지금 완전히 사라졌습니다.

누구든지 이것을 도울 수 있습니까?

요컨대, 내가 원하는 것은 파이썬을 사용하여 들어오는 알림을 듣고 알림의 "body"속성을 얻는 것입니다.


1
알림이 신호를 생성하지 않는 것 같습니다. 즉, 알림 dbus-monitor "type='signal',interface='org.freedesktop.Notifications'"dbus-monitor "interface='org.freedesktop.Notifications'"표시합니다 (유형은 '신호'가 아닌 'method_call'입니다).
jfs

답변:


11

이것을 최신 상태로 유지하려면 : 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()

알림 필터 내에서 다른 다른 dbus 메서드를 호출하려는 경우 작동하지 않습니다. 내가 얻는 전부 unable to connect to session bus: Operation was cancelled. 우리는 bus필터 로 전달 하고 있습니다.
Khurshid Alam

1
내 Python 설치 (Python 3, Ubuntu) from gi.repository import GLib as glib에서이 작업을 수행해야했습니다.
오웬

6

알림은 볼륨 변경, IM 채팅 등과 같은 일부 소프트웨어가 전송하는 "OSD 버블"을 의미합니까? 그것들을 캡처하기 위해 파이썬 프로그램을 만들고 싶습니까?

Ask 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]입니다.

다른 필드의 의미 는 공식 사양 문서를 확인하십시오 .


16.04 또는 그 이전에 더 이상 작동하지 않는 것 같습니다. Joost의 대답은 아래에서 해결됩니다.
Catskul

3

실제로 다른 예제를 얻는 데 어려움이 있었지만 결국 거기에 도착했습니다. 다음은 실제 예입니다.

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

더 자세한 작업 예를 보려면 recent_notifications 프로젝트 에서 Notifications.py를 보는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.