【楽天レシピAPI】ドカ食いを止めたくてLINE Botに泣きついてみた

# 今日もごはんがおいしい
病めるときも健やかなるときも、ごはんがおいしい。

でも、たまに「おいしかったけど、なんだか空腹がおさまらないな」というときがある。
これって「新型栄養失調」予備軍かも。カロリーは足りているが、栄養素が足りていない状態を指すそう。これはまずい。まだまだ健康に、おいしくごはんを食べたい。
**LINE Bot でなにかつくれないだろうか。**

# ドカ食いを止めてほしい
**イメージとしては、お抱えのパーソナル栄養士さんとか、そんな感じのものがほしい。**
欲望のままにどら焼きにかぶりつく私に「お待ちなさい」と声をかけてほしい。いろいろと妄想は膨らむが、今回は以下を目指すこととする。

:::note info
【目標】
　■ 例えば「甘いもの」が食べたいとき、真に体が欲している栄養素を知りたい
　■ その栄養素が含まれているレシピを探しやすくしたい
:::

# 技術・環境
LINE Bot（LINE Developers）
Node-RED（FlowForge）
楽天レシピカテゴリ一覧API (version:2017-04-26)

# 爆誕
うちの栄養士、紹介しますね。
**リッチメニュー（画面下部のイラストのボタン）を押すことで「今なにを食べたいか」をメッセージとして送信すると、必要な栄養素とおすすめレシピを教えてくれます。**

https://twitter.com/xe_ay51938/status/1718439521958936599


この、無口だけど欲しい言葉をくれる感じと、のんびり屋さんなところ、嫌いじゃない。
~~改善の余地あり~~

## つくりかた
:::note info
【流れ】
　■ LINE Developers で リッチメニュー をつくる
　■ Node-REDで 楽天レシピカテゴリAPI を呼出して値を取得、ユーザに渡す
:::

### ■ LINE Developers で リッチメニュー をつくる
素晴らしき先人のお知恵を借りて作成しました。記事の最後に掲載しております。

テンプレートを選択して、画像を埋めていくだけの簡単作業でした。
ただ「アクション」という、「ユーザがボタンを押したらどうする」の設定をする必要があります。今回は、各ボタンを押したら、それ毎に「あまい」といったテキストを保持するようにしました。
![richmenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/64a5a8a8-bd88-b144-793d-d2247e24b53b.png)

### ■ Node-REDで 楽天レシピカテゴリAPI を呼出して値を取得、ユーザに渡す
フローのイメージとJSONコードは以下のとおりです。
タコ足配線だっていいじゃないか、初心者だもの。
![Node-REDflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/c7cd6c7a-7eed-7361-315d-c3aca64c1377.png)

APIキー、チャネルアクセストークン、チャネルアクセスシークレットといったものは個人毎のものですので「xxx」などに置き換えています。
```JSON
[{"id":"145e154b65a37fca","type":"tab","label":"LINEBot_1027③_qiita用","disabled":false,"info":"","env":[]},{"id":"5692ce4c79b64c1a","type":"Webhook","z":"145e154b65a37fca","name":"","url":"/webhook","x":100,"y":200,"wires":[["65ca826467a06ed5"]]},{"id":"87c2ceb81abe5419","type":"ReplyMessage","z":"145e154b65a37fca","name":"","replyMessage":"","x":1080,"y":300,"wires":[]},{"id":"65ca826467a06ed5","type":"switch","z":"145e154b65a37fca","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"あまい","vt":"str"},{"t":"eq","v":"しょっぱい","vt":"str"},{"t":"eq","v":"すっぱい","vt":"str"},{"t":"eq","v":"からい","vt":"str"},{"t":"eq","v":"あげもの","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":6,"x":290,"y":200,"wires":[["793c9a29c700b7ef"],["8dcc2dd51f2f7894"],["bd84cee48ccdae7a"],["9c68ae78e39ff6f1"],["9fdfa14eeedcb5bc"],["27ce70a0b0872fdd"]]},{"id":"793c9a29c700b7ef","type":"http request","z":"145e154b65a37fca","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://app.rakuten.co.jp/services/api/Recipe/CategoryList/20170426?applicationId=xxxxxxxxxxxxxxxxxxx","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":570,"y":80,"wires":[["0d92e26768daab73"]]},{"id":"0d92e26768daab73","type":"function","z":"145e154b65a37fca","name":"あまい","func":"//あまい：肉\nmsg.payload = \"タンパク質不足かも？「肉、魚、卵」がおすすめ⇒\" + msg.payload.result.large[1].categoryUrl;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":790,"y":80,"wires":[["87c2ceb81abe5419"]]},{"id":"8dcc2dd51f2f7894","type":"http request","z":"145e154b65a37fca","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://app.rakuten.co.jp/services/api/Recipe/CategoryList/20170426?applicationId=xxxxxxxxxxxxxxxxxxx","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":570,"y":180,"wires":[["3e403d56537c06a0"]]},{"id":"bd84cee48ccdae7a","type":"http request","z":"145e154b65a37fca","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://app.rakuten.co.jp/services/api/Recipe/CategoryList/20170426?applicationId=xxxxxxxxxxxxxxxxxxx","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":570,"y":280,"wires":[["91bea675a115a1ec"]]},{"id":"9c68ae78e39ff6f1","type":"http request","z":"145e154b65a37fca","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://app.rakuten.co.jp/services/api/Recipe/CategoryList/20170426?applicationId=xxxxxxxxxxxxxxxxxxx","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":570,"y":380,"wires":[["5e80d3632c7bb2e9"]]},{"id":"9fdfa14eeedcb5bc","type":"http request","z":"145e154b65a37fca","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://app.rakuten.co.jp/services/api/Recipe/CategoryList/20170426?applicationId=xxxxxxxxxxxxxxxxxxx","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":570,"y":480,"wires":[["d0073324fb050118"]]},{"id":"3e403d56537c06a0","type":"function","z":"145e154b65a37fca","name":"しょっぱい","func":"//しょっぱい：貝\nmsg.payload = \"ミネラル不足かも？「貝、海藻、大豆」がおすすめ⇒\" + msg.payload.result.medium[23].categoryUrl;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":180,"wires":[["87c2ceb81abe5419"]]},{"id":"91bea675a115a1ec","type":"function","z":"145e154b65a37fca","name":"すっぱい","func":"//すっぱい：豆類\nmsg.payload = \"クエン酸・ミネラル不足かも？「豆類、梅干し、海藻」がおすすめ⇒\" + msg.payload.result.medium[359].categoryUrl;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":280,"wires":[["87c2ceb81abe5419"]]},{"id":"5e80d3632c7bb2e9","type":"function","z":"145e154b65a37fca","name":"からい","func":"//からい：野菜\nmsg.payload = \"タンパク質・抗酸化ビタミン不足かも？「緑黄色野菜、肉類、魚介類、」がおすすめ⇒\" + msg.payload.result.large[14].categoryUrl;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":790,"y":380,"wires":[["87c2ceb81abe5419"]]},{"id":"d0073324fb050118","type":"function","z":"145e154b65a37fca","name":"あげもの","func":"//あげもの：ほうれん草\nmsg.payload = \"カリウム不足かも？「納豆、ほうれん草、アボカド」がおすすめ⇒\" + msg.payload.result.medium[350].categoryUrl;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":480,"wires":[["87c2ceb81abe5419"]]},{"id":"27ce70a0b0872fdd","type":"template","z":"145e154b65a37fca","name":"ほか","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"「新型栄養失調」で不足している栄養素を調べて、ぴったりのレシピを探そう！\nhttps://recipe.rakuten.co.jp/","output":"str","x":550,"y":580,"wires":[["87c2ceb81abe5419"]]}]
```

* 「/webhook」ノードを設定し、ユーザからのリッチメニューメッセージを受取る
* 「switch」ノードにて、メッセージの内容を判定し、後続ノートに引継ぐ
* 各「http request」ノードにて、「楽天レシピカテゴリAPI」情報を取得する（※1)
* 各「function」ノードにて、取得した情報とテキスト情報を編集する（※1)（※2)
* 「template」ノードにて、固定メッセージを設定する
* 「ReplyMessage」ノードにて、ユーザにメッセージを渡す

（※1)ソースコード工夫して１ノードにしたかったが時間切れ
（※2)ランダムでレシピを提案するようにしたかったが時間切れ。カテゴリトップを表示する仕様。

# おわりに
無骨ながら優しい、マイ栄養士をつくることができた
今後は衝動食いの前に、彼（彼女）に質問することにします。

以前の Qiita APIに記事に同じく、LINE Bot もまったくの初心者だったけれど、なんやかんや動くものができました。アイデア次第で、面白いものを比較的簡単に形にできる手段だなと感じました。次回挑戦する際は今回できなかったことに加えて、イケボでメッセージを読み上げてくれるように進化させたいです（オタクの悪いところ出ちゃってる）。

最後までお読みいただき、ありがとうございました！

# 参考
リッチメニュー画像の作り方から設定方法まで徹底解説
(https://line-sm.com/blog/howtomakerich-menus/)

楽天レシピカテゴリ一覧API (version:2017-04-26)
(https://webservice.rakuten.co.jp/documentation/recipe-category-list)