LoginSignup
4
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-18

経緯

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

環境

  • GoogleHome
  • Line Messaging API
  • Mac mini
    • macOS Sierra 10.12.6
    • Node.js v9.4.0

参考

GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
Google Home開発入門 / google-home-notifier解説
LINE Messaging APIでX-Line-Signatureの署名検証を行う(AzureFunctions/Node.js)
Nodeプロジェクトで環境依存の設定の管理方法

結果

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

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で読み上げ、家族に通知

もっと便利に使うために ※2018/01/21追記

今回作った構成だとbotに一方的に話しかけるだけでGoogleHomeからの発話を聞き逃してしまうことが多々あった。

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

スクリーンショット 2018-01-21 14.05.04.png

4
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
11