IFTTTでYoをトリガーに任意のWebhookに通知する

IFTTTのアクションに自分で用意したWebhookに通知して欲しいときにWordPresss Channelを使うと便利です。今回は[ifttt-webhook](https://github.com/captn3m0/ifttt-webhook)のNode.js版である[express-ifttt-webhook](https://github.com/b00giZm/express-ifttt-webhook)を使います。AndroidからIFTTTに[Yo](http://www.justyo.co/)を送信すると[RequestBin](http://requestb.in/)のエンドポイントに通知してパラメータをブラウザで確認してみます。

## Webhook

[express-ifttt-webhook](https://github.com/b00giZm/express-ifttt-webhook)はNode.jsで書かれたExpressのミドルウェアです。[google/nodejs-runtime](https://registry.hub.docker.com/u/google/nodejs-runtime/)のDockerイメージを使いExpressサーバーのコンテナを起動します。

### Webhookコンテナの用意

プロジェクトディレクトリを作成します。

``` bash
$ mkdir -p ~/docker_apps/ifttt
$ cd !$
```

package.jsonを用意して、expressとexpress-ifttt-webhookモジュールをインストールします。

```json
:~/docker_apps/ifttt/package.json
{
  "name": "express-ifttt",
  "description": "express ifttt test app",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express": "*.*.*",
    "express-ifttt-webhook": "*.*.*"
  },
  "scripts": {"start": "node app.js"}
}
```

app.jsに簡単な処理を書きます。`json.url`には最終的にフォーワードしたいURLを指定します。今回はデバッグ用のRequestBinのURLにフォワードします。URLはこの後IFTTTのレシピに記述します。

```js:~/docker_apps/ifttt/app.js
var express = require('express')
  , webhook = require('express-ifttt-webhook');

var app = express();
app.set('port', 8080);

app.use(webhook(function(json,done){
    console.log(json);
    json.url = json.categories.string;
    done(null,json);
}));

var server = app.listen(app.get('port'), function() {
  console.log('Server listening on port', server.address().port);
});
```

Dockerfileを作成してコンテナを起動します。

``` bash
$ echo FROM google/nodejs-runtime > Dockerfile
$ docker pull google/nodejs-runtime 
$ docker build -t ifttt .
$ docker run -d --name ifttt ifttt
```

### ngrokでWebhookの公開

[ngrok](https://ngrok.com/)を使い作成したWebhookコンテナを公開します。

``` bash
$ docker pull wizardapps/ngrok:latest
$ docker run -it --rm wizardapps/ngrok:latest ngrok $(docker inspect --format="{{ .NetworkSettings.IPAddress }}" ifttt):8080
```

公開用のngrokエンドポイントをコピーしておきます。

``` bash
...
Forwarding                    http://3b98ba34.ngrok.com -> 172.17.0.47:8080
...
```

## Yo

[Yo](http://www.justyo.co/)はYoと通知するだけのシンプルなコミュニケーションツールです。IFTTTのトリガーにYoを使ってみます。AndroidにYoアプリをインストールして、+ボタンを押し`IFTTT`をユーザーに追加しておきます。

## IFTTT

### Yoチャンネルのアクティベート

チャンネルからYoを検索してアクティベートします。

![yo-activate.png](https://qiita-image-store.s3.amazonaws.com/0/43745/8adb6d7b-87c8-1961-428e-9905f9800ece.png)

### WordPressチャンネルのアクティベート

チャネルからWordPressを検索します。テスト用なので今回は認証を行いませんが、UsernameとPasswordはWordPress Channelで必須項目のため適当に入力します。

* Blog URL: http://3b98ba34.ngrok.com
* Username: username
* Password: password

![wordpress-activate.png](https://qiita-image-store.s3.amazonaws.com/0/43745/4970d64c-ed25-1793-76ce-c50b1f688876.png)


### レシピの作成

最初に`This`をクリックしてYoのトリガーを選択します。

![choose-trigger.png](https://qiita-image-store.s3.amazonaws.com/0/43745/77fb3272-9dce-6814-eaee-c532d6e5ffdc.png)


次に`That`をクリックしてWordPress Channelをアクションに選択します。

![choose-action.png](https://qiita-image-store.s3.amazonaws.com/0/43745/fc905b8b-a169-bd43-5bd5-0f18f7bb3095.png)


`Create post`のアクションを選択します。フィールドは任意に設定できますが、`Categories`フィールドにWebfookしたい最終的なフォワード先のURLを指定します。今回は[RequestBin](http://requestb.in/)で作成したURLを入力します。`Create Action`ボタンを押してアクションのを完了します。

* Categories: http://requestb.in/pb4l5spb


![categories-field.png](https://qiita-image-store.s3.amazonaws.com/0/43745/df97b040-e509-4948-f6a1-744579d3eedf.png)


最後に`Create Recipe`ボタンをクリックしてレシピのアクティベートを行います。


![activate-recipe.png](https://qiita-image-store.s3.amazonaws.com/0/43745/b0680127-0ebb-866b-fdd5-7c44b73afea8.png)


## AndroidのYoアプリからテスト

AndroidにインストールしたYoアプリを起動します。追加したユーザーの`IFTTT`をタップします。「Yo送信完了!」と表示されれば成功です。



![ifttt.png](https://qiita-image-store.s3.amazonaws.com/0/43745/2d46dbfc-1de2-9473-01da-f1dd9df65527.png)

RequestBinで先ほど作成したURLを開くとIFTTTからPOSTされたパラメーターを確認することができました。



![requestbin.png](https://qiita-image-store.s3.amazonaws.com/0/43745/1a1e621b-065e-aaef-9043-350a122a0d89.png)


以下がIFTTTから通知されるJSONデータの中身です。コールバックではJSONオブジェクトになっています。

```js
{ username: 'username',
  password: 'password',
  title: 'Yo',
  description: 'hello',
  categories: { string: 'http://requestb.in/pb4l5spb' },
  tags: [ { string: 'IFTTT' }, { string: 'Yo' } ],
  post_status: 'publish' }
```

今回はテスト的に通知を受けただけですが、次回はExpressの中でMQTTにブリッジしてもう少し汎用的に使えるようにしてみます。