from subprocess import Popen, PIPE from sbapp.plyer.facades import Sms as SMS from sbapp.plyer.utils import whereis_exe class MacOSSMS(SMS): ''' Implementation of macOS' Messages API ''' def _send(self, **kwargs): ''' Will send `message` to `recipient` via Messages app By default, if `mode` is not explicitly set, `iMessage` is used. In order to use `SMS` mode, a valid carrier-activated device must be connected and configured. ''' recipient = kwargs.get('recipient') message = kwargs.get('message') mode = kwargs.get('mode') # Supported modes: iMessage (default), SMS if not mode: mode = 'iMessage' APPLESCRIPT = f"""tell application "Messages" set targetService to 1st account whose service type = {mode} set targetBuddy to participant "{recipient}" of targetService send "{message}" to targetBuddy end tell""" osascript_process = Popen( ['osascript', '-e', APPLESCRIPT], stdout=PIPE, stderr=PIPE) stdout, stderr = osascript_process.communicate() def instance(): import sys if whereis_exe('osascript'): return MacOSSMS() sys.stderr.write('osascript not found.') return SMS()