使用DBus收听传入的libnotify通知

我试图通过espeak过滤每个通知。 但是,我似乎找不到从python脚本获取通知主体的方法,甚至无法收听哪个signal_name。

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

试图谷歌这只是为了产生涉及创建新通知的结果,所以我现在完全迷失了。

有人可以帮我这个吗?

简而言之,我想要的是使用python监听传入通知,并获取通知的“body”属性。

为了使其保持最新:从dbus 1.5.something中添加匹配字符串与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() 

通知是指某些软件发送的“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]表示正文。

有关其他字段的含义,请查看官方规范文档

我无法让任何其他例子真正发挥作用,但我最终到达那里。 这是一个有效的例子:

 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 。