【Mac】キーチェーンのPW入力とGlobalProtectのサインインを自動でやってもらおう

# いきさつ
会社から貸与されているMacBook Proは，インターネットに接続するために必ずVPN（GlobalProtect）で自社のネットワークを経由しないといけないんですが，GlobalProtectの使い勝手があまり良くなくて，1回のVPN接続でGlobalProtect自体のサインインの他にキーチェーンのパスワードを3~4回も入力させられます（下図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507842/3ffd77a3-2fdd-8e60-48e5-aee779797a9c.png)
おまけにGlobalProtectのサインイン（下図）の方も，パスワード入力欄でキーボードが効かないため別のところに入力した文字列をコピペしないという惨憺たる状況。
パスワードを記憶して自動入力してくれそうな雰囲気もありますが，まったくもって見掛け倒しです。
![GPsingin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507842/5f7db1a5-2c4f-c0b6-6612-25347378da3a.jpeg)
こんな作業を最低でも1日1回，更に途中でVPN接続が切れたらその都度同じことをしなければならないのは控えめに言って苦行です。このままではキーボードクラッシャーになるのも時間の問題だと思い，何か解決策はないかと模索していたところ，この記事に出会いました。

[[Automator] [AppleScript] [VPN] GlobalProtectの自動ログイン - Qiita](https://qiita.com/4q_sano/items/92041648863e732224f1)

Mac歴2年にしてAppleScriptなるものを初めて知ったんですが，なんかちょちょっとコード書けばMac上の作業が自動化できるっぽいぞと。あやうくVPNを回避する方向に走りかけていたのを踏みとどまり，画面操作の自動化へと舵を切り替え今に至ります。

# 何をしたのか
GIFが10MBに収まるよう編集で削っているので実際より多少スピード感が増していますが，まずはこちらをご覧ください。
![GPAuto2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507842/a3184182-9c5e-49c1-04ee-4a300bdb6316.gif)
上で紹介した記事では，一度サインインをしたらプログラムが終了していましたが，こちらは常駐型のアプリになります。起動したらまず待機状態になりまして，キーチェーンのパスワード要求やGlobalProtectのサインインの画面が表示されたらユーザ名とパスワードを入力してボタンを押し，また待機状態に戻るという仕様になっています。

これにより，VPN接続が切れて再度キーチェーンのPWやらGlobalProtectのサインインやらを要求されてもアプリケーションが感知し，すかさず対応してくれるようになります。私はそれをぼーっと眺めているだけで良いのです。大地主の跡取り息子のような気持ちになれます。

# コード
たったの26行です。こんな短いコードでここ数ヶ月味わい続けた苦しみから解放されると思うと，AppleScript，だいぶ偉大ですね。

```AppleScript
on idle
	tell application "System Events"
		if exists window 1 of process "SecurityAgent" then
			tell process "SecurityAgent"
				tell window 1
					set value of text field "ユーザ名:" to "*****"
					delay 0.5
					set value of text field "パスワード:" to "*****"
					delay 0.5
					click button "許可"
				end tell
			end tell
		else if exists text field 1 of window 1 of application process "GlobalProtect" then
			tell process "GlobalProtect"
				tell window 1
					set value of text field 1 to "*****"
					delay 0.5
					set value of text field 2 to "*****"
					delay 0.5
					click button "サインイン"
				end tell
			end tell
		end if
	end tell
	return 2
end idle
```
多少アルゴリズム的な部分の説明をすると，まず`on idle`で2秒おきに条件判定をしています。

条件は「**キーチェーンのPW要求画面が開いているか**（`process "SecurityAgent"`の`window 1`が存在するか）」，または「**GlobalProtectのサインイン画面が開いているか**（`process "GlobalProtect"`の`window 1`の`text filed 1`が存在するか）」です。

後者の判定式に`text filed 1`も含めているのは，`window 1`だけだと接続完了のウィンドウなどにも反応してしまうためです。

テキストフィールドに文字を入力した後の`delay`は，なんというか，気持ちです。なくても大丈夫だろうとは思いますが，一応ちょっとは待った方がエラーが起きなさそうなので。

# 諸注意
## アクセシビリティ
`System Events`のプロセスを操作するにあたって，システム環境設定の「セキュリティとプライバシー」＞「プライバシー」＞「アクセシビリティ」でアプリケーションにコンピュータの制御を許可する必要があります。

そこは特に問題ないと思いますが，「アクセシビリティ」でチェックを付けた後でAppleScriptのソースをいじると，アプリケーション起動時に「**補助アクセスは許可されません**」というエラーが出てしまうようです。確実かどうかはわかりませんが，少なくとも私の場合はそうでした。

その場合は，`sudo tccutil reset Accessibility`で「アクセシビリティ」の設定を一度リセットし，再度アプリケーションにコンピュータの制御を許可してやると治るっぽいです。確実かどうかはわかりませんが，少なくとも私の場合（ry）

## ご利用は計画的に
今回作成したアプリケーションは，キーチェーンのPW要求画面が出てきたら自動で入力するという，わりかし威力の高い機能を持っています。私の場合は家でしか使わない社用PCなのでアレですが，持ち運ぶ頻度の高いPCに入れる際は悪用されるリスクも考慮した方がいいかもしれないということを一応お伝えさせていただきます。

# おわりに
今回，AppleScriptなるものがあるということを知ってから，わずか2日で目的のプログラムが完成しました。

Apple以外のデバイスで使えないという制約はありますが，学習コストも低く（「参考」に載せたサイトがとてもわかりやすくて助かりました），かなり使い勝手の良い言語だと思います。

みなさんも単純作業の繰り返しに疲れてキーボードを壊しそうになったら，是非AppleScriptを試してみてください。

最後までご覧いただきありがとうございました。

# 参考
[鳶嶋工房 / AppleScript / 入門(Introduction)](http://tonbi.jp/AppleScript/Introduction/)