google homeにLINEしてというとLINEに投稿する。またLINEに投稿があったときに「〇〇さんからLINEです。〇〇。」とgoogle homeが教えてくれるようにしました。
google home notifierは、自宅のlinuxmintサーバー(現在はRaspberry Pi 3)で起動してあります。
1 | |
2 |
1.google homeに「LINE 〇〇」というとIFTTTがよばれるようにIFTTTでNew Appletをクリックして作成しておきます。以下のように作成しました。
URLはgoogle home notifier(example.js)を実行したときに表示されるURLを指定します。
example.jsからLINE Messaging APIにメッセージを送信しLINEグループに送信されます。
2. LINEに投稿があったときにLINE Messaging APIを使用してデータを自宅のgoogle-home-notifierに送信してもらう。
LINE Messaging APIの設定はこちら
webhookは自宅で起動したgoogle-home-notifier(example.js)のURLを指定しておく。googl-home-notifierの設定はこちら
google-home-notiferのexample.jsを修正して作成しました。(LINE読み上げのみ)
example.js
var express = require('express'); var googlehome = require('./google-home-notifier'); var ngrok = require('ngrok'); var bodyParser = require('body-parser'); var app = express(); const serverPort = 8091; // default port //line messaging API用 const line = require('@line/bot-sdk'); var deviceName = 'ダイニングルーム';// google homeの名前 var ip = '192.168.10.14'; // ここにgoogle homeのIPを記載 const client = new line.Client({ channelAccessToken: 'LINE Messaging API Channelのアクセストークインを入力' }); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); var urlencodedParser = bodyParser.urlencoded({ extended: true }); app.post('/google-home-notifier', urlencodedParser, function (req, res) { if (!req.body) return res.sendStatus(400) console.log(req.body); console.log('POST'); if(req.body.events){ var user1 = req.body.events[0].source.userId; var text = req.body.events[0].message.text; var lineReplyToken = req.body.events[0].replyToken; client.getProfile(user1) .then(function(data) { uname=data.displayName; console.log(uname); if (req.query.ip) { ip = req.query.ip; } var language = 'ja'; if (req.query.language) { language; } googlehome.accent('us'); googlehome.ip(ip, language); googlehome.device(deviceName,language) if (text){ try { if (text.startsWith('http')){ var mp3_url = text; googlehome.play(mp3_url, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n'); }); } else { googlehome.notify(uname+'からLINEです。'+text, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will say: ' + text + '\n'); }); } } catch(err) { console.log(err); res.sendStatus(500); res.send(err); } }else{ res.send('Please GET "text=Hello Google Home"'); } }) } console.log('text:'+text); }) app.get('/google-home-notifier', function (req, res) { console.log(req.query); var text = req.query.text; if (req.query.ip) { ip = req.query.ip; } var language = 'ja'; if (req.query.language) { language; } googlehome.ip(ip, language); googlehome.device(deviceName,language) if (text) { try { if (text.startsWith('http')){ var mp3_url = text; googlehome.play(mp3_url, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n'); }); } else { googlehome.notify(text, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will say: ' + text + '\n'); }); } } catch(err) { console.log(err); res.sendStatus(500); res.send(err); } }else{ res.send('Please GET "text=Hello+Google+Home"'); } }) app.listen(serverPort, function () { ngrok.connect(serverPort, function (err, url) { console.log('Endpoints:'); console.log(' http://' + ip + ':' + serverPort + '/google-home-notifier'); console.log(' ' + url + '/google-home-notifier'); console.log('GET example:'); console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home'); console.log('POST example:'); console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier'); }); })
しかし上記のプログラムではbotをグループに入れてもグループメンバーのdisplayNameが取得できませんでした。
修正版がこちら(LINE読み上げのみ)
var express = require('express'); var googlehome = require('./google-home-notifier'); var ngrok = require('ngrok'); var bodyParser = require('body-parser'); var app = express(); const serverPort = 8091; // default port //line messaging API用 const line = require('@line/bot-sdk'); var deviceName = 'ダイニングルーム';// Google Homeの名前 var ip = '192.168.10.14'; // Google HomeのIP const client = new line.Client({ channelAccessToken: 'アクセストークン' }); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); var urlencodedParser = bodyParser.urlencoded({ extended: true }); app.post('/google-home-notifier', urlencodedParser, function (req, res) { if (!req.body) return res.sendStatus(400) console.log(req.body); console.log('POST'); if(req.body.events){ var user1 = req.body.events[0].source.userId; var text = req.body.events[0].message.text; var lineReplyToken = req.body.events[0].replyToken; var gid = req.body.events[0].source.groupId; console.log('user1:'+user1); console.log('gid:'+gid); client.getGroupMemberProfile(gid,user1) .then((profile) => { console.log(profile.displayName); var uname=profile.displayName; // console.log(profile.userId); // console.log(profile.pictureUrl); // console.log(profile.statusMessage); if (req.query.ip) { ip = req.query.ip; } var language = 'ja'; // default language code if (req.query.language) { language; } googlehome.accent('us'); googlehome.ip(ip, language); googlehome.device(deviceName,language) if (text){ try { if (text.startsWith('http')){ var mp3_url = text; googlehome.play(mp3_url, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n'); }); } else { googlehome.notify(uname+'さんからLINEです。'+text, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will say: ' + text + '\n'); }); } } catch(err) { console.log(err); res.sendStatus(500); res.send(err); } }else{ res.send('Please GET "text=Hello Google Home"'); } }) .catch((err) => { // error handling }); } }) app.get('/google-home-notifier', function (req, res) { console.log(req.query); var text = req.query.text; if (req.query.ip) { ip = req.query.ip; } var language = 'ja'; // default language code if (req.query.language) { language; } googlehome.ip(ip, language); googlehome.device(deviceName,language) if (text) { try { if (text.startsWith('http')){ var mp3_url = text; googlehome.play(mp3_url, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n'); }); } else { googlehome.notify(text, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will say: ' + text + '\n'); }); } } catch(err) { console.log(err); res.sendStatus(500); res.send(err); } }else{ res.send('Please GET "text=Hello+Google+Home"'); } }) app.listen(serverPort, function () { ngrok.connect(serverPort, function (err, url) { console.log('Endpoints:'); console.log(' http://' + ip + ':' + serverPort + '/google-home-notifier'); console.log(' ' + url + '/google-home-notifier'); console.log('GET example:'); console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home'); console.log('POST example:'); console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier'); }); })
google homeにLINEしてと話しかけたときLINEグループに投稿する部分を追加したものが以下のようになります。
以下を参考にさせていただきました。
Google Home mini で双方向の音声でのLINE送受信を実現する
var express = require('express'); var googlehome = require('./google-home-notifier'); var ngrok = require('ngrok'); var bodyParser = require('body-parser'); var app = express(); const serverPort = 8091; // default port //line messaging API用 const line = require('@line/bot-sdk'); var deviceName = 'ダイニングルーム'; var ip = '192.168.10.14'; // google home ip const client = new line.Client({ channelAccessToken: 'アクセストークン' }); const groupId = 'グループId'; app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); var urlencodedParser = bodyParser.urlencoded({ extended: true }); app.post('/google-home-notifier', urlencodedParser, function (req, res) { if (!req.body) return res.sendStatus(400) console.log(req.body); console.log('POST'); if(req.body.events){ var user1 = req.body.events[0].source.userId; var text = req.body.events[0].message.text; var lineReplyToken = req.body.events[0].replyToken; var gid = req.body.events[0].source.groupId; console.log('user1:'+user1); console.log('gid:'+gid); client.getGroupMemberProfile(gid,user1) .then((profile) => { console.log(profile.displayName); var uname=profile.displayName; // console.log(profile.userId); // console.log(profile.pictureUrl); // console.log(profile.statusMessage); if (req.query.ip) { ip = req.query.ip; } var language = 'ja'; // default language code if (req.query.language) { language; } googlehome.accent('us'); googlehome.ip(ip, language); googlehome.device(deviceName,language) if (text){ try { if (text.startsWith('http')){ var mp3_url = text; googlehome.play(mp3_url, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n'); }); } else { googlehome.notify(uname+'さんからLINEです。'+text, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will say: ' + text + '\n'); }); } } catch(err) { console.log(err); res.sendStatus(500); res.send(err); } }else{ res.send('Please GET "text=Hello Google Home"'); } }) .catch((err) => { // error handling }); } // event else{ // リクエストボディを出力 console.log(req.body); var texttoline = req.body.text; console.log(texttoline); res.write('ok'); res.end(); const message = { type: 'text', text: texttoline }; client.pushMessage(groupId, message) .then(() => { }) .catch((err) => { // error handling }); } }) app.get('/google-home-notifier', function (req, res) { console.log(req.query); var text = req.query.text; if (req.query.ip) { ip = req.query.ip; } var language = 'ja'; // default language code if (req.query.language) { language; } googlehome.ip(ip, language); googlehome.device(deviceName,language) if (text) { try { if (text.startsWith('http')){ var mp3_url = text; googlehome.play(mp3_url, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n'); }); } else { googlehome.notify(text, function(notifyRes) { console.log(notifyRes); res.send(deviceName + ' will say: ' + text + '\n'); }); } } catch(err) { console.log(err); res.sendStatus(500); res.send(err); } }else{ res.send('Please GET "text=Hello+Google+Home"'); } }) app.listen(serverPort, function () { ngrok.connect(serverPort, function (err, url) { console.log('Endpoints:'); console.log(' http://' + ip + ':' + serverPort + '/google-home-notifier'); console.log(' ' + url + '/google-home-notifier'); console.log('GET example:'); console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home'); console.log('POST example:'); console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier'); }); })
[simterm]
$ node example.js
Endpoints:
http://192.168.10.14:8080/google-home-notifier
https://a31fac61.ngrok.io/google-home-notifier
GET example:
curl -X GET https://a31fac61.ngrok.io/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home" https://a31fac61.ngrok.io/google-home-notifier
[/simterm]
以下のURLをLINE Messaging API Channel基本設定のWebhook URLに指定する。
https://a31fac61.ngrok.io/google-home-notifier
ngrokに関しては以下を参照してください。a31fac61のところはコマンドを実行するたびにかわります。サブドメインは有料プランを選べば固定にできるようです。詳しくは以下を参照してください。
またあらかじめsign upしておかないと一定期間を過ぎるとトンネルが期限切れになってしまいます。ngrokコマンドをインストールして実行しauthtokenを保存しておく必要があります。
https://dashboard.ngrok.com/get-started
ngrokを使用してローカル環境を外部に公開する
Views: 830