ダイエットもChatGPTの時代！ヘルシーレシピBotをつくる


こんにちは、デザイナーをやっている**ウエハラ　シンペイ**です。


![3452306_m.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/f2232dbe-8ae9-d532-b1bf-021d550390d5.jpeg)


# そろそろ本気でダイエットしようじゃないか
30代も後半に差し掛かり、健康も体型も気になるところ。これまでも何度か挑戦してきましたが少し痩せたら元の生活に戻るを繰り返してました!今回はChatGPTの力を借りて、この続かない問題を解決してやろうと思います！

運動もいいんですが、働き盛りでもある30代はなんやかんや時間がない。そして1時間歩いてもご飯１杯分くらい。やっぱ普段の食生活から変えていかないと大きな効果は期待できないし、何しろ続かない。となると、食事を変えていくしかないんですが、いくつか問題が。。。



### 食事のカロリーってよくわからない
自炊だとカロリーがよくわかんないんですよね、なんとなくヘルシーそうなイメージで野菜とか鶏肉を使うけど、それが**結局何カロリーかはわからず感覚でしかない。** むしろコンビニで買う方がしっかりカロリー表記してあるんで、わかりやすいんでがお金もかかるし、何しろ飽きる。



### 自炊のレパートリーが少ないし、全体的にカロリー高め
料理は嫌いではないんですが、**できる料理が自分な好きなものから覚えていくんでカレーとか中華とかガッツリカロリーのものになりがち** で。そもそもヘルシーなものが好きならこんな問題にぶち当たってないだろうし。

あと、冷蔵庫の余り物を使うほどのスキルはないので一回で使い切ろうと思い、ついつい量が多くなっちゃてむしろ食べすぎてるなんてことも。



# 食材を入れるとヘルシーレシピを教えてくれるLineBotをつくってみました
ChatGPTとLINEMessagingAPIを組み合わせて、食材を入れるとヘルシーなレシピと想定カロリーを教えてくれるLine Botを目指します

![素材.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/cfa1477b-4b6a-3f3e-326c-dbe5109344bb.png)


### 開発環境
+ Github codespaces
+ node.js
+ axios
+ OpenAi API
+ LINEMessagingAPI

### 今回指定したプロンプト
プロがつくるような聞いたこともない調味料言われも困るので、一般家庭でできるようなものでお願いしました

+ 入力された材料でできる詳しいレシピ
+ ダイエットに向いているヘルシーな料理
+ 一般家庭でもできる料理
+ 最後に想定カロリーを必ず教えて

<details><summary>
実際のコード</summary>

```javascript:recipe.rb
'use strict';

// ########################################
//               初期設定など
// ########################################

// モジュールの読み込み
const line = require('@line/bot-sdk');
const OpenAI = require('openai');
const express = require('express');
// const dotenv = require('dotenv'); //dotenv使うときはコメントアウト外してください
// dotenv.config();

// 設定
const config = {
  channelSecret: process.env.CHANNEL_SECRET || 'XXXXXXXXXXXXXXXXXXXXX',
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || 'XXXXXXXXXXXXXXXXXXXXX',
};

// GPTのAPIKEY
const apiKey = process.env.OPENAI_API_KEY || 'XXXXXXXXXXXXXXXXXXXXX';
const openai = new OpenAI({apiKey});
const makeCompletion = async (userMessage) => {
  const prompt = {
      role: "system", 
      content: "入力された材料でできる詳しいレシピを教えてください\nダイエットに向いているヘルシーな料理\n一般家庭でもできる料理\n最後に想定カロリーを必ず教えて" // 新しいプロンプト
      
  };

  const sendMessage = [prompt, userMessage]
  console.log(sendMessage);
  return await openai.chat.completions.create({
    messages: sendMessage,
    model: "gpt-3.5-turbo-1106",
  });
};

const client = new line.messagingApi.MessagingApiClient(config);
// メッセージイベントの処理
async function handleEvent(event) {
  // テキストメッセージ以外は無視
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  const userMessage = {
    role: "user",
    content: event.message.text
  };

  // ChatGPT APIにリクエストを送る
  try {
    const completion = await makeCompletion(userMessage);
    // レスポンスから返答を取得
    console.log(completion.choices[0].message.content); // レスポンスをみたいときにコメントアウトを外してください
    const reply = completion.choices[0].message.content;
    // 返答をLINEに送る
    return client.replyMessage({
      replyToken: event.replyToken, 
      messages:[{
        type: 'text',
        text: reply
      }]
    });
  } catch (error) {
    // エラーが発生した場合はログに出力
    console.error(error);
    return Promise.resolve(null);
  }
}

// サーバー
const port = process.env.PORT || 3000;
const app = express()
  .get('/', (_, res) => res.send('hello LINE Bot'))
  .post('/webhook', line.middleware(config), (req, res) => {
    if (req.body.events.length === 0) {
      res.send('Hello LINE BOT! (HTTP POST)');
      console.log('検証イベントを受信しました');
      return
    } else {
      console.log(req.body.events);
    }
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
  })
app.listen(port);
console.log(`PORT${port}番でサーバーを実行中です`)
```
</details>

### 冷蔵庫の余り物でできるヘルシーレシピBotできた！
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/8fd5158e-e26a-c731-8e81-834571ef11cd.png">

米はカロリー高いのか自然に外されてたり、生姜１片、しょうが１本とだいぶ怪しい所はありますが、まぁそこはお好みでくらいのレシピが無事返ってきました！


# よく考えたら冷蔵庫に余り物なんてなかったので、シンプルにおすすめを出す
よく考えたらそんなに冷蔵庫の余っているものなかったので、リッチメニューでランダムにレシピを表示する機能を追加しました。

![スクリーンショット 2023-11-21 19.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/2fcb5936-28f6-9585-3418-bf658439c333.png)

管理画面から簡単に設定できました！

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/d544d6e9-d949-cd1b-c05f-ee1f0c5f8ff0.png">



### これからは健康的な食生活を送れそうです！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ヘルシーレシピBotできた。ダイエット成功間違いなしや！<a href="https://twitter.com/hashtag/LINEDC?src=hash&amp;ref_src=twsrc%5Etfw">#LINEDC</a> <a href="https://twitter.com/hashtag/ChatGPT?src=hash&amp;ref_src=twsrc%5Etfw">#ChatGPT</a> <a href="https://twitter.com/hashtag/Protoout?src=hash&amp;ref_src=twsrc%5Etfw">#Protoout</a> <a href="https://t.co/KzBdOzzR5o">pic.twitter.com/KzBdOzzR5o</a></p>&mdash; PEI (@PEIxxxxxxxx) <a href="https://twitter.com/PEIxxxxxxxx/status/1726671660273762550?ref_src=twsrc%5Etfw">November 20, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 実際にレシピに沿ってつくってみた

### 鶏胸肉と野菜のスティック焼き

材料:
- 鶏胸肉（薄切り）: 200g
- 赤・黄パプリカ: 1個ずつ
- 玉ねぎ: 1個
- ズッキーニ: 半分
- オリーブオイル: 大さじ2
- 塩、コショウ: 適量
- ハーブやスパイス（ローズマリー、タイム、オレガノなど）: お好みで

作り方:
1. 野菜と鶏胸肉を細長く切る。
2. スティック状に切った野菜と鶏肉を交互に串に刺す。
3. オリーブオイル、塩、コショウ、ハーブやスパイスで味付けする。
4. 直火やグリルで焼くか、オーブンで焼く。

想定カロリー: 約200kcal/1人分

このレシピは低カロリーでありながら、たんぱく質と野菜の栄養をバランスよく摂取できるので、ダイエットにもおすすめです。


### 1.食材を買ってくる
![img01@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/9dc2fde2-44e0-24b2-1970-04cd05d39605.png)
近所のスーパーで鶏むね肉とパプリカ、ズッキーニを買ってきました。自分でこんなオサレ野菜ばかり買うことないな。


### 2.食材を切って串に刺して味付け
![img02@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/96ff7580-f2e2-cb5e-d436-efea627826fa.png)
写真がないのでいまいちサイズ感わからないけど、それっぽくサイズに切って竹串に刺す。塩胡椒とスパイスは安定のホリニシで。


### 3.グリルやオーブンは面倒なのでスキレットで焼いて完成！!
![img03@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/f206b8a5-893c-aa65-365f-1b359f9f2106.png)
今回は掃除めんどくさいのと胸肉をしっとり焼けるのでスキレットで焼いてみました。せっかくなんでシュラカップも出してお家でキャンプ気分。


# 実食！
![img04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618353/692cd53f-53f0-dd0b-c2e7-6b7c6dccfafb.png)
これはおしゃれ焼き鳥ですね！野菜中心なんだけどオリーブオイルとスパイスで満足感のあって食べ応えもあり美味しかったです！マスタードやマヨネーズつけてもよかったかも(ダイエットは置いといて)

# 感想
実際やってみて料理は思ったより美味しくできました！ただどう考えても量が多すぎたの、写真がないので完成系がわからず雰囲気で作るしかなかったので、写真も送るように改善は必要かなと感じました！

何にせよ、思ったよりちゃんとした料理でChatGPTは偉大ですね！