डीबस का उपयोग कर आने वाली सूचनाओं को सुनने के लिए


9

मैं जासूसी के माध्यम से हर अधिसूचना को फ़िल्टर करने का प्रयास कर रहा हूं। हालाँकि, मैं एक स्क्रिप्ट को अजगर स्क्रिप्ट से प्राप्त करने का एक तरीका नहीं खोज सकता, या यहां तक ​​कि क्या सुनने के लिए संकेत_नाम।

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

इसके लिए Google को प्रयास करने से केवल नई सूचनाएं बनाने से संबंधित परिणाम मिलते हैं, इसलिए मैं अब पूरी तरह से खो गया हूं।

किसी को भी इस के साथ मेरी मदद कर सकते हैं?

संक्षेप में, जो मैं चाहता हूं वह अजगर का उपयोग करके आने वाली सूचनाओं को सुनने के लिए है, और अधिसूचना के "निकाय" विशेषता को प्राप्त करना है।


1
ऐसा लगता है कि एक अधिसूचना एक संकेत का उत्पादन नहीं करती है अर्थात, dbus-monitor "type='signal',interface='org.freedesktop.Notifications'"कुछ भी नहीं dbus-monitor "interface='org.freedesktop.Notifications'"दिखाती है लेकिन सूचनाएं दिखाती है (प्रकार 'method_call' है 'सिग्नल' नहीं)।
21

जवाबों:


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फ़िल्टर को पास कर रहे हैं ।
खुर्शीद आलम

1
मेरे पायथन इंस्टॉलेशन (पायथन 3, उबंटू) पर मुझे from gi.repository import GLib as glibयह काम करने की जरूरत थी ।
ओवेन

6

सूचनाओं से आपका मतलब "OSD बुलबुले" है जो कुछ सॉफ़्टवेयर भेजता है, जैसे वॉल्यूम बदलना, आईएम चैट, आदि? आप उन पर कब्जा करने के लिए एक अजगर कार्यक्रम बनाना चाहते हैं?

खैर, उबंटू से पूछें कि प्रोग्रामर का क्यूए नहीं है, और सॉफ्टवेयर का विकास कुछ हद तक है, लेकिन यहां एक छोटा कोड है जिसे मैंने नोटिफिकेशन बबल पर कब्जा किया है:

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] आइकन के लिए, [३] सारांश के लिए और [४] शरीर पाठ के लिए।

अन्य क्षेत्रों के अर्थ के लिए, आधिकारिक विनिर्देश डॉक्स की जांच करें


ऐसा लगता है कि अब यह 16.04 पर या इससे पहले किसी समय की तरह काम नहीं करता है। नीचे जोस्ट का जवाब इसे ठीक करता है।
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 को देखने की सलाह देता हूँ ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.