LINEbotに話しかけた内容をGoogleHomeに喋らせる

# 経緯
家にいると家族からのLINEに気づかないことがあるのでGoogleHomeに喋らせたい。

# 環境
* GoogleHome
* Line Messaging API
* Mac mini
  * macOS Sierra 10.12.6
  * Node.js v9.4.0

# 参考
[GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます](https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac)
[Google Home開発入門 / google-home-notifier解説](https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066)
[LINE Messaging APIでX-Line-Signatureの署名検証を行う(AzureFunctions/Node.js）](https://qiita.com/yorifuji/items/71e31baf896adb69f567)
[Nodeプロジェクトで環境依存の設定の管理方法](https://qiita.com/ueokande/items/80048f886082fea5b776)

# 結果
環境設定などの細かい設定方法は他の方がやってるので割愛。
サーバのURLが毎回変わるのでSlackに通知するようにした。
実際に動作したソースがこちら。

```js:example.js
var express = require('express');
var googlehome = require('./google-home-notifier');
var slacknode = require('slack-node');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var crypto = require("crypto");
var app = express();

// .envから環境変数を読み込む
require('dotenv').config();

const IP_ADDRESS = '192.168.0.20';
const SERVER_PORT = 8091;
const DEVICE_NAME = 'Google Home';
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
const SLACK_WEBHOOK_URL = process.env.SLACK_WEBHOOK_URL;

var slack = new slacknode();
slack.setWebhook(SLACK_WEBHOOK_URL);

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.post('/google-home-notifier', function (req, res) {

  console.log('post request');
  console.log(JSON.stringify(req.body));
  console.log(JSON.stringify(req.headers));

  // リクエストがLINE Platformから送られてきたか確認する
  if (!validate_signature(req.headers['x-line-signature'], req.body)) {
      console.log('[err] Signature invalid.');
      return;
  }

  if (!req.body) return res.sendStatus(400)

  // テキストが送られてきた場合のみ返事をする
  if ((req.body['events'][0]['type'] != 'message') || (req.body['events'][0]['message']['type'] != 'text')) {
      console.log('[info] Request type is not message.');
      return;
  }

  googlehome.device('Google-Home', 'ja');

  var text = req.body['events'][0]['message']['text'];
  if (text) {
    try {
      googlehome.notify(text, function(notifyRes) {
        console.log(notifyRes);
      });
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }
})

app.listen(SERVER_PORT, function () {
  ngrok.connect(SERVER_PORT, function (err, url) {
    var data = '';
    data += 'Endpoints:\n';
    data += '    ' + url + '/google-home-notifier\n';
    data += 'POST example:\n';
    data += '    `curl -X POST -d "text=おーっす、おら Google Home だぞー" ' + url + '/google-home-notifier`\n';
    console.log(data);
    // URLをSlackに通知
    slack.webhook({
          icon_emoji: ":beer:",
          text: data
        }, function(err, res) {
          if(err) {
            throw err;
          }else{
            console.log(res);
          }
        });
  });
})

// 署名検証
function validate_signature(signature, body) {
    return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(new Buffer(JSON.stringify(body), 'utf8')).digest('base64');
}
```

# 最後に
一通り終わってから全く同じことをされている方を発見。というオチでした。

[LINEに送信したメッセージを、Google Homeで読み上げ、家族に通知](https://qiita.com/daaaaaasuke/items/5e95983166667094f42f)

# もっと便利に使うために ※2018/01/21追記
今回作った構成だとbotに一方的に話しかけるだけでGoogleHomeからの発話を聞き逃してしまうことが多々あった。

そのため、botの設定でBotのグループトーク参加を利用して家族のグループにbotを参加させると発言の内容が共有できてGoogleHomeからの発話もできる。

<img width="249" alt="スクリーンショット 2018-01-21 14.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/122574/5ab33bc2-9754-0011-1913-b0ee11940ec5.png">