八発白中

技術ブログ、改め雑記

割と本気で家庭用Slack Botを作ってみた

僕は妻と二人暮らしをしています。かつてはLINEを使って普段のやり取りをしていたのですが、一年ほど前からSlackを使い始めました。

Slackの良いところはハッカビリティが高いところです。Google Calendarなど他のサービスと連携することができるし、IFTTTを使って多少凝ったこともできます。

IFTTT時代

IFTTTを使えば天気予報をSlackチャンネルに流せます。

f:id:nitro_idiot:20160113142319p:plain

英語というのは不本意ですが、一応今日の天気はわかります。英語が読めなくてもアイコンを見れば、雨が降りそうな気がするってくらいはわかります。

しかし、しばらく運用しているうちに疑念が。

f:id:nitro_idiot:20160113144739p:plain

天気予報が当たらない。

IFTTTが連携している天気予報は「The Weather Channel」の情報なのですが、これが日本の気象庁の予想と違っていて全然当たらない。

ちなみにiOS8から標準の天気アプリが提供している予報もこの情報のようです。

当たらない天気予報をいつまで見ているのもバカらしい。そこで移行を考えます。

myThings時代

myThingsはYahoo Japanが提供するIFTTTのようなサービスです。IFTTTと違って日本製なので日本語で使えますし、日本ローカルなサービスの対応も手厚いです。

f:id:nitro_idiot:20160113145714p:plain

myThingsはYahoo!天気に対応しているので、ルールを追加するだけでSlackに導入できます。

f:id:nitro_idiot:20160113145100p:plain

Slackの連携に自分のアカウントを使ってしまったため僕が毎日投稿しているように見えるのがかっこ悪いですが、まともな天気予報を知ることができるようになりました。

Hubot時代

しかし人間は欲深い。myThingsを使い始めて程なく不満が出てきます。

「一目で天気がわかるようにアイコンが欲しい」
「降水確率20%って傘必要?不要?」
「URLの展開が幅とりすぎ」

こうなると自分でボットを運用したほうが良さそうです。

カッとなった僕は、おもむろに趣味用に転がしてるさくらVPSにHubotをデプロイし、最強の家庭用Botを作る旅に出ました。

毎朝、天気予報を投稿する

f:id:nitro_idiot:20160113145529p:plain

まずは天気予報の投稿の改善から。Yahoo!天気はAPIが無いので実装が少しばかり複雑です。

APIはありませんが、公式のTwitterアカウント(@Yahoo_weather)が毎日「#東京の天気」というハッシュタグ付きでひと言ツイートをしています。

これが読むのにちょうどいい長さ。TwitterのSearch APIを叩いて「#東京の天気 from:Yahoo_weather」の最新ツイートの本文をSlackに流しました。

これだけでは味気が無いので、Yahoo!天気の東京の天気のページスクリーンショットを撮り、ImageMagickで今日の天気の部分だけ切り出して、切り出した画像をGyazoに投稿してSlackに流しました。

スクリーンショットの撮影にはpython-webkit2pngを使っています。サーバにQtのインストールが必要です。

試行錯誤の結果、今のところ不満はありません。

電車が遅延しているときに報告する

f:id:nitro_idiot:20160113151912p:plain

いざ出かけようというときに利用する予定の電車が止まっていて迂回しないといけない、ということが稀によくあります。

そこで、よく利用する路線の遅延情報をSlackに流すことにしました。

JRの運行情報東京メトロの運行情報スクレイピングして、よく使う路線の遅延情報を得ます。

今のところ遅延しているときには自動で教えてくれるようになっています。遅延が解消されたときには改めて教えてくれます。「fukabot 遅延」と話しかけると遅延しているかどうかに関わらず登録しているすべての路線の情報を教えてくれます。

常に流れていてもうるさいだけなので、平日の通勤時間(8:30〜9:59と18:30〜19:59)と、土日のみ動くようになっています。

宅配便が届く時間を投稿する

f:id:nitro_idiot:20160113172140p:plain

宅配便が届くときには家に誰かがいないといけません。けれど「何日の何時に荷物が届く」というのをいちいち口頭で共有するのは面倒です。そこでSlack Botに自動で報告させるようにすれば忘れることもありません。

クロネコヤマトや佐川急便は、Webでユーザー登録をすると配達予定をメールでお知らせしてくれます。GmailAPIを叩けば配達予定お知らせメールが届いているかはわかるので、それをSlackに投稿するだけです。

Slackの投稿のタイトル部分が配達業者のWebサイトへのリンクになっていて、変更したい場合はすぐにWebサイトから変更できます。

現在、AmazonやSEIYUネットスーパーにも対応しています。どれも事前にメールを送ってくれるので、本文のパース部分以外は同じです。

スーパーのお買い得情報をお知らせする

f:id:nitro_idiot:20160113181048p:plain

最近はネットスーパーを利用し始めましたが、魚や肉は店頭で見て買いたいので最寄りのスーパーも利用します。

我が家では毎夕にシュフモが提供するお買い得情報がSlackに流れます。

チラシのような表示をそのまま活かしたかったのでテキストではなく、スクリーンショットを撮ってImageMagickで切り抜き、Gyazoにアップロードして利用しています。

夫婦の記念日をお知らせする

f:id:nitro_idiot:20160113172956p:plain

普通の機能だけではつまらない。せっかく夫婦で使っているので、夫婦っぽく記念日の情報とか流してみることにしました。

はてなカウンティングでカウントアップを作成し、そのスクリーンショットを撮って切り抜き、Gyazoにアップロードします。

記念日とキリの良い日数のときにお知らせしてくれます。「fukabot 記念日」と言うとすべての記念日情報を教えてくれます。

f:id:nitro_idiot:20160113173258p:plain

適当に作ってみたのですが、今のところ妻の反応が一番良かった機能です。

書籍の情報を教える

f:id:nitro_idiot:20160113165121p:plain

夫婦の間では読んでる本や読みたい本の話をすることが多いです。

「この本買おうと思うけど」みたいな話をするときに、Amazonだといくらか、Kindleで買えるか、図書館で借りられるかを知りたい。そこで、Slackで書籍のタイトルを言うと書籍の情報を表示してくれるようにしました。

まずは楽天ブックスAPIで検索をしてISBNを取ります。これを使ってAmazonにアクセスして書籍や電子書籍の価格、サムネイルなどを取得します。図書館の貸し出し状況の確認にはカーリルAPIを使っています。

「book:本のタイトル」と言うことでも反応するので会話の中に埋め込みやすいです。

f:id:nitro_idiot:20160113171815p:plain

夫婦の読書状況を共有する

f:id:nitro_idiot:20160113174934p:plain

引き続いて本の機能です。夫婦共に日常的に本を読みます。今相手が何の本を読んでいるか、面白いか面白くないか、などの話をよくします。

夫婦二人とも読書メーターを使っているので、読み始めた本や読み終わった本が追加されたときにSlackに流すようにしました。

読書メーターにはAPIが無いのでスクレイピングしています。

まとめ

他にスケジュールの共有やゴミ出しの日のリマインダ、タスク管理などもSlackに連携しています。

紹介した機能は既存のHubotスクリプトを使わずに全てCommon Lispで実装しています。

既存のものを使わないので細かい調整ができるし、試行錯誤しながら夫婦に合わせてカスタマイズができます。

今のところ著しく生活が豊かになった、という実感はないですが、今後も生活の中でできるところは自動化なり何なりしていきたいです。プログラマですからね。