LoginSignup
1
0

More than 1 year has passed since last update.

ChatGPT APIを用いたLINE botをAWSのインスタンスに移してみた。

Last updated at Posted at 2023-04-27

私がChatGPTを用いた開発を始めて、最初に作成したChatGPT APIを用いたLINE botをAWSのインスタンスに移してみました、

自己署名だとLINEがwebhook URLを認めてくれないので、今回もngrockを使用しました。

使用しているAWSのインスタンスのインスタンスイメージはubuntuです。

手順は、インスタンス上でChatGPT APIを用いたLINE botを実行中にするだけです。

インスタンス上でChatGPT APIを用いたLINE botを実行中にする

まず、インスタンスにSSH接続します。

インスタンスのコンソールが開いたら以下をインストールします。

aptのアップデート

sudo apt update

pipのインストール

sudo apt install python3-pip

LINEのインストール

sudo pip install line-bot-sdk

ngrokのインストール

sudo pip install pyngrok

flaskのインストール

sudo pip install flask

openaiのインストール

sudo pip install openai

次にpythonのファイルを保存するディレクトリを作成します。

mkdir ディレクトリ名

作成したディレクトリに移動します。

cd ディレクトリ名

作成したディレクトリでファイルを作成します。

nano ファイル名

作成したファイルの中に下記のbotのコードを入れて、ctrl oでファイルを保存して、ctrl xでファイルを閉じます。
※LINE、ngrok、openaiのキーやトークンをコードに入れてください。これらの取得については、こちらを参考にしてください。

from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageSendMessage,
)
import os
from pyngrok import ngrok
from pyngrok.conf import PyngrokConfig
import openai


# LINEのチャネルシークレット
LINE_CHANNEL_SECRET = ''
# LINEのチャネルアクセストークン
LINE_ACCESS_TOKEN = ''
# ngrokのAuthtoken
NGROK_AUTHTOKEN = ''
# openaiのキー
openai.api_key = "" 

# URLの生成
ngrok.set_auth_token(NGROK_AUTHTOKEN)
os.system('kill -9 $(pgrep ngrok)')
https_tunnel = ngrok.connect(addr='127.0.0.1:5000',bind_tls=True)
print(https_tunnel)


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()

一度、上手くファイルが作成されているか下記のコマンドで確認します。

find ~

上手くファイルが作成されていたら、screenを作成します。

screen -S スクリーン名

ルート権限で、screen内でpythonで作成したファイルを実行します。

sudo python3 ファイル名.py

実行したら、生成されたURLを取得して、LINE Developers のダッシュボードにwebhook URLを設定します。(詳しくは、こちらを参考にしてください。)

※稀にエラーが発生します。エラーが発生した場合、エラー処理して頂くか、インスタンスを再起動してください。

webhook URLを設定後、LINE Developersで検証を押します。
成功と表示されたら、上手く接続出来ています。

ここまで出来たら、LINE botを友達登録して話しかけてみてください。
botから返答があれば、成功です!

最後に

慣れてくるとこの手のAWSインスタンスへの移行も簡単に行えますね。
ただ、screenだとインスタンスを再起動すると停止してしまうので、他のやり方に変更してみようかなと最近思っています。
また何か作ってみます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0