昼飯を決めてくれるAPI/LINE-Botを作ってみた

# はじめに
みなさんお昼ご飯はどのようにしていますか？
選択肢は主にこうだと思います。

1. お弁当
2. 食堂
3. 外食
4. 食べない

私は少しお金がかかるなーと思いつつ、"3.外食"をランチ仲間と行くことが多いです。

ただ昼飯を決めるというのは毎日のことで、段々とどこで何を食べるかを決めるのが億劫になってきます。
これをアプリを作ってなんとかできないか、単調な昼飯の時間をおもしろくできないかと取り組んでみたので、今回はそれを紹介します。

ちょっとしょぼいですが。。

# やりたいこと

いくつかあります！

## 1. 昼飯をいい感じに決めてくれる

![fullsizeoutput_df.jpeg](https://qiita-image-store.s3.amazonaws.com/0/103339/54a5bc4c-a18c-85cf-ae27-25525dfbec46.jpeg)

職場付近の昼飯できるスポットを自動的に勧めてくれるとうれしいです。
勧めてくれるスポットはもちろん定休日ではないところだし、人数は考慮してくれるし、昨日ランチした場所はお勧めしません。
雨の日なんかは職場からなるべく歩かなくて済むよう近い場所を勧めてくれます。

## 2. LINEに通知してくれる

![smartphone_photo_satsuei_man.png](https://qiita-image-store.s3.amazonaws.com/0/103339/03b7fefc-9bbd-5bfc-b175-0ccf202ab70a.png)

我々ランチ仲間はプロジェクトやチームが違っていて、同じ事業所でも少し離れたところにいます。
なのでLINEで「いく」、「いかない」の連絡を取り合っています。
そこでの会話にお勧めのランチが直接通知が来たらとてもうれしいです。

もちろん我々はLINEを使ってますが、Messenger, Slack, WeChatなどを使っていたらそっちにも通知できるようにしたいです。

## 3. 飯リスト・飯情報を編集できる

![smartphone_computer_nouka.png](https://qiita-image-store.s3.amazonaws.com/0/103339/b9e80ef5-b1e5-a681-aa98-14fd7487abed.png)

新しく開拓したご飯屋さんは追加したり、口コミ情報・評価なんかを加えて記録を残したいです。
加えたご飯屋さんは当然、通知される昼飯候補になります。
また、逆に候補から外したいものは後から調整します。

## 4. 仕事場付近の昼飯情報を共有できる

![pasokon_kyoushitsu_woman.png](https://qiita-image-store.s3.amazonaws.com/0/103339/823dab22-2aa6-2a43-a185-83b208ef3221.png)

「飯を決めてくれる」とは少し違いますが、あるとうれしいです。
テレビ番組で水卜アナが「先輩アナがランチマップのExcelを見せてくれた」というエピソードを語っていました。
これと同じようなことをExcelじゃなくて、Webアプリやネイティブアプリでやりたいです。
同じ事業所の後輩や他のチームの人とワイワイ楽しめたらいいですね。

他にもありそうですが、なんとなくローカルコミュニティで楽しめる昼飯アプリを作りたい気がします。
そして、それは普段慣れ親しんでいるRedmine, GitLab, Mattermostのようなローカルコミュニティで動かすOSSのイメージです。

# これまでやったこと

実は簡単なことは既に試していました。
チャットボットのHubotで飯のリストからランダムに選んでMattermostやSlackに通知させてました。
ただ飯のリストを更新する度にPull Requestを送るのが面倒だったり、DBを使ってなかったので情報をたくさん乗せようとすると大変になるのが目に見えていました。

# 今回やったこと

昼飯スポットを登録・削除・編集できるREST-APIを作りました。
そして、登録した飯スポットからおすすめを選んでくれるAPIも用意しました。
https://github.com/tochi-y/meshi-api

REST-APIさえあれば、Hubotからもコールできるし、GUIを作った時に使えると思ったからです。

全部自力でも書けますが、ボイラーテンプレートのコードがあったので今回はそれをベースに改造しました。
https://github.com/KunalKapadia/express-mongoose-es6-rest-api

使用イメージはこうです。

```shell-session
$ curl -X POST \
> -H 'Content-Type: application/json' \
> -d '{"name": "とんかつ"}' \
> ${MESHI_API_URL}/api/meshi
{"__v":0,"name":"とんかつ","_id":"5a3fdcf95ee06a0022939eb4","createdAt":"2017-12-24T16:59:37.980Z"}
```

nameはジャンルでも店名でもなんでもよいです。
今はnameしかないですが、増やしていきます。

店を選ぶ時はこうします。

```shell-session
$ curl -X GET \
> ${MESHI_API_URL}/api/meshi/random
{"_id":"5a2ead530697420022b4af97","name":"タイ料理","createdAt":"2017-12-11T16:07:47.405Z","__v":0}
```

登録した昼飯スポットの中から選んでくれます。
今は単純にランダムで選んでいるだけですが。。

なお、手持ちのHubotがたまたまなく、テスト用にLINE-BOTを試していたらAPI自体にその仕組み自体を組み込んでしまいました。簡易的なものはHubotなしでこれ単体でできます。

LINEを使った時の利用イメージはこんな感じです。

![fullsizeoutput_dd.jpeg](https://qiita-image-store.s3.amazonaws.com/0/103339/3e0bd3e5-b6b5-3fa1-2ed8-280711f63611.jpeg)

LINE上のBotは[LINE公式ドキュメント](https://developers.line.me/ja/docs/messaging-api/building-bot/)を見ながら作りました。

作ったBotの各情報を以下環境変数に設定してアプリを起動させるとLINE連携できるようになります。

- LINE_CHANNEL_ACCESS_TOKEN
- LINE_CHANNEL_SECRET
- LINE_NOTIFICATION_TO_ID (ユーザID, トークルームID, グループIDのいずれか)

通知のスケジュールは[node-cron](https://github.com/kelektiv/node-cron)のパターンを使って環境変数に設定します。通常のcronと違って秒の項目があります。

- NOTIFICATION_SCHEDULE (例えば、平日12時に通知するには'0 0 12 * * 1-5')

# 今回できなかったこと & 今後やりたいこと

このままだとしょぼい。。以前のHubotでランダムで選ぶやつとほとんど変わらないです。
今回はできなかったのですが、やりたかったことはたくさんあります。
例えば、

- 昨日オススメした昼飯は選ばない
- 定休日を考慮して昼飯を選ぶ
- 雨の日は職場に近い場所の昼飯を選ぶ
- 口コミ情報・評価の情報を登録する
- 今いる場所から近い店を探せる
- 食べログ・ぐるナビ・Yelpの情報と連携する(ぐるナビとYelpはAPIがあったのでそれを使う)
- 「飯」or「めし」が含まれるとどんな文章でも反応してしまい、「うらめしや」みたいな会話でも反応するので、~~無駄に~~形態素解析して必要な名詞部分のみに反応させる
- ~~無駄に~~AIが学習して昼飯を選んでくれる
- GUIを作る

などなどです。ですが、すみません。今回はほとんどできませんでした。
言い訳すると
「本業のお仕事」 || 「家族サービス」 || 「睡眠時間」 >>>>>>> 「飯API/Botの開発」
の優先度でしか開発できず、中々時間がとれませんでした。

きちんとできて発表できたらよかったのですが、不完全のまま公開してオープンイノベーション起こすのもOSSコミュニティーかと思い、OSS化してます。
これを完成させるためにはみなさま開発者の協力が必要です。

# おわりに

楽しい昼飯ライフを！
また、コントリビューター絶賛募集中です！