การฟังการแจ้งเตือน libnotify ที่เข้ามาโดยใช้ DBus


9

ฉันกำลังพยายามกรองทุกการแจ้งเตือนผ่านทาง espeak อย่างไรก็ตามฉันไม่สามารถหาวิธีที่จะได้รับเนื้อหาการแจ้งเตือนจากสคริปต์ python หรือแม้แต่สัญญาณที่จะรับฟัง

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

การลองใช้ google สำหรับสิ่งนี้ดูเหมือนว่าจะให้ผลลัพธ์ที่เกี่ยวข้องกับการสร้างการแจ้งเตือนใหม่ดังนั้นฉันจึงหลงทางไปเลย

ใครสามารถช่วยฉันด้วยสิ่งนี้

ในระยะสั้นสิ่งที่ฉันต้องการคือการฟังการแจ้งเตือนขาเข้าโดยใช้ python และการรับคุณสมบัติ "เนื้อหา" ของการแจ้งเตือน


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

โดยการแจ้งเตือนคุณหมายถึง "ฟองสบู่ OSD" ที่ซอฟต์แวร์บางตัวส่งเช่นการเปลี่ยนระดับเสียงสนทนา IM ฯลฯ ? คุณต้องการสร้างโปรแกรมไพ ธ อนเพื่อจับภาพเหล่านั้นหรือไม่?

ดีถาม 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()

หากคุณต้องการดูตัวอย่างการทำงานที่ละเอียดยิ่งขึ้นฉันขอแนะนำให้ดูที่Notifications.py ในโครงการ__notificationsล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.