もぐてっく

人は1つ歳を取る度、1ビットづつ大きくなれると信じてた。

IFTTTにGoogle Apps Scriptを混ぜたらヤバい化学反応が起こった件

はじめに

2010年12月に彗星のごとく現れたWebサービス同士のマッシュアップサービスIFTTT。
「if (this) then (that)」と言うシンプル極まる構文で手軽にWebサービスが連携出来るのが特徴です。

IFTTTは様々なWebサービスをサポートしており、ちょっと挙げるだけでもTwitterEvernoteGoogle DriveSkypeなどの有名どころから、ナニコレ?ってものまで実に多彩です。

加えて、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をクリックする。
f:id:moguno:20180802155231p:plain

(2)Webhooksを選択する。
f:id:moguno:20180802155234p:plain

(3)Receive a web requestを選択する。
f:id:moguno:20180802155239p:plain

(4)イベント名を聞かれるので、今回はsample_triggerとする。
f:id:moguno:20180802155241p:plain

thatの設定

(1)New Applet画面のthatをクリックする。
f:id:moguno:20180802155245p:plain

(2)Pushbulletを選択する。
f:id:moguno:20180802155250p:plain

(3)Push a noteを選択する。
f:id:moguno:20180802155253p:plain

(4)Pushbulletに送信するテキストを設定する。
{{Value1}}がWebhook経由で渡されたデータになります。
画面上は白背景で表示されています。

f:id:moguno:20180802155259p:plain

Webhook用のURLの確認

WebhooksサービスのDocumentationボタンから、Webhook用のURLを確認しておきます。
f:id:moguno:20180802160529p:plain

https://maker.ifttt.com/trigger/sample_trigger/with/key/12345678が今回のURLになります。
f:id:moguno:20180802160520p:plain

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時間周期で実行されるようにします。
f:id:moguno:20180802160953p:plain

おわりに

これで、為替の情報が1時間に1回Pushbulletに通知できるようになりました。

Pushbulletの扱いはIFTTTに任せているので、GAS側は非常に簡素なコードになっています。

今後「PushbulletじゃなくてTwitterに投稿したい!」となっても、IFTTTにthatをTwitterにしたアプレットを作るだけで対応が可能です。
また「1ドルが112円以上かつ113円以下の時だけ通知させる」みたいな複雑な条件は、GASでサクッと書いてしまえばいいでしょう。

IFTTTの手軽さとGASの自由度が融合した、とても扱いやすい仕組みが出来たと思います。

ところでこの仕組み、UNIXに於けるパイプラインに酷似していると思いませんか?

これこそ、2000年代からみんなが追い求めていた「Web2.0」の一つの到達点ではないかと思いました。