Gnome3

如何獲取桌面通知?

  • August 22, 2016

我想在其他設備上顯示我的桌面通知(我正在使用 Gnome 3)。所以我想寫一個軟體,在我的電腦上獲取通知並通過網際網路發送。不幸的是,我沒有找到任何好的起點來了解我的程式碼如何獲取通知並對其進行處理。

它有一些API嗎?

好吧,Gnome 通知使用 D-BUS 來傳遞消息。gnome 規範描述瞭如何使用這些類org.freedesktop.Notifications.*並且有很多格式化技巧。一般來說,它是一種 HTML-ish 格式。

但是,您絕對不能遠端與另一台機器上的 D-BUS 通話。我們甚至不要開始討論會打開多少安全漏洞。

儘管如此,您始終可以在目標機器上安裝一個程序,該程序將接收通信並與本地已經存在的 D-BUS 對話。

有兩個選項是包裝器org.freedesktop.Notifications.*,使編寫程序更容易:

  • libnotify: 這幾乎是製作通知的事實上的標準,不僅支持 gnome,還支持其他幾個。
  • notify-sharp-3:聽起來很奇怪,它是一個基於開源 C# 的功能,圍繞著幾個通知規範。在某些時候,它甚至有自己的語言被稱為boo,但它正在逐漸消失libnotify

好,libnotify我們走。

libnotify附帶一個知道如何與通知守護程序對話的二進製文件(是的,這些通知由後台守護程序顯示)。該命令是notify-send,使用起來相當簡單。

notify-send 'Meeting in 5 minutes' 'John from the <b>QA Team</b> just found a bug that should never had happened.  Seriously, we are doing something wrong'

這將顯示通知。然而,使其遠端化有點複雜。假設您知道這bob是目前在機器上執行 Xorg 的使用者,krakatoa並且 krakatoa 已安裝 libnotify 並且正在執行 gnome notify 守護程序,您可以執行以下操作:

ssh bob@krakatoa \
   notify-send 'Meeting in 5 minutes' \
   'John from the <b>QA Team</b> just found a bug that should never had happened.  Seriously, we are doing something wrong'

但是在每台機器上找到每個使用者可能會很棘手。您可以嘗試創建一個腳本來執行ps -afe | grep gnome、查找使用者並執行su -u <user> DISPLAY=:0 notify-send ...。但是話又說回來,您可能不應該ssh像一開始那樣發送請求root

Arch wiki有一個使用多種語言的介面列表libnotify。從那裡您可以創建自己的守護程序,並使用您自己的通知消息通信協議。例如,由於您專門在 gnome 之後,python Gobject可能正好符合要求。

總之:

  • 通知發生在 D-BUS 上;
  • 不能直接遠端訪問 D-BUS;
  • 您可以使用libnotify目標機器上您控制的程序訪問 D-BUS。

參考:

引用自:https://unix.stackexchange.com/questions/304828