今日もごはんがおいしい
病めるときも健やかなるときも、ごはんがおいしい。
でも、たまに「おいしかったけど、なんだか空腹がおさまらないな」というときがある。
これって「新型栄養失調」予備軍かも。カロリーは足りているが、栄養素が足りていない状態を指すそう。これはまずい。まだまだ健康に、おいしくごはんを食べたい。
LINE Bot でなにかつくれないだろうか。
ドカ食いを止めてほしい
イメージとしては、お抱えのパーソナル栄養士さんとか、そんな感じのものがほしい。
欲望のままにどら焼きにかぶりつく私に「お待ちなさい」と声をかけてほしい。いろいろと妄想は膨らむが、今回は以下を目指すこととする。
【目標】
■ 例えば「甘いもの」が食べたいとき、真に体が欲している栄養素を知りたい
■ その栄養素が含まれているレシピを探しやすくしたい
技術・環境
LINE Bot(LINE Developers)
Node-RED(FlowForge)
楽天レシピカテゴリ一覧API (version:2017-04-26)
爆誕
うちの栄養士、紹介しますね。
リッチメニュー(画面下部のイラストのボタン)を押すことで「今なにを食べたいか」をメッセージとして送信すると、必要な栄養素とおすすめレシピを教えてくれます。
この、無口だけど欲しい言葉をくれる感じと、のんびり屋さんなところ、嫌いじゃない。
改善の余地あり
つくりかた
【流れ】
■ LINE Developers で リッチメニュー をつくる
■ Node-REDで 楽天レシピカテゴリAPI を呼出して値を取得、ユーザに渡す
■ LINE Developers で リッチメニュー をつくる
素晴らしき先人のお知恵を借りて作成しました。記事の最後に掲載しております。
テンプレートを選択して、画像を埋めていくだけの簡単作業でした。
ただ「アクション」という、「ユーザがボタンを押したらどうする」の設定をする必要があります。今回は、各ボタンを押したら、それ毎に「あまい」といったテキストを保持するようにしました。
■ Node-REDで 楽天レシピカテゴリAPI を呼出して値を取得、ユーザに渡す
フローのイメージとJSONコードは以下のとおりです。
タコ足配線だっていいじゃないか、初心者だもの。
APIキー、チャネルアクセストークン、チャネルアクセスシークレットといったものは個人毎のものですので「xxx」などに置き換えています。
[{"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)ソースコード工夫して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)