Отправка сообщения в сообщениях с помощью PyObjC и ScriptingBridge на Python

#python #pyobjc #scripting-bridge

#python #pyobjc #создание сценариев-мост

Вопрос:

вероятно, это простой вопрос, но я немного смущен, поскольку я не нашел много примеров в Интернете.

Я смог отправлять сообщения через Messages в Mac OS, используя Javascript (используя это руководство), но я не могу понять, как это сделать, используя Python и PyObjC.

Используя Javascript, я бы сделал что-то вроде этого:

 var messages = Application('Messages');
var buddy = messages.services["E:%REPLACE_WITH_YOUR_IMESSAGE_EMAIL%"].buddies["%REPLACE_WITH_BUDDYS_EMAIL%"];
messages.send("JavaScript sent this message!", {to: buddy});
  

Я не могу понять, как установить buddy переменную в соответствующий объект с помощью Python. Для доступа к сообщениям отлично работает следующее

 from Foundation import *
from ScriptingBridge import *
Messages = SBApplication.applicationWithBundleIdentifier_("com.apple.iChat")
  

Затем в Python я могу сделать что-то вроде этого.

 In [182]: s = Messages.services()
In [183]: [x.name() for x in s]
Out[183]: ['E:foo@icloud.com', 'Bonjour', 'SMS']
  

Но я не уверен, как перейти от этого к фактической отправке сообщения с помощью Messages.send_to_ после создания объекта Messages.

Ваша помощь была бы высоко оценена, большое вам спасибо!

Ответ №1:

Вы можете сделать это следующим образом:

 from ScriptingBridge import SBApplication

Messages = SBApplication.applicationWithBundleIdentifier_("com.apple.iChat")

# get the first budddy who's name is Chris Cummings
buddy_to_message = [b for b in Messages.buddies() if b.fullName() == "Chris Cummings"][0]

# send text to buddy
Messages.send_to_("sending this from python test", buddy_to_message)
  

Что я нашел действительно полезным при попытке использовать в значительной степени недокументированный модуль ScriptingBridge из pyobjc, так это поиск методов, доступных в классе, к которому я пытаюсь получить доступ в repl

 >>>[method for method in dir(Messages) if "bud" in method.lower()]
["buddies", "buddies"]  # found the buddies method
>>>[method for method in dir(Meessages.buddies()[0]) if "name" in method.lower()]
[ ... 'accessibilityParameterizedAttributeNames', 'className',
'elementWithCode_named_', 'entityName', 'firstName', 'fullName',
'fullName', 'lastName', 'name', 'name', 'scriptAccountLegacyName',
'valueWithName_inPropertyWithKey_']

# ... this one had a bunch of other junk but hopefully this illustrates the idea
  

Дополнительное замечание о dir:
Конечно, dir() также можно принимать аргументы, и вы можете получить список методов, определенных для объекта, которые соответствуют строке с dir('name') , но имена классов ObjectiveC почти никогда не пишутся заглавными буквами, как я ожидал, поэтому я думаю, что полезно искать их все в нижнем регистре.

Комментарии:

1. Большое спасибо!