在Python中使用PyObjC和ScriptingBridge在Messages中发送消息

时间:2016-10-22 02:49:48

标签: python pyobjc scripting-bridge

这可能是一个简单的问题,但我有点困惑,因为我还没有在网上找到很多例子。

我已经能够使用Javascript(Using this tutorial)通过Mac OS中的消息发送消息,但我无法弄清楚如何使用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});

我无法弄清楚如何使用Python将buddy变量设置为相关对象。以下工作正常访问消息

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对象后使用Messages.send_to_来实现它的实际跳跃。

非常感谢您的帮助,非常感谢!

1 个答案:

答案 0 :(得分: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)

当我尝试使用pyobjc中大部分未记录的ScriptingBridge模块时,我发现非常有用的东西是搜索我试图在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('name')的字符串匹配,但ObjectiveC类名几乎从不大写,因为我没有期待,所以我认为将它们全部小写搜索是有用的。