子育てと家族とLINE Messaging APIと

# 自己紹介

## 私

* 29歳、男性
* 会社員
* iOSエンジニア

## 家族構成

* 妻
    * 専業主婦
    * やさしい
* 娘
    * 2歳
    * かわいい

# 本題

LINEMessagingAPI（いわゆるLINEBotというやつ）を使って家族のコミュニケーションを円滑にしようとしている話をしたい。
一部子育てにも触れるが、子育てに限定された話ではなく家族全体の話が多い。

私は会社員なので日中は会社にいて家族と触れ合う時間というのはない。
その辺のパパと同じで、妻からLINEでたまに送られてくる娘の写真や音声メッセージに癒やされたりしているわけである。
また、私は兄弟姉妹が多く全員がLINEで繋がっているため、日夜膨大な量のやり取りがLINE上で行われている。

だがしかし、エンジニアとはSlackを使いたい生き物。私も例外ではない。
非エンジニアの妻も快くSlackをインストールしてくれてそこそこ良い雰囲気だったのだが、やはり親族とのやり取りはLINE一択。
およそ3日でSlackのチャンネルは過疎と化し、ついにはiPhoneのホーム画面から消え去った。
LINEの強大な流れには抗えない。全てのコミュニケーションの中心はLINEなのである。

# LINEMessageingAPIについて

LINEMessageingAPIについて少し触れておきたい。

## 機能制限

私的利用でフリーのプランを選択したいがために幾つかの機能制限が立ちはだかる。
その最大の制限は**PushAPI利用不可**だ。

[LINEMessageingAPI](https://business.line.me/ja/services/bot)のページによると以下のようなプランが選択できる。（2016/12/19時点）

<img width="1010" alt="スクリーンショット 2016-12-05 12.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/50541/6b768104-bf05-1cfe-274f-3ff25f44b980.png">

DeveloperTrialならPushAPI使えるんやん？と思ったがグループチャットに参加できる権限がない。
私的利用で毎月21,600円払うのは大変だなと思ってたとき、代替案を思いついた。

それが[LINENotify](https://notify-bot.line.me/ja/)の利用である。誰でも思いつきそうではあるが。
通知専用の公式アカウントという位置づけらしい。APIも公開されておりこれを使わない手は無い。

## ハマった点

LINEMessagingAPIで作ったBotはグループチャットへ参加できると公式で言及されていたような気がするが、いざ参加させてみると招待済みから先にステータスが進まない。
メンバーの承認が必要だか、許可する設定があるだかわからないのだが、既存のグループチャットに上手く参加してくれない事があった。
今は治っているかもしれないが、グループの初期メンバーを自分とBotの二人から初めて、そこにメンバーを招待すると上手くいった。
これについては誰か教えてください。

## 構成

ということで我が家のグループチャットは以下のような構成になっている。

* 私
* 妻
* LINENotify
    * 通知系
* LINEMessagingAPI
    * 返信系

便宜上、LINENotifyとLINEMessagingAPIを合わせて`LINEBot`と呼ぶことにする。

# 機能

さて、本題の中の本題。我が家のLINEBotが提供している機能を順番に紹介しよう。
どんな便利なLINEBotがいるかと思えばそんなこともなく、正直言ってまだしょぼい。
今回は機能と使用技術の紹介のみとし、ソースコードの解説は控える。もし需要があれば別途投稿するかもしれないが、その需要が無いことを願っている。

## 1. 音声メッセージを解析して返信してくれる

冒頭で述べたが、我が家のチャットには音声メッセージが頻繁に送られてくる。
というのも、娘がまだ２歳なため文字がわからない。そんなときは音声メッセージが送られてくるのである。口だけは達者だ。
ただ仕事中だとスピーカーから音声を流すのが躊躇われるため、娘からのメッセージをすぐに受け取ることができない。
よってこの機能が考案された。
音声解析結果のトップ3件が信頼度付きで出力される。
チャット内の雰囲気はこんな感じだ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/29e8c3d1-2734-a999-c3bb-ce34dfafe15c.png" width=480 />

これはとんでもない緊急事態だ。「今日は早退します」という言葉が頭の中をよぎる。
一応メッセージを聞いてみた。

> パパお友達気をつけてパパ気をつけて

なるほど、「お仕事頑張って」みたいなことを伝えたかったのかもしれない。わからん。

さて、しばらく経つとまたメッセージが送られてきた。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/ab08b8cf-eb20-686d-c9e6-5b4964a006d9.png" width=480 />

ここまで来ると、なんと言っているか予想をすることすら困難である。
2,3番目にサジェストされた「チャチャチャ」のリズムがどうしても頭から離れない。
一応メッセージを聞いてみた。

> 気をつけてパパ気をつけて

信頼度とは。
私の心配性をしっかりと継承しているなと再確認できた。

違う意味での面白さがこみ上げてきたのでもう一つ紹介させてほしい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/1b91e8cc-2e29-6dfc-5877-019469fe90f0.png" width=480 />

もはやなんと言っているかは二の次。
上2つのテンションと「携帯カバー」のそれが異なり過ぎている。テンションというよりも方向性という方が正しいだろうか。
確かに1,2番目を超えないといけないという3番目の身にもなってみてほしい。
そのプレッシャーたるや、甲子園決勝、9回裏2アウト満塁、逆転のピンチ、2ストライク追い込んで残り1球。のそれに近い。
このままストレートで押し切るか、あるいは決め球のフォークで三振を取りに行くか。この選択が命運を分ける。
最終打者として打席に立つ私。狙い玉はストレート。さあ、正々堂々勝負しようではないか。
この土壇場で我が家のLINEBotが選択したのは牽制球。そしてまさかのアウト、試合終了。
私の期待という名のバットは空を切ることもなく、虚しくそこに立ち尽くした。
試合終了のサイレンが鳴り響き、私の夏は終わった。
優勝おめでとう。

話は戻るが、総じてこう文字列化されるととても無機質だ。可愛さの欠片もない。意味もわからない。しかも心臓に悪いときた。
そういった問題もあり、一番の目玉であるこの機能は早々に削除されるかもしれない。

使用技術は以下のとおりである

* Google Speech API (Private API)
    * Chrome-devグループに加入すれば使用できるPrivate API
    * GCPが提供している[Google Cloud Speech API](https://cloud.google.com/speech/?hl=ja&utm_source=google&utm_medium=cpc&utm_campaign=2016-q2-cloud-japac-jp-speech-bkws-freetrial-jap&utm_term=%2Bgoogle%20%2Bspeech%20%2Bapi&gclid=CPrimqas3NACFdcTvQodSdMDoA)とは異なる
    * 詳しくは[こちら](http://qiita.com/lethe2211/items/7c9b1b82c7eda40dafa9)が参考になる
    * 補足だが私の音声に対してはかなりの正答率だった
* ffmpeg
    * LINEから取得できる音声のフォーマットが`audio/m4a`なのに対し、SpeechAPIが許容するフォーマットは`audio/l16`などに限定されている
    * なのでffmpegを用いて変換する必要がある
    * [cloudconvert](https://cloudconvert.com/)というWebAPIを使おうと思ったが、フリーだと25変換/日に限定されているのでやめた

## 2. 特定の文字列が含まれるメッセージに対して何かしら返信する

さて、1.でだいぶ飛ばしてしまった。脱線しすぎて読者の皆様との温度差がすごいことになっていそうだ。
よってここからはすごく真面目に淡々と話をしたいと思う。

### 2-1. **101**

この数字でピンとくる人はどれくらいいるだろうか。ピンとこなくても普通なので安心して欲しい。
妻は101匹わんちゃんが大の大好きだ。もう一つ大をつけてもいいくらいかもしれない。
なのでチャットには度々`101`という文字列が流れることになる。
そんなときは大好きな101匹わんちゃんの画像で癒されてもらおう。
一種の福利厚生のようなものだ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/897bcf55-fd67-198f-b69f-6572e99d621b.png" width=480 />

著作物が含まれるので一部モザイクをかけます。

使用技術は以下のとおりである

* [Google Custom Search](https://cse.google.co.jp/cse/)
    * Image searchを使用

### 2-2. う◯ち

ごめんなさい。
う◯ちは子供の健康を管理する上では欠かせない大事なバロメータの一つだ。今日は出たとか出てないとか、硬いとか緩いとか、そんな会話も日常茶飯事である。
子育てをしたことがあればお解り頂けると思うが、たとえ食事中だろうと関係ない。こちとら真剣なのだ。
なのでこれに対しては丁寧にスタンプで返信してもらおう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/6c64e9c9-8740-92e9-e8bc-86e7676069cf.png" width=480 />

この会話に入れるものなら、君も立派な家族の一員さ。
もう少しこじらせみると、[ウンログ](https://unlog.me/)連携してログをとるなんていう未来も見えてくるかもしれない。

### 3-3. 今日が何の日か教えてくれる

このLINEBotは話のネタまで提供してくれる。`今日`や`明日`という文字列に反応して、その日が`何の日`なのかを教えてくれる。
正規表現的には`/今日|明日|明後日|昨日|一昨日/`である。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/a1068db6-d32a-d3ee-1586-6c6c5215b15e.png" width=480 />

どんなシリアスな話をしていてもお構いなし。無邪気に`何の日`か教えてくれるので「お、おう」となるときもあるが、そこはご愛嬌ということで大目にみてやってほしい。

使用技術は以下のとおりである

* [Nokogiri](https://github.com/sparklemotion/nokogiri)
    * どこからしらのWebサイトからスクレイピングしている

## 3. 予定を通知する

我が家の予定はGoogleカレンダーで管理されている。
子供の習い事や病院、クリスマス会の日程、先月生まれたばかりの甥っ子の誕生日まで全てだ。
ついつい予定を確認するのを忘れてしまいがちだが、毎日20:00になると、次の日の予定があったときそのリストを通知してくれる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/3a43fabf-db38-082c-fc91-d9d430f5cb6f.png" width=480 />

もっとも、先月生まれた甥っ子と私の娘の誕生日が奇跡的に一致したため、甥っ子の誕生日を忘れることはまず無いだろう。
だがそんなことは関係ない、無心でGoogleカレンダーに登録するのみ。

使用技術は以下のとおりである

* [Google Calendar API](https://developers.google.com/google-apps/calendar/)

## 4. 天気を通知する

さて、ここからは「[IFTTT](https://ifttt.com/discover)でもいいじゃない」という意見もちらほら聞こえそうな気がする。
そうです、そんなあなたは正しいです。でも自分で実装してみたいという気持ちも理解して頂きたい。
ブラウザの戻るボタンを押すのを止めていただき、もう少しお付き合いくださいお願いします。

子育てには体力が必要だ。よって体力の維持を目的として、天気のいい日はサイクリングをすることにしている。
サイクリングは天候にとても左右される。怪我するのは嫌なので雨の日には乗らないようにしたい。
前日20:00と当日8:00にその日を含む週間天気予報を通知してくれる。その他`天気`という言葉にも反応する。
今日一日、雨振らなそうだなとわかれば気兼ねなくサイクリングを楽しむことができるだろう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/68d1c6f2-bd9c-30f4-1e72-dcefaba83396.png" width=480 />

これもどこかしらのサイトをスクレイピングして取得している。一番天気予報が当たりそうなページをチョイスした。

## 5. ゴミの日を通知する

そろそろパッとしなくなってきた。尻窄みもいいところだ。
ということで機能紹介はこれで最後にしよう。

朝のゴミ出しは夫の仕事というのが定説だ。普段家事を妻にまかせっきりなので、これぐらいはちゃんとこなしたいものである。
我が家のLINEBotはゴミの日の前日22:00と当日8:00に通知してくれる。
安心の２段構えだ。これでゴミ出しの仕事を完璧にこなすことができるだろう、ぬかりなし。と、機能をリリースした当初は考えていた。
しかし、忘れてしまうことがしばしばある。なんなら今日も忘れてきた。
なぜだろう。もしかしたら２段構えにしてるのが良くないのかもしれない。
夜通知が来ても「平気平気、明日も通知くるから。明日やろう。」となってしまう。で、朝起きてから家を出るまでの時間が極端に短く、忘れてしまう。
この機能は早急に改善が必要だ。
機能のせいにして自分を律しようとしない、典型的なダメな夫の思考回路そのものだ。
やっぱり意識改革の必要があるようだ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50541/59378813-77c6-761d-c4a1-e49a94f00b5d.png" width=480 />

# 開発環境

申し訳程度に開発環境を紹介しておく。
もっとも、WebAPIをマッシュアップするスタンスなので特に目新しいことはない。

サーバーは部屋の片隅に追いやられた自宅サーバーである。
`Ubuntu16.04`, `nginx`, `unicorn`, `sinatra`というよくある環境だ。

# 最後に

こうして、三人は末永く幸せに暮らしましたとさ。おしまい。（雑）