انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: دسترسی به همه نوتیف های سیستم در پایتون (حل شد)  (دفعات بازدید: 1895 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین mmoojjttaabbaa

  • Newbie
  • *
  • ارسال: 3
  • جنسیت : پسر
سلام
تو یه پروژه به زبان پایتون نیاز دارم به همه نوتیف های سیستم دسترسی داشته باشم و ببینمشون همنجوری که recent-notifications می بینه و ذخیره می کنه
می خوام ببینم تو پایتون ماژولی هست که بشه ازش استفاده کرد یا نه
اگر پروژه مشابه تو گیت هاب به زبون پایتون می شناسید هم معرفی کنید مرسی
« آخرین ویرایش: 28 تیر 1396، 11:41 ب‌ظ توسط mmoojjttaabbaa »

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
سلام
مطلب اول اینکه اگه بخواین با بش چنین چیزی رو راه اندازی کنین نیازمند کارکردن با dbus-monitor هستین مثلاً برای دسترسی به تمام نوتیفیکیشن های سرویس ها باید دستور پایین رو اجرا کنین :
dbus-monitor ولی شما recent-notifications رو مثال زدین توی این برنامه اعلانات کل سیستم رو به نمایش نمی ذاره فقط اعلانات مربوط به اینترفیس org.freedesktop.Notifications رو تو خروجی نیشون می ده چون توی سورس های اون چنین خط کدی وجود داره :
self._match_string = "type='method_call',interface='org.freedesktop.Notifications',member='Notify'"که معادل بش اون می شه :
dbus-monitor interface='org.freedesktop.Notifications'که خروجی این مورد با خروجی دستور اول متفاوته (دستور اول چون اینترفیسی براش انتخاب نشده تمام اعلانات رو نیشون می ده) مثلاً تو دستور اولیه ما می تونیم تو خروجی چنین مطلبی رو داشته باشیم
"Wi-Fi network connection 'Tplink' active: Tplink (67%)"ولی تو دستور دوم نخواهد بود چون خروجی بالا مربوط به org.freedesktop.DBus.Properties هستش نه org.freedesktop.Notifications
یا مثلاً اعلانات تلگرام تو خروجی دستور دوم نخواهد بود پس خودتون با توجه به نیازتون باید اینترفیستون رو انتخاب کنین ولی چون نرم افزار recent-notifications رو مثال زدین من هم فرض رو بر این می گیرم که اینترفیس موردنظر شما org.freedesktop.Notifications باشه
حالا توی بش اگه بخواین محتوی اضافی رو هم حذف کنین و فقط قسمت string باقی بمونه کافیه دستور پایین رو اجرا کنین (این دستور محتوی بین کوتیشن ها رو توی خروجی به نمایش می ذاره) :
dbus-monitor interface='org.freedesktop.Notifications' | grep -o '".*"'برای چک کردن دستور بالا هم کافیه توی یک ترمینال دیگه این دستور رو اجرا کنین :
notify-send "how are you"باید تو خروجی دستور قبل "how are you" ظاهر شده باشه

حالا در مورد سورس , چه سورسی بهتر از سورس خود recent-notifications :
http://bazaar.launchpad.net/~jconti/recent-notifications/trunk/files

در مورد پایتون , اینجا هم ضروری ترین ماژولی که باید استفاده کنین dbus , glib هستش که باید کار کردن با اونا رو یاد بگیرین برای مثال با یک سرچ تو اینترنت میشه این اسکریپت پایتونی رو پیدا کرد:
#!/usr/bin/python2
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()

در ضمن برای تست کردن اون عینه حالت قبل می تونین از دستور پایین استفاده کنین :
notify-send "how are you"این رو اضافه کنم برای ذخیره کردن خروجی توی یک فایل فقط کافیه خروجی اون رو ری دایرکت کنین :
python2 yourscript >> yourfileبعد بستن اسکریپت (هر موقع خواستین مثلا با کنترل c) خروجی اسکریپت به فایل اضافه می شه
در ضمن می شد به جای ری دایرکت کردن از امکانات خود پایتون هم استفاده کرد
« آخرین ویرایش: 28 تیر 1396، 02:59 ق‌ظ توسط ali76 »

آفلاین mmoojjttaabbaa

  • Newbie
  • *
  • ارسال: 3
  • جنسیت : پسر
سلام
مطلب اول اینکه اگه بخواین با بش چنین چیزی رو راه اندازی کنین نیازمند کارکردن با dbus-monitor هستین مثلاً برای دسترسی به تمام نوتیفیکیشن های سرویس ها باید دستور پایین رو اجرا کنین :
dbus-monitor ولی شما recent-notifications رو مثال زدین توی این برنامه اعلانات کل سیستم رو به نمایش نمی ذاره فقط اعلانات مربوط به اینترفیس org.freedesktop.Notifications رو تو خروجی نیشون می ده چون توی سورس های اون چنین خط کدی وجود داره :
self._match_string = "type='method_call',interface='org.freedesktop.Notifications',member='Notify'"که معادل بش اون می شه :
dbus-monitor interface='org.freedesktop.Notifications'که خروجی این مورد با خروجی دستور اول متفاوته (دستور اول چون اینترفیسی براش انتخاب نشده تمام اعلانات رو نیشون می ده) مثلاً تو دستور اولیه ما می تونیم تو خروجی چنین مطلبی رو داشته باشیم
"Wi-Fi network connection 'Tplink' active: Tplink (67%)"ولی تو دستور دوم نخواهد بود چون خروجی بالا مربوط به org.freedesktop.DBus.Properties هستش نه org.freedesktop.Notifications
یا مثلاً اعلانات تلگرام تو خروجی دستور دوم نخواهد بود پس خودتون با توجه به نیازتون باید اینترفیستون رو انتخاب کنین ولی چون نرم افزار recent-notifications رو مثال زدین من هم فرض رو بر این می گیرم که اینترفیس موردنظر شما org.freedesktop.Notifications باشه
حالا توی بش اگه بخواین محتوی اضافی رو هم حذف کنین و فقط قسمت string باقی بمونه کافیه دستور پایین رو اجرا کنین (این دستور محتوی بین کوتیشن ها رو توی خروجی به نمایش می ذاره) :
dbus-monitor interface='org.freedesktop.Notifications' | grep -o '".*"'برای چک کردن دستور بالا هم کافیه توی یک ترمینال دیگه این دستور رو اجرا کنین :
notify-send "how are you"باید تو خروجی دستور قبل "how are you" ظاهر شده باشه

حالا در مورد سورس , چه سورسی بهتر از سورس خود recent-notifications :
http://bazaar.launchpad.net/~jconti/recent-notifications/trunk/files

در مورد پایتون , اینجا هم ضروری ترین ماژولی که باید استفاده کنین dbus , glib هستش که باید کار کردن با اونا رو یاد بگیرین برای مثال با یک سرچ تو اینترنت میشه این اسکریپت پایتونی رو پیدا کرد:
#!/usr/bin/python2
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()

در ضمن برای تست کردن اون عینه حالت قبل می تونین از دستور پایین استفاده کنین :
notify-send "how are you"این رو اضافه کنم برای ذخیره کردن خروجی توی یک فایل فقط کافیه خروجی اون رو ری دایرکت کنین :
python2 yourscript >> yourfileبعد بستن اسکریپت (هر موقع خواستین مثلا با کنترل c) خروجی اسکریپت به فایل اضافه می شه
در ضمن می شد به جای ری دایرکت کردن از امکانات خود پایتون هم استفاده کرد

خیلی زحمت کشیدید ممنونم کامل و جامع بود :)
فقط ماژول glib ظاهرا تو پایتون 3.x دیگه نیست سرچ کردم چندتا پکیج دیگه معرفی کرده بودن که اگر نصب کنیم این ماژول هم بینشون هست نصب کردم ولی موقع اجرا اسکریپت خطای نبودن ماژول همچنان برقراره
تا موقع ارسال این پست هم موفق نشدم پیدا کنم
اگر اطلاعی دارید و زحمتی نیستی ممنون میشم راهنمایی کنید

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
مجتبی جان برای پایتون 3 من کدها رو از پایتون 2 به 3 تبدیل کردم :
#!/usr/bin/python3
import dbus
from gi.repository import GLib
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()

آفلاین سلمان م.

  • ناظر انجمن
  • *
  • ارسال: 4106
  • جنسیت : پسر
  • GNU Operating System - سیستم عامل گنو
برای دریافت فایل از روی لانچپد (launchpad) هم باید bazaar رو نصب کنی:

$ sudo apt install bzr
و سپس دستور زیر رو توی ترمینال بزن:
$ bzr clone lp:~jconti/recent-notifications/trunk

آفلاین mmoojjttaabbaa

  • Newbie
  • *
  • ارسال: 3
  • جنسیت : پسر
مجتبی جان برای پایتون 3 من کدها رو از پایتون 2 به 3 تبدیل کردم :
#!/usr/bin/python3
import dbus
from gi.repository import GLib
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()

خیلی خیلی ممنونم کامل اون چیزی که می خواستم رو پاسخ دادید  :)



اقا سلمان از شما هم ممنونم مرسی


آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
خوشحالم که مشکلتون حل شد
موفق باشین ...