#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. Большое спасибо!