AppleScriptを使ってMacに通知を出そう

AppleScript

いいね

こんにちは。

エンジニアの藤巻です。


今回はMacユーザーの方向けに、システムから通知を表示する方法を紹介したいと思います。

Webサイトのpush通知を受け取っていたり、カレンダーに予定を入れていると開始30分前とかに画面の右上にポップアップが出てきますよね?あれを出してみたいと思います。

AppleScript

今回通知を出すためにAppleScriptというMac用のスクリプトを使います。

どんなことができるのか見てみるために、試しにMacのターミナルで以下を実行してみましょう。


$ osascript -e 'activate application "Google Chrome"'


もしGoogle Chromeを起動していたら、Google Chromeが最前面に表示されたたのではないでしょうか。

シングルクオートで囲まれた activate application "Google Chrome" がAppleScriptで記述されたスクリプトで、osascriptというコマンドはAppleScriptを実行するためのコマンドになります。

この例では activate という「Google Chromeを起動し、windowを最前面に表示する」という命令を実行しています。


このようにAppleScriptを使うと、Mac上の操作をスクリプトで実行できるのです。

そして通知を出すのも以下のコマンドで簡単にできるのです。


$ osascript -e 'display notification "こんにちは" with title "通知が出てますよ!!"'


きっと画面に通知が表示されたと思います。

さすがにこれだけだとつまらないので、さらに活用できる方法を探ってみたいと思います。

PHPからAppleScriptを実行

AppleScriptで通知を出せることはわかったので、今度はPHPでAppleScriptを実行し、通知を出してみたいと思います。

といっても、PHPには外部コマンドを実行するexec関数があるので、この関数でAppleScriptを実行するだけです。


<?php
exec("osascript -e 'display notification \"こんにちは\" with title \"通知が出てますよ!!\"'");


今度は東京の天気をAPIで取得し、通知を出してみましょう。

今回はこちらのlivedoorが提供しているWeather HacksのAPIを使って天気を取得してみたいと思います。

Weather Hacks


きっとコードはこんな感じ


<?php
$ch = curl_init('http://weather.livedoor.com/forecast/webservice/json/v1?city=130010');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response, true);


$title = $response['title'];
$body = "最低気温 : {$response['forecasts'][0]['temperature']['min']['celsius']}℃ ";
$body .= PHP_EOL;
$body .= "最高気温 : {$response['forecasts'][0]['temperature']['max']['celsius']}℃ ";
exec("osascript -e 'display notification \"{$body}\" with title \"{$title}\"'");


このコードを weather_notice.phpというファイル名で保存し、以下のコマンドで実行すると東京の天気が通知されました!


$ php weather_notice.php



PHPを活用することで通知する内容の自由度が増してきましたね!

ただこのままでは天気を知りたいと思うたびにこのプログラムを実行しなくてはなりません。

どうせなら朝起きたときや、会社から帰るタイミングで自動でこの通知が出てほしいですよね?

ということで最後にこのプログラムを定期実行させてみたいと思います。

cronを使った定期実行

プログラムを定期実行する方法の一つにcronを用いた方法があります。

MacやLinuxなどのUnix系OSではcrondというデーモンプロセスが常駐しているので、実行したいタイミングと、実行したいプログラムをcrontabというファイルに登録しておくと勝手に実行してくれます。

crontabの書式は以下となり、左から「分」「時」「日」「月」「曜日」を表します。


* * * * * [実行コマンド]


今回は先程のPHPプログラムを朝8時と、夜7時に実行したいので crontab -e コマンドでcrontab編集画面を表示し、以下のように記述します。


0 8,19 * * * php /path/to/weather_notice.php


内容がちゃんと保存されているかは crontab -l コマンドで確認できます。

もし指定の時間になっても正しく動作しない場合には、 /var/mail/[ユーザー名] というファイルにログが書き出してあるので確認してみましょう。

まとめ

今回はMacユーザーの方向けに、AppleScript, PHP, cronを使って通知を出す方法を紹介しました。

ちなみに弊社では勤怠管理のサービスを活用しており、そのサービスがAPIを提供しているので、

私は始業10分前にAPIを叩いて出勤の打刻状況を取得し、打刻されていなければ通知を出すように設定しています。

毎日決まった作業がある方は試してみてください!



アカウント登録をするとコメントを書くことができます

中西 健(2018-11-06 13:13)

AppleScript便利ですよね。
私はChromeをリロードするスクリプト作って、エディタから呼び出してます。
ウィンドウを切り替える必要がなくて楽でおすすめですよ。

---------- 以下スクリプト ----------
#!/usr/bin/osascript

tell application "Chrome" to tell the active tab of its first window
reload
end tell

藤巻 亮介(2018-11-15 07:58)

エディタから呼び出せると便利ですね!
JavaScriptでも記述できて、こっちのほうが馴染みあるのでこちらで活用させていただきます!!

---------- 以下スクリプト ----------
#!/usr/bin/osascript -l JavaScript

var chrome = Application("Chrome");
chrome.windows[0].activeTab().reload();


採用検索 - 詳細条件の設定