12月ですね。この記事はオールアバウトアドベントカレンダー9日目の記事です。
投稿当日(2017/12/9)に焦って書かれています。
はじめに
この時期、アドベントカレンダーのおかげで技術系の記事が多く更新されるのでとても楽しみな季節です。
そのため、毎日アドベントカレンダーの更新が気になり、何度も何度も見にいってしまう僕がいます。
早朝に公開されていれば問題ないのですが、僕みたいにギリギリの時間帯に更新してしまう人もいると思います。
そんな気になって何度も確認してしまう手間を軽減するために、
Google Homeに更新状況を喋らせるということをやってみました。
やっていること
- QiitaアドベントカレンダーのRSSを読み込む
- なんかいい感じにパースする
- クリスマスまでの残日数をお知らせする
- 当日の投稿がある場合は、その投稿のタイトルをお知らせする
- 当日の投稿がない場合は、そうお知らせする
使っている技術
- Google Home
- node.js(v8.1.4)
- npm(5.0.3)
使っているnpmライブラリ
- google-home-notifier
- feedparser
- request
実際のjavascriptコード
const googlehome = require('google-home-notifier');
const FeedParser = require('feedparser');
const request = require('request');
// Qiitaのアドベントカレンダーフィード
const qiita_feed = 'https://qiita.com/advent-calendar/2017/allabout/feed';
const language = 'ja';
// クリスマスの日付
var xmas_day = new Date(2017, 11, 25, 0, 0);
var req = request(qiita_feed);
var feedparser = new FeedParser({});
req.on('response', function(res) {
var stream = this;
if (res.statusCode !== 200) {
this.emit('error', new Error('Bad status code'));
} else {
stream.pipe(feedparser);
}
});
var blog_titles = [];
var updated_date; // 最終更新日
feedparser.on('meta', function(meta) {
updated_date = meta.date;
});
feedparser.on('readable', function() {
var stream = this;
var item;
while (item = stream.read()) {
// Qiita内と外部でタイトル保持部分が違うみたいなので条件分岐
if (item.link.indexOf('https://qiita.com/') === 0) {
blog_titles.push(item.title);
} else {
blog_titles.push(item.description);
}
}
});
feedparser.on('end', function() {
var today = new Date();
var month = today.getMonth() + 1;
var day = today.getDate();
// クリスマスまでの残日数
var day_to_xmas = Math.ceil((xmas_day.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
var updated_day = new Date(updated_date).getDate();
var comment = "クリスマスまで、" + day_to_xmas + "日だよ。";
if (day >= updated_day) {
comment += "しかし残念ながら、本日のアドベントカレンダーの投稿はまだのようです!"
} else {
comment += "本日、" + month + "月" + day + "日は、" + blog_titles[0] + "が投稿されました。読んでくださいね!";
}
// GoogleHomeに送信
googlehome.device('Google-Home', language);
googlehome.notify(comment, function(res) {
console.log(res);
});
});
Google Homeと同じネットワークで以下を実行
$ node notifier.js
実行結果
当日の更新がある場合
- Google Home
「クリスマスまで、16日だよ。本日12月9日は"Google Homeにアドベントカレンダーの更新状況を喋らせてみた"が投稿されました。読んでみてね!」
当日の更新がない場合
- Google Home
「クリスマスまで、16日だよ。しかし残念ながら、本日のアドベントカレンダーの投稿はまだのようです!」
難点
現状の実装だとGoogle Homeのネットワーク内でしか実行できないので、
毎回スクリプトを叩く必要がある。できたら自動化したかった・・・。
さいごに
アドベントカレンダーのおかげで、すでにGoogle Homeに色々やらせてみた実装は多く公開されていたので、組み合わせて割と簡単に実装ができました。
クリスマスまで、まだまだ日にちもあるので、これからも多くの情報が出てくると思うと楽しみです!
気になっているアドベントカレンダー
-
スマートスピーカー Advent Calendar 2017
https://qiita.com/advent-calendar/2017/smart-speaker -
おうちハック Advent Calendar 2017
https://qiita.com/advent-calendar/2017/ouch-hack