前提知識
- MacではOSX 10.1.2からOpen Scripting Architecture準拠のAppleScriptの実行をサポートしている
- OSX 10.10 YosemiteからJavaScriptもサポートされた
-
/usr/bin/osascript
にAppleScriptを渡すとGUIの操作(GUIスクリプティング)をシェルスクリプトから行うことができる- ただし、10.8までは システム環境設定 >> アクセシビリティ >>「補助装置にアクセスできるようにする」 をオンにする必要がある
- 10.9からはセキュリティ管理の仕組みがかわり、 システム環境設定 >> セキュリティとプライバシー >> プライバシー >> アクセシビリティ で、GUIスクリプティングを実行するアプリケーションごとにアクセシビリティを有効にする必要がある
ハマったこと
Yosemiteをクリーンインストールしたあとに走らせると、xcode-select --install
を実行してそのウィザードのクリックも自動でやってくれるrebuildというgemを作った。
めちゃくちゃハマって何時間も無駄にしたので、私がハマった点を共有したい。
そもそも何かけばいいのかわからない
Automator.appでワークフローを作成し、「AppleScriptを実行」を追加して、そこに「記録」で作ったフローをドラッグアンドドロップすると任意の操作を再現するAppleScriptが作られる。
なお、Script Editor.appの記録機能ではFinderの操作くらいしか記録してくれない。
*.scpt is not allowed assistive access. というエラーが出る
これはAppleScriptを実行するアプリケーションがアクセシビリティを有効にされてないと出る。
アクセシビリティを管理するデータは/Library/Application Support/com.apple.TCC/TCC.db
というsqliteのDBのaccessというテーブルに入っている。
スキーマは、
0|service|TEXT|1||1
1|client|TEXT|1||2
2|client_type|INTEGER|1||0
3|allowed|INTEGER|1||0
4|prompt_count|INTEGER|1||0
5|csreq|BLOB|0||0
となっていて、例えばTerminal.appからAppleScriptを走らせたい場合は service="kTCCServiceAccessibility", client="com.apple.Terminal", client_type=0, allowed=1
にする必要がある。
つまり、以下のようなコマンドをAppleScriptの実行前に仕込めば良い。
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
"INSERT OR REPLACE INTO access VALUES('kTCCServiceAccessibility','com.apple.Terminal',0,1,0,NULL);"
なお、clientにいれるアプリケーションのbundle identifierはcodesign -dv ***.app
とやれば見れる。
An error of type -10810 has occurred. というエラーが出る
これは場合による。
私が遭遇したケースでは、*.scpt
にshebangつけてchmod +x
していたせいで動かなくなっていて、chmod -x
で実行可能属性を外したら(明示的にosascriptに渡していたので実行属性いらなかった)、うまく走るようになった。