iPadでChatGPT APIを用いたLINE botを作ってみた。

ChatGPTにハマっており、ほぼ知識のない状態でChatGPT APIを用いたLINE botを作ってみた。

 pythonista3では、openaiのインストールが出来ない！などの作成までのトラブルは全て割愛して、下記に手順を記載する。

工程としては、⒈Google Colabでノートブックを作成→⒉LINE公式とDeveloperのアカウントを作成→⒊LINEの設定と必要な情報を取得する。→⒋webhook用にngrokのアカウントを作成→⒌openaiのAPIキーを取得する→⒍コードを書く→完成！

# ⒈Google Colabで新規ノートブックを作成する
[Google Colab](https://colab.research.google.com/?hl=ja)にアクセスする。
ノートブックを新規作成を押す。![AB93618A-0566-475D-9D9D-9F4736A2D45C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/f4e31e40-589e-6998-0edb-aa52bed9d53e.jpeg)

コードを書くノートブックが出来る。![83767E4A-7BED-439E-8148-0A5507DA240F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/33e7c713-6282-c2d6-ef66-bc3202d44dd7.jpeg)

# ⒉ LINE公式とDeveloperのアカウントを作成する
LINE公式のHPからは何故かアカウントを作成出来ないので、[こちらの公式LINEアプリ](https://apps.apple.com/jp/app/line%E5%85%AC%E5%BC%8F%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88/id1450599059)をダウンロードして、指示に従いアカウントを作成する。

公式LINEアカウントが作成出来たら[Developer](https://developers.line.biz/ja/)のサイトにアクセスして、先程作成した LINE公式のアカウントでログインして、Developerのアカウントを作成する。

※この手順で上手くいかない場合、公式の説明がわかりやすいので、参照してみて下さい。

# ⒊ LINEの設定と必要な情報を取得する
まず、[こちらから](https://developers.line.biz/ja/)LINE Developersコンソールを開き、[こちらの手順](https://developers.line.biz/ja/docs/messaging-api/getting-started/)でチャネルを作成する。

チャネルを作成したら、作成したチャネルを開き「チャネル基本設定」から「チャネルシークレット」と、「Messaging API設定」から「チャネルアクセストークン」を取得して、すぐ使えるところにメモする。

[ウェブ版のLINE公式のアカウントページ](https://manager.line.biz/)にアクセスして、メッセージを全てオフにする。
上手くいくとコンソールのMessaging API設定のLINE公式アカウント機能が以下のようになる。![6DBBFEA3-8107-47C6-9FC4-9DEEAD3B3A12.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/86d4b883-540d-3600-7f6e-3d6ff2d5d378.jpeg)

# ⒋webhook用にngrokのアカウントを作成する
LINEのwebhookにhttpsが必要なので、[ngrok](https://ngrok.com)にアクセスしてアカウントを作成する。

アカウントを作成したらログインして、左のメニューからYour Authtokenを選択してYour Authtokenを取得してすぐ使えるところにメモする。

# ⒌openaiのAPIキーを取得する
[こちらのサイト](https://saasis.jp/2023/03/06/遂に公開されたchatgpt-apiとは？-利用するまでの流れ【/)を参考にopenaiのAPIキーを取得する。

# ⒍コードを書く
まず、⒈で作成したGoogle Colabのノートブックを開く。この際にブラウザをPCモードにしておくと使いやすい。

⒈これまでに集めたトークンなどを書く。

``` python
# LINEのチャネルシークレット
LINE_CHANNEL_SECRET = ''
# LINEのチャネルアクセストークン
LINE_ACCESS_TOKEN = ''
# ngrokのAuthtoken
NGROK_AUTHTOKEN = ''
```

⒉openaiをインストールする。私は普通に!pipでインストール出来なかったので、以下のようにしています。

```
!pip install --upgrade pip
!pip install setuptools wheel
!pip install openai
```

⒊ngrokやLINE等をインストールする

```
!pip install flask
!pip install line-bot-sdk
!pip install pyngrok

!ngrok authtoken $NGROK_AUTHTOKEN
```

⒋webhook用のhttpsを作成する

``` python
import os

from pyngrok import ngrok
from pyngrok.conf import PyngrokConfig


os.system('kill -9 $(pgrep ngrok)')

https_tunnel = ngrok.connect(addr='127.0.0.1:5000',bind_tls=True)
print(https_tunnel)
```

⒍ChatGPT付きLINE botを作成する
``` python
import openai

openai.api_key = ''
# openaiの APIキー


from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageSendMessage,
)


app = Flask(__name__)

line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

@app.route("/test")
def test():
    return "TEST OK"

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

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

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
 text = event.message.text
 response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "任意の設定を書く。例：占い師になって下さい。"},  {"role": "user", "content": text},
    ]
)
 line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=response["choices"][0]["message"]["content"]),
    )

if __name__ == '__main__':
    app.run()
```

⒎⒍だと記憶がなくコミュニケーションにならないので、⒍のコードを下記に変更する。

``` python
import openai

openai.api_key = ''
# openaiの APIキー

from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageSendMessage,
)


app = Flask(__name__)

line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

@app.route("/test")
def test():
    return "TEST OK"

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

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

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


assist1 = ""  # 初期化

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    global assist1  # assist1をグローバル変数にする

    text = event.message.text
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "任意の設定を書く。例：占い師になって下さい。"},
            {"role": "assistant", "content": assist1},
            {"role": "user", "content": text},
        ]
    )
    assist1 = response["choices"][0]["message"]["content"]  # assist1を更新
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=response["choices"][0]["message"]["content"]),
    )


if __name__ == '__main__':
    app.run()
```

⒏ランタイムの項目から全てのセルを実行する。

⒐⒌のコード実行後に現れる数字が多い方のURLをコピーして、 LINE DevelopersのチャネルのMessaging API設定のWebhook設定にコピーしたURLを入れて、Webhookの利用をオンにする。
※検証を押してエラーの場合、どこかで失敗しています。
※実行するたびにURLが更新される為、実行するたびに再設定が必要です。

10.自分とLINE botを友達にして自分から話しかけてみる。以下のように返答が返ってきたら成功！！![061EA3E6-7EA1-4048-B5EF-DD7E5EE0EBB0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/ce1e71b2-552d-e353-f3ff-6fa555734a0f.jpeg)


# 最後に
以上のようにして、ほぼ知識のない私でもChatGPTを用いたLINE botを作成出来ました。
わからないことはbingに聞いて、足りないコードはChatGPTに書いてもらうと誰でも簡単な開発は出来るのだなと思いました。
また何か作ってみます。