Как проверить уведомления gnome-shell с помощью Python?

У меня возникли некоторые проблемы с этим:
Я использую Conky в своем дистрибутиве Archlinux и написал быстрый скрипт на python, чтобы проверить, есть ли у меня новая почта в моем gmail. В моем conkyrc этот скрипт выполняется каждые 5 минут и возвращает количество писем (0, если у меня их нет). Работает отлично.

Что я хотел сделать, так это:
Если количество писем> 0, тогда отобразите уведомление (уведомление gnome-shell). Единственная проблема, которая у меня есть сейчас, заключается в том, что если у меня есть непрочитанные письма (например, 4 непрочитанных письма), каждые 5 минут будет появляться НОВОЕ уведомление о том, что у меня есть 4 непрочитанных письма. Что я хотел бы сделать, так это проверить, есть ли уже уведомление, чтобы мне не нужно было отображать его снова... Кто-нибудь знает, как решить такую ​​​​проблему?

Вот мой код:

#!/usr/bin/python

from gi.repository import Notify
from urllib.request import FancyURLopener

url = 'https://%s:%[email protected]/mail/feed/atom' % ("username", "password")

opener = FancyURLopener()
page = opener.open(url)

contents = page.read().decode('utf-8')

ifrom = contents.index('<fullcount>') + 11
ito   = contents.index('</fullcount>')

unread = contents[ifrom:ito]

print(unread)

if unread != "0" :
    Notify.init ("New Mail")
    Hello=Notify.Notification.new ("New mail","You have "+unread+" new mail(s)","/usr/share/icons/Faenza/actions/96/mail-forward.png")
    Hello.show ()

Я должен уточнить, что я совершенно новичок в python. Заранее спасибо, если у кого-то есть решение :)


person Depado    schedule 05.01.2013    source источник


Ответы (1)


Одним из возможных решений является сериализация значения непрочитанного в файл.

Затем измените свою проверку с того, если количество писем больше 0, на если количество писем больше нуля или отличается от последнего сериализованного подсчета из файла.

Расширение этого заключается в том, чтобы также сериализовать время, когда уведомление запускается вместе со счетчиком почты, таким образом, вы расширяете проверку, чтобы показать повторное уведомление (показывая 4 электронных письма дважды, не каждые 5 минут, скажем, а каждые 3 часа).

Таким образом, ваш первоначальный чек был if unread != "0" :, он станет чем-то вроде if unread != "0" && unread != serialisedvalue:. В случае порогового значения времени повторного уведомления показа становится

if unread != "0":
    if ((datetime.now() - serialiseddate) < threshold) :
        if unread != serialisedvalue:

Где threshold = 3600*3 на 3 часа.

Пример кода для сериализации и десериализации приведен ниже.

#Serialising
try:
    # This will create a new file or **overwrite an existing file**.
    f = open("mailcount.txt", "w")
    try:
        f.write(unread + "\n") # Write a string to a file
        f.write(datetime.now().strftime('%b %d %Y %I:%M%p'))
    finally:
        f.close()
except IOError:
    pass

#Deserialising 
try:
    f = open("mailcount.txt", "r")
    try:
        # Read the entire contents of a file at once.
        serialisedvalue = f.readline()
        serialseddate = datetime.strptime(f.readline(), '%b %d %Y %I:%M%p')
    finally:
        f.close()
except IOError:
    pass

Другим возможным решением было бы каким-то образом получить текущий счетчик активных уведомлений и добавить его к вашему условию, хотя я не смог найти способ сделать это с помощью API, который использует Notify.

person Appleman1234    schedule 13.01.2013