web-dev-qa-db-fra.com

Notification Python post osx

En utilisant python, je souhaite envoyer un message au Centre de notifications OSX . Quelle bibliothèque dois-je utiliser? devrais-je écrire un programme dans Objective-C, puis appeler ce programme depuis python? 


mettre à jour

Comment accéder aux fonctionnalités du centre de notifications pour 10.9 telles que les boutons et le champ de texte?

35
kyle k

Vous devez installer terminal-notifier first avec Ruby par exemple:

$ [Sudo] gem install terminal-notifier

Et puis vous pouvez utiliser ce code:

import os

# The notifier function
def notify(title, subtitle, message):
    t = '-title {!r}'.format(title)
    s = '-subtitle {!r}'.format(subtitle)
    m = '-message {!r}'.format(message)
    os.system('terminal-notifier {}'.format(' '.join([m, t, s])))

# Calling the function
notify(title    = 'A Real Notification',
       subtitle = 'with python',
       message  = 'Hello, this is me, notifying you!')

Et voilà:

enter image description here

50
Peter Varo

Toutes les autres réponses ici nécessitent des bibliothèques tierces; celui-ci ne nécessite rien. Il utilise simplement un script Apple pour créer la notification:

import os

def notify(title, text):
    os.system("""
              osascript -e 'display notification "{}" with title "{}"'
              """.format(text, title))

notify("Title", "Heres an alert")

Notez que cet exemple n'échappe pas aux guillemets, aux guillemets doubles ni aux autres caractères spéciaux. Ces caractères ne fonctionneront donc pas correctement dans le texte ou le titre de la notification.

59
Christopher Shroba

copie de: https://Gist.github.com/baliw/4020619

ce qui suit fonctionne pour moi.

import Foundation
import objc
import AppKit
import sys

NSUserNotification = objc.lookUpClass('NSUserNotification')
NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')

def notify(title, subtitle, info_text, delay=0, sound=False, userInfo={}):
    notification = NSUserNotification.alloc().init()
    notification.setTitle_(title)
    notification.setSubtitle_(subtitle)
    notification.setInformativeText_(info_text)
    notification.setUserInfo_(userInfo)
    if sound:
        notification.setSoundName_("NSUserNotificationDefaultSoundName")
    notification.setDeliveryDate_(Foundation.NSDate.dateWithTimeInterval_sinceDate_(delay, Foundation.NSDate.date()))
    NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)


notify("Test message", "Subtitle", "This message should appear instantly, with a sound", sound=True)
sys.stdout.write("Notification sent...\n")
15
sesame

Pour une implémentation en Python uniquement, j'ai modifié le code qu'une personne a posté dans le cadre d'une autre question connexe et cela fonctionne bien pour moi:

import mmap, os, re, sys
from PyObjCTools import AppHelper
import Foundation
import objc
import AppKit
import time
from threading import Timer

from datetime import datetime, date

# objc.setVerbose(1)

class MountainLionNotification(Foundation.NSObject):
    # Based on http://stackoverflow.com/questions/12202983/working-with-mountain-lions-notification-center-using-pyobjc

    def init(self):
        self = super(MountainLionNotification, self).init()
        if self is None: return None

        # Get objc references to the classes we need.
        self.NSUserNotification = objc.lookUpClass('NSUserNotification')
        self.NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')

        return self

    def clearNotifications(self):
        """Clear any displayed alerts we have posted. Requires Mavericks."""

        NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
        NSUserNotificationCenter.defaultUserNotificationCenter().removeAllDeliveredNotifications()

    def notify(self, title, subtitle, text, url):
        """Create a user notification and display it."""

        notification = self.NSUserNotification.alloc().init()
        notification.setTitle_(str(title))
        notification.setSubtitle_(str(subtitle))
        notification.setInformativeText_(str(text))
        notification.setSoundName_("NSUserNotificationDefaultSoundName")
        notification.setHasActionButton_(True)
        notification.setActionButtonTitle_("View")
        notification.setUserInfo_({"action":"open_url", "value":url})

        self.NSUserNotificationCenter.defaultUserNotificationCenter().setDelegate_(self)
        self.NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)

        # Note that the notification center saves a *copy* of our object.
        return notification

    # We'll get this if the user clicked on the notification.
    def userNotificationCenter_didActivateNotification_(self, center, notification):
        """Handler a user clicking on one of our posted notifications."""

        userInfo = notification.userInfo()
        if userInfo["action"] == "open_url":
            import subprocess
            # Open the log file with TextEdit.
            subprocess.Popen(['open', "-e", userInfo["value"]])

Vous pourriez probablement nettoyer les instructions d'importation pour supprimer certaines importations inutiles.

9
Simon

Essayez ntfy si vous souhaitez également que le script puisse communiquer avec vous via d'autres périphériques.

Installation

[Sudo] pip install ntfy 

pip fait référence au programme d'installation du package de la version cible de Python

Pour l'installation de Python3:

[Sudo] pip3 install ntfy    

Usage

J'utilise cette fonction simple pour les notifications concernant l'exécution de commandes et la fin du téléchargement:

def notification(title, message):
    """Notifies the logged in user about the download completion."""

    import os
    cmd = 'ntfy -t {0} send {1}'.format(title, message)
    os.system(cmd)

notification("Download Complete", "Mr.RobotS01E05.mkv saved at /path")

Avantages de ntfy

  1. Cet outil est très pratique car il enregistre toutes les notifications directement dans le centre de notification plutôt que de faire référence à une autre application tierce.

  2. Prise en charge de plusieurs supports: Cet outil peut se connecter à tout appareil via des services tels que PushBullet, SimplePush, Slack, Telegram, etc. Consultez la liste complète des services backend pris en charge ici .

2
Kshitij Saraogi

Voici un moyen (vous avez besoin du module Fondation):

from Foundation import NSUserNotification
from Foundation import NSUserNotificationCenter
from Foundation import NSUserNotificationDefaultSoundName


class Notification():
    def notify(self, _title, _message, _sound = False):
        self._title = _title
        self._message = _message
        self._sound = _sound

        self.notification = NSUserNotification.alloc().init()
        self.notification.setTitle_(self._title)
        self.notification.setInformativeText_(self._message)
        if self._sound == True:
            self.notification.setSoundName_(NSUserNotificationDefaultSoundName)

        center = NSUserNotificationCenter.defaultUserNotificationCenter()
        center.deliverNotification_(self.notification)

N = Notification()
N.notify(_title="SOME", _message="Something", _sound=True)

Cela ne fonctionne que pour MAC. Espérons que vous apprécierez!

1
Xilpex