はじめに
- まず、Gmailが届いたらGoogle homeがしゃべるようにしてみた
- つぎは、入力したスケジュールを教えてくれるようにしたい
- 以前の機能をフルに活用して、楽してGoogle Homeがしゃべるようにしたい
前提
- Windows 10 pro バージョン1803
- 以前の記事にしたがって、Gmailが届いたら、Google homeがしゃべってくれるようになっていること
概要
- まず、大雑把な流れを考える
- IFTTTで、スケジュールのタイトルと説明と場所と開始時刻と終了時刻をGoogle Drive Spreadsheetに書き込む
- cronで毎分起動するnode.jpツールで Google Drive Spreadsheetから情報を取得する
- 取得した新着タイトルと送り主を、「Google home喋らせサーバ」に送る
IFTTTで、スケジュールのタイトルと説明と場所と開始時刻と終了時刻をGoogle Drive Spreadsheetに書き込む
- IFTTTにアクセスしてsigninする
- My Appletsをクリック
- New Appletをクリック
- Thisをクリック
- Google Calendarをクリック
- Any event startsをクリック
- Time before event startsを15 minutesに選択
- Create triggerをクリック
- Thatをクリック
- google sheetsをクリック
- Add row to spreadsheetをクリック
- Formatted rowを{{Title}}|||{{Description}}|||{{Where}}}|||{{Starts}}|||{{Ends}}に変更
- Create Actionをクリック
- Turn Onをクリック
Windows Subsystem for Linux(WSL)でubuntuを入れる
- 以前の記事を参照
nodo.jsをWSLに入れる(最新にする)
- 以前の記事を参照
cronで毎分起動するnode.jpツールで Google Drive Spreadsheetから情報を取得する
- 前提モジュールをインストール
sudo npm child_process sleep google-spreadsheet
- googleのデベロッパーコンソールに行って、[プロジェクトを作成]を選ぶ
- [同意して続行]をクリック
- [認証情報に進む]をクリック
- [キャンセル]をクリック
- 「認証情報」のタブを選択し、 [認証情報を作成]をクリック
- 「サービスアカウントキー」をクリック
- サービスアカウントを作成
- KeyTypeはjsonを選択
- jsonを保存
- jsonの中の、"client_email"を調べておく
- Googleスプレッドシートに行く
- [Any event starts]と言う名前のスプレッドシートを作る
- urlから、スプレッドシートのIDを調べておく(https://docs.google.com/spreadsheets/d/スプレッドシートのID/edit#gid=0となっている)
- A1にtitle、B1にdescription、C1にwhere、D1にstarts、E1にendsと入力する
- [共有]をクリック
- 「ユーザー」に、上で調べた"client_email"を追加する
- 上のjsonを、WSLの適当なディレクトリに置く
- jsonを置いたディレクトリに以下のスクリプトを作成
spreadsheet_wacher.js
const execSync = require('child_process').execSync;
var sleep = require('sleep');
var GoogleSpreadsheet = require('google-spreadsheet');
var mail_spreadsheet_id = '[Any new email]のスプレッドシートのID'
var calendar_spreadsheet_id = '[Any event starts]のスプレッドシートのID'
var path = 'フルパスのjsonファイル'
var my_mail_sheet = new GoogleSpreadsheet(mail_spreadsheet_id);
var my_calendar_sheet = new GoogleSpreadsheet(calendar_spreadsheet_id);
var credentials = require(path);
my_mail_sheet.useServiceAccountAuth(credentials, function(err){
my_mail_sheet.getInfo(function(err, data){
data.worksheets[0].getRows(function( err, rows ) {
for(var i in rows) {
var name = rows[i].name;
var title = rows[i].title;
var text = name+'さんから'+title+'と言うメールが来ています';
console.log(text);
text = text.replace(/\'/g, '');
text = text.replace(/\&/g, '');
execSync("curl -X POST -d 'text="+text+"' http://localhost:8080/google-home-notifier");
rows[i].del();
sleep.sleep(10);
}
});
});
});
my_calendar_sheet.useServiceAccountAuth(credentials, function(err){
my_calendar_sheet.getInfo(function(err, data){
data.worksheets[0].getRows(function( err, rows ) {
for(var i in rows) {
var title = rows[i].title;
var where = rows[i].where;
var starts = rows[i].starts;
var text = starts+'に、'+where+'で、'+title+'というスケジュールが入っています';
console.log(text);
text = text.replace(/\'/g, '');
text = text.replace(/\&/g, '');
execSync("curl -X POST -d 'text="+text+"' http://localhost:8080/google-home-notifier");
rows[i].del();
sleep.sleep(10);
}
});
});
});
- gmailとgoogle calendarをまとめてしゃべってくれるようにまとめた
- node.jsのフルパスを調べる
which node
- cron用のファイルを編集する
vi ~/crontab
- 中身はこんな感じ。nodeとスクリプトのフルパスは適切に変更してください
*/1 * * * * /usr/local/bin/node /home/google_home/spreadsheet_wacher.js >> /var/log/cron.log
- cronに登録する
crontab < ~/crontab
- cronが起動しているか調べる
sudo /etc/init.d/cron status
- 起動していれば、念のため再起動
sudo /etc/init.d/cron restart
- 起動していなければ起動する
sudo /etc/init.d/cron start
google-home-notifierを入れる
- 以前の記事を参照
example.jsを編集する
- 以前の記事を参照
nohupで動かしておく
- 以前の記事を参照
おわりに
- 基本的に、以前の記事にあるものをちょっと改造するだけで出来た。
- IFTTTはMicrosoft flowに比べて、回数制限やテストの即時性などの面で勝っており、IFTTTで出来るものは積極的にIFTTTを使っていきたいと思った
- メールとスケジュールをしゃべらせたら大体満足した自分の生活の底の浅さに衝撃を覚えざるを得ない
追記
- 読み上げる項目に、アポストロフィが含まれているとcurlがコケる問題に対応するため、'spreadsheet_wacher.js'の2カ所に'text = text.replace(/\'/g, '');'を追加した