这可能是一个简单的问题,但我有点困惑,因为我还没有在网上找到很多例子。
我已经能够使用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_
来实现它的实际跳跃。
非常感谢您的帮助,非常感谢!
答案 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类名几乎从不大写,因为我没有期待,所以我认为将它们全部小写搜索是有用的。