DBusを使用して着信libnotify通知を聞く


9

私はすべての通知をespeakでフィルタリングしようとしています。しかし、Pythonスクリプトから通知の本文を取得する方法、またはどのsignal_nameをリッスンするかを見つけることができないようです。

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

このためにグーグルしようとすると、新しい通知の作成に関連する結果しか得られないようです。そのため、今は完全に迷っています。

誰でもこれを手伝ってくれる?

要するに、Pythonを使用して着信通知をリッスンし、通知の「body」属性を取得することです。


1
通知が信号すなわち、発生しないと思われるdbus-monitor "type='signal',interface='org.freedesktop.Notifications'"番組は何もなく、dbus-monitor "interface='org.freedesktop.Notifications'"(タイプは「信号」「METHOD_CALL」ではありません)を示した通知を。
jfs 2012

回答:


11

これを最新に保つには: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()

通知フィルター内で別の別のdbusメソッドを呼び出す場合、機能しません。私が得るすべてunable to connect to session bus: Operation was cancelledbusフィルターを通過します。
Khurshid Alam

1
私のPythonインストール(Python 3、Ubuntu)ではfrom gi.repository import GLib as glib、これを機能させる必要がありました。
オーウェン

6

通知とは、音量の変更、IMチャットなど、一部のソフトウェアが送信する「OSDバブル」を意味しますか?それらをキャプチャするpythonプログラムを作成したいですか?

まあ、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 2016年

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

より詳細な作業例を見たい場合は、recents_notificationsプロジェクトのNotifications.pyを確認することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.