IFTTTにGoogle Apps Scriptを混ぜたらヤバい化学反応が起こった件
はじめに
2010年12月に彗星のごとく現れたWebサービス同士のマッシュアップサービスIFTTT。
「if (this) then (that)」と言うシンプル極まる構文で手軽にWebサービスが連携出来るのが特徴です。
IFTTTは様々なWebサービスをサポートしており、ちょっと挙げるだけでもTwitter、Evernote、Google Drive、Skypeなどの有名どころから、ナニコレ?ってものまで実に多彩です。
加えて、IFTTT独自のサービス群も魅力的です。
スマホ通知、Alexa・Google Homeの音声入力、スマホのウィジェット(メモ、ボタン、写真)など。
それらを前述のシンプルな構文で自由に組み合わせられるのが、IFTTTの魅力だと思います。
IFTTTの弱点
シンプルさが売りのIFTTTなのですが、それがそのまま弱点にもなっているという印象です。
例えば「為替の情報を1時間に1回Pushbulletに通知したい」と言う比較的シンプルな要求はIFTTTでは実現できません。
為替の情報は「if (this) then (that)」のthisにFinanceサービスを指定すれば取得できますが、Financeサービスは「1時間に1回為替情報を報告する」と言うトリガーを持っていないからです。(1日1回トリガーはある。)
こんな感じで、イベントが発生するタイミングはthisのサービスに依存しており、ユーザーが自由に制御できません。
IFTTTではスマホのウィジェットや各種スマートスピーカーを使って手動でトリガを掛けることもできますが、それ自身がthisを消費してしまうので、例えば下の様なアプレットは実現できません。
ボタンが押されたら(this) 明日の天気を(×指定不可) SMSに送信する(that)
シンプルさの引き換えに、少しでも凝ったアプレットは実現できない。これでは魅力が半減です。
IFTTTの弱点を克服する
そんな「なんでもは出来ないわ。出来ることだけ。」のIFTTTですが、その中に「Webhooks」と言う興味深いサービスがあります。
「Webhooks」はWebhookを送受信するサービスです。
と、言うことでIFTTTがサポートする以外の何かと連携が可能です。
これを上手く使えば、
為替の情報を1時間に1回Webhookする外部サービス -> Webhookを受信したら(this) Pushbulletに通知する(that)
や
ボタンが押されたら(this) Webhookを送信する(that) -> Webhookを受けて明日の天気をWebhookする外部サービス -> Webhookを受信したら(this) SMSに通知する(that)
が実現出来るということです。
外部サービスに為替や天気を取得する処理が必要な反面、IFTTTの豊富なthisやthatを組み合わせられるのは非常に魅力的です。
試してみる
と言うわけで、今回は「為替の情報を1時間に1回Webhookする外部サービス -> Webhookを受信したら(this) Pushbulletに通知する(that)」奴を作ってみようと思います。
「Webhookする外部サービス」にはGoogle Apps Script(GAS)を使います。
GASはGoogleさんのサーバでJavascriptを動かせるサービスで、Webhookを送受信するようなサービスが無料で作れちゃいます。
自宅サーバやVPSを用意しなくてもインターネット上でちょっとした処理が動かせるので、とても使い勝手が良いです。
IFTTTのアプレット
thisの設定
(1)New Applet画面のthisをクリックする。
(2)Webhooksを選択する。
(3)Receive a web requestを選択する。
(4)イベント名を聞かれるので、今回はsample_triggerとする。
thatの設定
(1)New Applet画面のthatをクリックする。
(2)Pushbulletを選択する。
(3)Push a noteを選択する。
(4)Pushbulletに送信するテキストを設定する。
{{Value1}}がWebhook経由で渡されたデータになります。
画面上は白背景で表示されています。
Webhook用のURLの確認
WebhooksサービスのDocumentationボタンから、Webhook用のURLを確認しておきます。
https://maker.ifttt.com/trigger/sample_trigger/with/key/12345678が今回のURLになります。
GASのスクリプト
IFTTTのWebhookにPOSTする処理
// IFTTTにWebHookをPOSTする function sendIFTTTWebHook(endpoint, value) { var message = { "value1":value }; var options = { "method":"POST", "headers": { "Content-Type":"application/json" }, "payload":JSON.stringify(message) }; UrlFetchApp.fetch("https://maker.ifttt.com/trigger/" + endpoint + "/with/key/12345678", options) }
為替情報を得る処理
// JPYUSDを得る function getUSDJPY() { var text = UrlFetchApp.fetch("https://www.gaitameonline.com/rateaj/getrate").getContentText(); var data = JSON.parse(text); var quotes = data["quotes"] var usdjpy = quotes.filter(function(item) { return item["currencyPairCode"] == "USDJPY"; })[0]; return usdjpy; }
メイン処理
// メイン function main() { var usdjpy = getUSDJPY() sendIFTTTWebHook("sample_trigger", "ドル円" + usdjpy["bid"]); }
GASのスクリプトエディタの[編集] - [現在のプロジェクトのトリガー」で、main()が1時間周期で実行されるようにします。
おわりに
これで、為替の情報が1時間に1回Pushbulletに通知できるようになりました。
Pushbulletの扱いはIFTTTに任せているので、GAS側は非常に簡素なコードになっています。
今後「PushbulletじゃなくてTwitterに投稿したい!」となっても、IFTTTにthatをTwitterにしたアプレットを作るだけで対応が可能です。
また「1ドルが112円以上かつ113円以下の時だけ通知させる」みたいな複雑な条件は、GASでサクッと書いてしまえばいいでしょう。
IFTTTの手軽さとGASの自由度が融合した、とても扱いやすい仕組みが出来たと思います。
ところでこの仕組み、UNIXに於けるパイプラインに酷似していると思いませんか?
これこそ、2000年代からみんなが追い求めていた「Web2.0」の一つの到達点ではないかと思いました。