analytics-800

こんにちは、吉岡です。

以前、繰り返し実行するAppleScriptアプリをセットする方法についてご紹介しました。GUIのみでセットできるところがミソでした。

今回は、以前投稿したこちらの記事の続き、ということでAppleScriptのモニタリング・オートメーションの方法についてご紹介します。
最近だとヘッドレスwebブラウザを利用した方法がよく紹介されていますが、AppleScriptによる方法は昔ながらのやり方になります。

ご紹介する前に一点注意しなければならない点があります。
スクリプトによるwebブラウザ画面操作は絶対にアクセス側のサイトに負荷をかけるようなアクセスをしてはいけません。その点に最新の注意を払ってください。

下準備

今回利用するScriptEditorをシステム環境設定 > セキュリティとプライバシー > プライバシータブ > アクセシビリティの画面で錠前のアイコンをクリックし、アプリを登録しておく必要があります。
GUIスクリプティングを実施するには、こちらへの登録が必須です。これはスパムアプリにmacの操作を乗っ取られないためのセキュリティ機能になります。

スクリーンショット 2017-02-28 12.35.40

AppleScriptを実行してみる

AppleScriptは、macのアプリを実行して操作することができるスクリプトプログラムです。Automator上にいきなり記載しても良いのですが、ScriptEditorというエディタが用意されていますので、こちらを利用してみましょう。
スクリーンショット 2017-02-28 0.33.05

起動して、新規書類ボタンを押すと、以下のような画面が立ち上がります。

スクリーンショット 2017-02-28 0.32.53

Safariを立ち上げて特定のURLにアクセス

まずはSafariを立ち上げて、特定のURLにアクセスしてみましょう。

tell application "Safari" --この書式でアプリを起動できます。
    -- end tellまでの間に、Safariに実行させる命令を書きます。
    -- アプリを前面にだします。そうしないと実行できない命令があるためです。
    activate
    -- 以下のURLに遷移します。 
    open location "http://www.yahoo.co.jp"
end tell

右向きの▼ボタンを押すとスクリプト実行できます。

スクリーンショット 2017-02-28 0.52.21

ところで、こちらの画面の「AppleScript」の部分がボタンになっていることに気づきましたでしょうか?
こちらを押すと、実はJavaScriptに切り替えられるのです。

スクリーンショット 2017-02-28 0.58.59

こちらはYosemiteから対応しており、JXAとも呼ばれています。

では、上のAppleScriptをJXAで書き換えてみましょう。

// アプリのインスタンス作成
var safari = Application("Safari");

//Safariを前面に出します。
safari.activate();

//ドキュメント取得
var doc = safari.documents;

//URL指定
doc[0].url = "http://www.yahoo.co.jp";

こんな感じになります。AppleScriptの方が直感的に書けますが、JSの方が慣れているという方はJXAで書いても良いかもしれません。
こちらのドキュメントでは、AppleScriptで記載していきます。

次に指定したワードで検索してみよう

スクリプトで「webブラウザを立ち上げ、ページ遷移する」ところまで実行できました。次に、「その画面上で文字列を入力して、ボタンを押す」というスクリプトを書いてみましょう。

-- まずSafariを立ち上げます。
tell application "Safari"
    activate
    open location "http://www.yahoo.co.jp"
end tell

-- キー操作を実行するにはSystem Eventsを立ち上げる必要があります。
tell application "System Events"
    delay 2
    keystroke tab
    delay 2
    keystroke "recruitjobs"
    delay 2
    keystroke return
end tell

AppleScriptのコツですが、実行したメソッドが終了する前に、次のメソッドが実行されてしまうと、期待した処理が走らないということになってしまうので、「delay」を適度に挟むことが重要です。

クリップボードで文字列をコピペする

上の例では文字列の入力をkeystrokeで実行しているのですが、マシンの状態によってこちらに掛かる時間が読めなかったりします。
対策として、文字列をクリップボードに入れておき、『cmd+v』でペーストするというやり方をおすすめします。

-- 予めクリップボードに文字列をセットしておきます。
set the clipboard to "recruitjobs"

tell application "Safari"
    activate
    open location "http://www.yahoo.co.jp"
end tell

tell application "System Events"
    delay 2
    keystroke tab
    delay 2
    --vを押しながらコマンドキーを押す処理は以下のように書けます。直感的ですね。
    keystroke "v" using {command down}
    delay 2
    keystroke return
end tell

同じように検索されたと思いますが、コピペなのですぐに文字列が検索ボックスに入ったと思います。
delayの時間を短くしても良いかもしれませんね。

画面をフルスクリーンにしてボタンの座標でクリックする

上記の例では、タブキーで検索ボックスにフォーカスして実行しましたが、タブキーでのフォーカス移動だとフレキシブルに画面の要素にアクセスできません。

以下の例では、webブラウザをフルスクリーンにした上で、画面上を座標指定し実行するサンプルを示します。この方式が優れているのが、いちいちタブのフォーカス順を調べる必要がない、というところです。

『shift+command+4』で、クリックしたい検索窓の座標とボタンの座標を調べましょう。

  • 検索窓のクリックする位置:(580,230)
  • 検索ボタンのクリックする位置:(1050,230)

では、フルスクリーンにして座標をクリックするように変更したスクリプトを示します。

tell application "Safari"
    activate
    open location "http://www.yahoo.co.jp"
end tell

set the clipboard to "recruitjobs"

tell application "System Events"
    delay 2
    -- activate中アプリの画面(Safari)をフルスクリーンにします。
    keystroke "f" using {command down, control down}
    delay 2
    -- 検索窓をクリック
    click at {580, 230}
    delay 2
    keystroke "v" using {command down}
    delay 2
    -- 検索ボタンをクリック
    click at {1050, 230}
end tell

こちらを実行すると、webブラウザがフルスクリーンになり、座標位置が固定され、画面遷移したと思います。

まとめ

ここまででAppleScriptによるwebブラウザの画面操作の基本を体験できたと思います。
他にも色々なコマンドがあります。
ウィンドウメニュー > ライブラリ を開いてもらうと、各コマンド(Cと記載)や各プロパティ(Pと記載)の解説を見ることができますので、気になった方は調べてみてください。

中編につづく。