LINEのMessaging APIからのデータをBeebotteに垂れ流すNode.jsサーバ

#はじめに
※この投稿は、[LINEのメッセージをGoogle Homeで読み上げる(機能強化版)](https://qiita.com/tinoue@github/items/17f737f3e7d693877ecf)を実装済みで更に機能強化を求む人向けの投稿です。

[LINEのメッセージをGoogle Homeで読み上げる(機能強化版)](https://qiita.com/tinoue@github/items/17f737f3e7d693877ecf)を使って、個人的に機能強化も加えたりして遊んでいたんですが、ついにMicrosoft flowの**無料で750回のAPIコール/月の上限**に達しました。

むしゃくしゃして課金しようとしたんですが、

* アカウント作るのに独自ドメインのメールアドレスが必要
* USD $5.00/月と、個人で楽しむにしては高いコストがかかる

ので、やっぱりむしゃくしゃして**LINE Messaging APIからのWebhook呼び出しをBeebotteに垂れ流すnodejsサーバ**を書きました。っていう話。

この話を理解するには以下の知識が必要になります。

* nodejsの使い方
* かんたんなサーバ・クライアントの知識
* [Glitch](https://glitch.com)の基礎知識。（以下をどうぞ）
    * [[Node.js] 無料で簡単にウェブアプリを公開できるサービス「Glitch」を使ってみた！](https://qiita.com/yonedaco/items/569bcc442872a1f9a03d)
    * [ThimbleからGlitchへ移行する方法と注意点！+ Glitchってどんなサービス？【ざっくりまとめ】](https://qiita.com/liveasnotes/items/f52d357a24c26267abd0)
    * 簡単に言うと、nodejsがかける無料サーバだよ！無料だからちょっと制限あるけど、開発や小規模APIを作るならもってこい。

# 特徴・できること

* **LINE Messaging APIからのWebhook呼び出しをBeebotteに垂れ流す**サーバ
    * 「LINEのWebhookリクエストの内容は{events:[{<メッセージ内容>}]となっていますが、BeebotteのREST APIは{data:{}}の形式しか受け付けない」ため、要素名を書き換えてBeebotteに送りつけるサーバ。
* Microsoft Flowの無料750回APIコール/月を突破し、**4000回/時**のアクセスまでできる。およそ月に約28万アクセスできる計算。どのご家庭にもあるbot込の家族lineグループなら安心の帯域量！
* Microsoft Flowのときはチェックしていなかった、`X-Line-Signature`([LINE developersを参照](https://developers.line.biz/ja/reference/messaging-api/#signature-validation))を検証する。確実にLINEサーバからのメッセージしか通さない。

# ソースちょーだい
プロジェクト自体は、[githubで公開しています](https://github.com/kassyi/raspberypi/tree/master/lineToBeebotte)。※ただ、まだ動くだけの書き捨てコード状態。

## インストール手順
[Glitch](https://glitch.com)で新規プロジェクトを作成。
`# npm i crypto body-parser` で必要なパッケージをインストール。

.envにLINEのCHANNEL_SECRETとBEEBOTTEのTOKENを書いて、server.jsもコピペする。

```
LINE_CHANNEL_SECRET='[SECRET]'
BEEBOTTE_TOKEN='[TOKEN]'
```

```server.js

const express = require('express');
const crypto = require("crypto");
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json({verify: function (req, res, buf, encoding) {
  
  function validate_signature(signature, body) {
    const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
    return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(body).digest('base64');
  }
  
  //test signature
  if (!validate_signature(req.headers['x-line-signature'], buf)) {
    throw new Error('Invalid signature.');
  }
}}));

//リクエストがあったら応答
app.post('/api/lineToBeebotte', function(req, res, err) {
  const events = req.body.events;
  const resJson = {
      data: req.body.events
  };
  const request = require('request-promise');
  
  console.log(resJson);
  
  request({
    url: 'https://api.beebotte.com/v1/data/publish/line/message?token=' + process.env.BEEBOTTE_TOKEN,
    method: 'POST',
    form : resJson
  }).then(()=>{
      res.json({result:'sucsess'});
  }).catch(()=>{
      res.json({result:'fail'});
  });
});
const listener = app.listen(process.env.PORT, function() {
  console.log('Your app is listening on port ' + listener.address().port);
});
```

## LINEのコンソールに設定する
LINEのデベロッパツールの中のコンソールに入り、`Webhook URL`に`https://youredoamin.glitch.me/api/lineToBeebotte`　を設定する。※youredoaminは置き換え

## まとめ

以上、ただ、垂れ流すだけのサーバですが、nodejsの勉強になって楽しかったです。ただ、朝4時までかけて突貫工事ですることではなかった←