経緯
家にいると家族からの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からの発話もできる。