Heroku NodeJSでIFTTT(Maker Channel)のDo NoteからChatWorkへ送る仕組みを作るメモ

Heroku NodeJSでIFTTT(Maker Channel)のDo NoteからChatWorkへ送る仕組みを作るメモです。前回のIFTTTのMaker Channelとシンプルに接続するHeroku NodeJSのメモから発展させていきます。

ChatWorkはIFTTTのChannelには対応していないので歯痒い思いをしていましたが、IFTTTにMaker Channelができたことで可能です。ChatWorkAPIと疎通できるようにした中継サーバーでメッセージを橋渡しをしてもらい、実現します。

早速やってみましょう。

仕組み

  • HerokuにてNodeJSでChatWorkAPIと疎通できるようにして中継サーバーを作ります。
  • そして、Do NoteからのメッセージをMaker Channel経由で送ります。
  • 先ほどのHerokuサーバーで中継してもらって、ChatWorkでメッセージを喋ってもらいます。

image_20150702_023739_17

Do Noteのレシピ

Do NoteのレシピはMaker Channelです。レシピのタイトルは自由につけて大丈夫です。

image_20150702_020837_1

肝となるActionは以下のとおりです。JSONをPOSTで送ります。

image_20150702_022308_10

前回と比べるとアクセスキー(accesskey)というものを設置して、Heroku内でもアクセスキーを照合しています。

URLがわかってしまうとChatWorkへメッセージ送り放題になるのも怖いので最低限の対策です。

Herokuを作る

立ち上げ

いつものこちらをベースにまず立ち上げます。

Getting Started with Node.js on Heroku | Heroku Dev Center

npmをインストール

出来上がったら主要なnpmをインストールします。

npm install --save express request body-parser

喋らせたいChatWorkのルームIDとアクセストークンを用意

喋らせたいChatWorkのルームIDとアクセストークンを用意します。

APIの使い方まわりは以下の記事わかりやすいです。

実際のコード

以下がコードです。動作させるときのアクセスキーはDo Noteのaccesskeyと一致させましょう。

var express = require('express');
var request = require('request');
var app = express();
var bodyParser = require('body-parser');

app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/public'));

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

// 動作させるときのアクセスキー(Do Noteのaccesskeyと一致させる)
var ACCESS_KEY = 'ABCDEFG';
// ChatWorkのルームID
var ROOM_ID = '       ';
// ChatWorkのアクセストークン
var CHATWORK_ACCESS_TOKEN = '                               ';

// ChatWorkメッセージ送信
function postMessage(bodyStr){
    var request = require('request');
    var options = {
        headers: {
            'X-ChatWorkToken': CHATWORK_ACCESS_TOKEN
        },
        json: true
    };
    options.url = 'https://api.chatwork.com/v1/rooms/' + ROOM_ID + '/messages';
    options.form = { body: bodyStr };
    request.post(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }else{
            console.log('error: '+ response.statusCode);
        }
    });
}

app.post('/input', function(req, res){
    res.set('Content-Type', 'application/json');
    console.log('---------- input');
    console.log(req.body);
    if(req.body.accesskey == ACCESS_KEY){
        // アクセスキーが一致すれば送信
        postMessage(req.body.message);  // ChatWorkメッセージ送信
        res.send("{'request':'OK'}");
    } else {
        // NG
        res.send("{'request':'ERROR'}");
    }
});

app.get('/', function(request, response) {
    response.send('Hello ChatWork!');
});

app.listen(app.get('port'), function() {
    console.log('Node app is running on port', app.get('port'));
});

試してみる

さきほどのDo Noteから送ってみます。

image_20150702_143932_5

リストからchatworkのボタンを選択します。

image_20150702_143929_4

テキストを入力。

image_20150702_022526_1

ChatWorkに無事表示されました!

image_20150702_022747_1

おわりに

このようにIFTTTで対応していないAPIでも、使いたいAPIへ中継できるサーバーを立ててIFTTTのMaker Channelをつかって橋渡しにすれば、やりとりできることがわかりました。

それでは、よきIFTTT&ChatWork&Heroku Lifeを!