虽然Manu G E两次问similar question,但没有得到足够的答案,我希望我能有更好的运气。
我正在写一个AppleScript来在Messages.app收到消息时执行处理程序。该脚本将保存到~/Library/Application\ Scripts/com.apple.iChat
,并在“消息”首选项中设置为AppleScript处理程序。
当Messages是最前面的应用程序并收到消息时,active chat message received
处理程序将被触发两次。当消息在后台时(接收消息然后触发message received
,并且该处理程序只有一次),这似乎不是问题。我知道触发了哪个处理程序,因为处理处理程序的部分如下所示:
using terms from application "Messages"
on message received _msg from _sender for _chat with _text_desc
if DEBUG then display dialog "message received"
message_received(_sender)
end message received
on chat room message received _msg from _sender for _chat with _text_desc
if DEBUG then display dialog "chat room message received"
message_received(_sender)
end chat room message received
on active chat message received _msg from _sender for _chat with _text_desc
if DEBUG then display dialog "active chat message received"
message_received(_sender)
end active chat message received
-- More handlers below, mostly like the above or empty
end using terms from
我将DEBUG
属性设置为true
,可以查看哪个处理程序被触发。
我尝试过写一个临时文件(使用_sender
的UUID)来解决这个问题。 message_received
处理程序检查文件是否存在,如果存在则不应该执行任何操作。但即使随机延迟,这也没有奏效。我尝试延长随机延迟的长度,但这会导致AppleScript运行超过10秒的错误,即使将代码封装在with timeout of
块中也是如此。
尽管Apple明显支持执行AppleScripts以响应Messages事件,但也许我应该考虑一些其他机制来支持来自客户端的请求。我对这些想法持开放态度。
答案 0 :(得分:1)
不知何故,我设法找到了一个简单但非常(非常)脏的黑客,似乎对我有用,但我不能说它是否可以在任何机器上运行。因此,“收到的主动聊天消息”似乎同时被调用了两次,但我注意到do shell script "php -r 'echo microtime() >> file.txt'"
之类的内容有时会显示略有不同的值。
我还使用属性作为标志,并尝试通过写入文件来利用shell执行的小间隔:
echo 0 > ~/Documents/flag.txt
然后:
property flag : 0
using terms from application "Messages"
#...
on active chat message received theMessage from theBuddy
set response to false
set the_script to "cat ~/Documents/flag.txt"
set flag to do shell script the_script
do shell script "echo 1 > ~/Documents/flag.txt"
if flag is "0" then
set response to true
else
do shell script "echo 0 > ~/Documents/flag.txt"
end if
if response then
#this should be executed only once
end if
end active chat message received
#...
end using terms from
瞧瞧。我再也不能说这个解决方案是否每次都有效,并解释为什么它在我的情况下实际工作现在超出了我的能力范围。不过,我希望它会有用。干杯