DBus ব্যবহার করে আগত libnotify বিজ্ঞপ্তিগুলি শুনছি


9

আমি espeak এর মাধ্যমে প্রতিটি বিজ্ঞপ্তি ফিল্টার করার চেষ্টা করছি। তবে পাইথন স্ক্রিপ্ট থেকে নোটিফিকেশন বডি পাওয়ার কোনও উপায় বা কোন সিগন্যাল_নাম শুনতে হবে তা আমি খুঁজে পাচ্ছি না।

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

এর জন্য গুগলে চেষ্টা করার ফলে কেবল নতুন বিজ্ঞপ্তি তৈরির ফলাফল পাওয়া যাচ্ছে বলে আমি এখন সম্পূর্ণ হারিয়েছি।

যে কেউ এই সঙ্গে আমাকে সাহায্য করতে পারেন?

সংক্ষেপে, আমি যা চাই তা হল পাইথন ব্যবহার করে আগত বিজ্ঞপ্তিগুলি শুনতে এবং বিজ্ঞপ্তির "বডি" বৈশিষ্ট্য অর্জন করা।


1
দেখে মনে হচ্ছে কোনও বিজ্ঞপ্তি একটি সিগন্যাল তৈরি করে না, যেমন বিজ্ঞপ্তিগুলি dbus-monitor "type='signal',interface='org.freedesktop.Notifications'"প্রদর্শন করে কিছুই দেখায় না dbus-monitor "interface='org.freedesktop.Notifications'"(টাইপটি 'পদ্ধতি_কলে' নয় 'সিগন্যাল')।
jfs

উত্তর:


11

এটি আপ টু ডেট রাখার জন্য: dbus 1.5 থেকে bus.add_match_string_non_blocking। আমরা সমস্ত কিছু পেয়েছি তা নিশ্চিত করার সাথে ম্যাচের স্ট্রিং যুক্ত করার সময় কিছু অতিরিক্ত পরামিতি প্রয়োজন required

ফলাফল কোড নিম্নলিখিত হবে:

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

আমি যদি বিজ্ঞপ্তি ফিল্টারের অভ্যন্তরে অন্য কোনও ডিবিএস পদ্ধতি কল করতে চাই তবে এটি কার্যকর হয় না। আমি সব পেতে unable to connect to session bus: Operation was cancelled। আমরা busফিল্টারটি দিয়ে যাচ্ছি ।
খুরশিদ আলম

1
আমার পাইথন ইনস্টলেশন (পাইথন 3, উবুন্টু) এ আমার from gi.repository import GLib as glibএই কাজটি করা দরকার।
ওয়েন

6

বিজ্ঞপ্তি দ্বারা আপনি বোঝাচ্ছেন "ওএসডি বুদবুদ" যা কিছু সফ্টওয়্যার প্রেরণ করে, যেমন ভলিউম পরিবর্তন করা, আইএম চ্যাট ইত্যাদি? আপনি সেগুলি ধরার জন্য একটি অজগর প্রোগ্রাম তৈরি করতে চান?

ঠিক আছে, জিজ্ঞাসা করুন উবুন্টু কোনও প্রোগ্রামারের কিউএ নয়, এবং সফ্টওয়্যার বিকাশ সুযোগের বাইরে কিছুটা নয়, তবে এখানে একটি ছোট কোড দেওয়া হয়েছে যা আমি নোটিফিকেশন বুদবুদগুলি ক্যাপচার করেছি:

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-এর আগে বা তার আগে কখনও কাজ করবে না। নীচে জুস্টের উত্তর এটি ঠিক করে দেয়।
ক্যাটসকুল

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

আপনি যদি আরও বিশদ কার্যকরী উদাহরণ দেখতে চান তবে আমি সাম্প্রতিক_ বিজ্ঞপ্তি প্রকল্পের নোটিফিকেশন.পি.পি.তে দেখার পরামর্শ দিচ্ছি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.