定期的に再読みしてスクショを撮るAppleScript


少し暑くなってきて朝方のイングレス活動(通称イン活)が気持ち良くなってきたのですが、イン活用に使い始めたグーグルプラスを眺めていると、コントロールフィールド構築の時間経過をアニメーション GIF にして投稿している人がいて、帰宅後に慌ててインテルマップのスクリーンショットを撮るよりは効果的だろうと思い、その方法を考えました。

まず参考にした Reddit のコメントから、ブラウザのエクステンションと言われる機能拡張で定期的な再読み込みをしながら、i=1;while [1];do screencapture ~/Desktop/$i.png;let i++;sleep 30;done のようなシェルスクリプトを実行させる方法を試してみたのですが、省エネルギー設定の画面スリープにより期待通りに撮影できていなかったり、最後にプロセスをプロンプトから終了するのが面倒だったので、これらの問題をまとめて AppleScript のアプリケーションにしたコードがこちらになります。

property NOW : 0
property INTVAL_CAP : 55
property INTVAL_RELOAD : 3300
property FILENUM : 0
property thePath : ""
property thePID : ""
on run
	set thePath to (choose folder name with prompt "Where would you like to save your file?")
	do shell script "caffeinate -di &>/dev/null &"
	set thePID to (do shell script "ps ax | grep caffeinate | grep -v grep | awk '{print $1}'")
end run
on idle
	set FILENUM to FILENUM + 1
	do shell script "screencapture -mx -T1 " & quoted form of (POSIX path of thePath & FILENUM & ".png")
	if NOW mod INTVAL_RELOAD = 0 and NOW is not 0 then
		tell application "/Applications/Google Chrome.app"
			reload active tab of window 1
		end tell
	end if
	set NOW to NOW + INTVAL_CAP
	return INTVAL_CAP
end idle
on quit
	if thePID is not "" then do shell script ("kill -9 " & thePID)
	continue quit
end quit

インテルマップの表示には Google Chrome ブラウザを使い、撮影箇所を全画面で表示してから右上の Link アイコンを押して恒久リンクをアドレスバーにコピペして再度読み込んでおきます(この辺りも自動化したいところ)。その後、このアプリケーションを起動すると画像の保存先を尋ねられるので適当にデスクトップにフォルダを作るなりしてインテルマップを表示しておくと5分毎に再読み込みし、30秒毎にスクリーンショットを撮影し連番を付けた PNG 画像を先に指定したフォルダへ保存していきます。

帰宅後はこのアプリケーションを終了すると省エネルギー設定も元通りになります。省エネルギー設定を無効にする caffeinate コマンドは Mountain Lion 以降となりますので、このアプリケーションの動作条件もこれに沿うことになります。また、出かける前には画面の光度を低くして行くといいかもしれません。

連番の PNG ファイルから動きの無いものは削除し(ここが手作業なのは少し厄介笑)プレビューアプリを使ってアニメーション GIF にするとこうなります。

最後に、このスクリプトを Automator で使うにはイベントハンドラを一度だけ実行し終了してしまうので上手くいきません。ですので、スクリプトエディタにコピペして保存する際には、次のようにフォーマットを「アプリケーション」とし「ハンドラの実行後に終了しない」オプションを有効にしてください。更に、再読み込みの時間が短すぎるとアカウント停止になる可能性もあるのでご注意ください。

スクリーンショット 2015-05-13 12.28.45

近年流行りのクラウドソーシングでも定期的に画面のスクショを撮る時給計算アプリを起動して作業する必要があったり、何かと応用ができそうな気もします。アニメーション GIF の作成手順については次の投稿にしたいと思います。

更新(5/22):
先の公開時のリロード時間で数回試したところ、特にプレイ時間が1時間を超えるような場合に次のような “Oops! Something went wrong..” というエラーが表示され復旧まで半日を要することが起きました。コードを読むと60分で “Human presence not detected.” を表示し、1分で再描画しているようでしたので、再読みとスクリーン撮影の時間間隔の設定を長くするように変更しました。
スクリーンショット 2015-05-20 14.23.55

同一IPで且つ、等間隔の再読み込みでボット判定されていそうなので、INTVAL_RELOAD を3000〜3300くらいの間で乱数にすることも検討する必要がありそうです。

数回このエラーを経験した後に下記にリンクしたヘルプページを参照し、右上にある「お問い合わせ」から問題の内容を送信すると「公式のツール以外使うなよ、コノヤロー!」という趣旨の自動送信メールが返ってきて復旧しました。どうぞお気をつけください。

参照: