ChatGPT+LINE BotでFlexメッセージを自動生成する


# 完成イメージ
![7C9DFE3E-95C0-4172-B2D1-FDA25D8AE5D8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114832/3e8de6ba-1434-fc12-f3fb-df738949d758.jpeg)

# 前提条件
### LINE BotとChatGPT APIが扱える環境
- LINE Messaging API
- GPT-3.5 Turbo API
- Python3
- ngrok

# 手順
#### 1.OpenAI APIキーを取得する
https://platform.openai.com/api-keys

#### 2.各種インストール
```sh
$ pip3 install flask 
$ pip3 install line-bot-sdk==2.4.1
$ pip3 install openai
```

#### 3.コードを記述する
```python:app.py
import os, json
from flask import Flask, abort, request
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, FlexSendMessage
from openai import OpenAI

app = Flask(__name__)

access_token = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
channel_secret = os.environ["LINE_CHANNEL_SECRET"]
client = OpenAI()

line_bot_api = LineBotApi(access_token)
handler = WebhookHandler(channel_secret)

def generate_flex_message(theme):
    res = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "LINE Botで送信できるFlexメッセージをJSON形式で出力して。なお、JSON以外の文字列は含め
ないで。"},
            {"role": "user", "content": theme},
        ],
    )
    result = json.loads(res.choices[0].message.content)
    return result
    

@app.route("/callback", methods=["POST"])
def callback():
    signature = request.headers["X-Line-Signature"]

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return "OK"


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    try:
        msg = event.message.text
        if msg.startswith('!flex '):
            theme = msg.replace('!flex ', '')
            output_flex_message = generate_flex_message(theme)
            message = FlexSendMessage.new_from_json_dict(output_flex_message)
            line_bot_api.reply_message(
                reply_token=event.reply_token,
                messages=[message]
            )
    except Exception as e:
        print(e)
        
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=3000, debug=True)       
```
#### 4.各種環境変数の設定

以下の3つの環境変数を設定します。
(OS等に応じて方法は異なります)
```
LINE_CHANNEL_ACCESS_TOKEN=LINEのチャネルアクセストークン
LINE_CHANNEL_SECRET=LINEのチャネルシークレット
OPENAI_API_KEY=OPENAIのAPIキー
```

#### 5.サーバーを起動する
```sh
$ python3 app.py
```

#### 6.ngrokを起動する
```sh
$ ngrok http 3000

Session Status                online                                                                                                  
Account                       user@example.com (Plan: Free)                                                                      
Update                        update available (version 3.5.0, Ctrl-U to update)                                                      
Version                       3.3.5                                                                                                   
Region                        Japan (jp)                                                                                              
Latency                       19ms                                                                                                    
Web Interface                 http://127.0.0.1:4040                                                                                   
Forwarding                    https://949b-2400-8500-2002-3178-160-251-212-25.ngrok-free.app -> http://localhost:3000     

```
#### 7.LINEのWebHookにURLを登録する

LINE BotのWebHookに登録するURLは
表示されたURLのうち
Forwardingのhttpsの方 + /callback
という形にします。

今回の場合は
```
https://949b-2400-8500-2002-3178-160-251-212-25.ngrok-free.app/callback
```
です。

https://developers.line.biz/console/

#### 8.使い方

追加してトークを開き

「!flex 内容」
のようにメッセージを送信します。

![AAA074F6-41A2-48E4-9342-42DB39649145.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114832/e0f254bf-7589-0163-2bba-a852fae91bf0.jpeg)


## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [【ChatGPT x LINEBot】Python で chatGPT の LINEBot を作ってみた（サーバー不要）](https://qiita.com/nanato12/items/4b735b4d95abf2fdb554)
- [PythonでLine botを作ってみた](https://qiita.com/kro/items/67f7510b36945eb9689b)
- [openAIのAPIキーの取得とPython openaiモジュールの動作確認メモ](https://ovaldesign.jp/2023/04/05/openai/)
- [line-bot-sdk-python](https://github.com/line/line-bot-sdk-python)