PythonでChatGPTのAPIを利用したDiscordBotを作りたい！

2023/3/2にOpenAI社よりChatGPTのAPIが公開され、今まさにこのAPIを高機能なサービスが続々と登場してきていますよね。
Twitterでもすごいサービスばかり紹介されていて驚くばかりです。
このようなサービスを目にして、僕も簡単にChatGPTのAPIを使って何かしてみたいと思いました。
ソフトウェア開発の経験は全くと言ってない僕ですが、DiscordBotの作成はあまり難易度が高くなさそうだったのでやってみました。
この記事では備忘録としてChatGPTのAPIを利用したDiscordBotを作成する流れを書き記したいと思います。


# 1. OpenAIのAPI keyの取得
ChatGPTのAPIを利用するためにはOpenAIのAPI keyを取得する必要があります。
以下のサイトを参考にしてAPI keyを取得できます。

https://auto-worker.com/blog/?p=6988

APIの利用は最初に18＄の無料クレジットが与えられ、それ以降も利用する場合はクレジットカードの登録が必要です。

# 2. DiscordBOTの作成
BOTの作成はDiscordの開発者ツールを利用します。
まず開発者ツール(https://discord.com/developers/docs/intro)に移動し、Discordアカウントでログインしましょう。
ログインしたら
「Applications」 →　「New Application」 を選択して新しいアプリケーションを作成します。
今回は「ChatGPTbot」という名前で作成していきます（名前は後で変更可）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/be594ef0-43a2-8132-d00c-3d36576cf213.png)
作成したら左側のバーの「Bot」から「Add Bot」を選択して新しいBOTを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/42d72ea6-2453-c1b1-783a-1ddd5c635ed8.png)
これでBOTの作成完了です！
BOTのトークンはプログラムでBOTを動かすときに使うのでこの画面の「Reset Token」から取得できることを覚えておきましょう。

# 3. BOTの動作を記述するPythonファイルを作成する
DiscordBOT.pyという名前のファイルを作り、このファイル内でBOTの動作を記述します。
以下にDiscordBOT.pyの記述内容を示します。

```python:DiscordBOT.py
import openai
import discord

# OpenAIのAPIキーをセットアップする
openai.api_key = "OpenAI API keyをここに入力"

# ChatGPTというクラスを定義する
class ChatGPT:
    def __init__(self, system_setting):
        # システムの設定をセットする
        self.system = {"role": "system", "content": system_setting}
        # ユーザーの入力を保持するためのリストを初期化する
        self.input_list = [self.system]
        # ログを保持するためのリストを初期化する
        self.logs = []

    # ユーザーからの入力を受け取り、OpenAI APIを使って回答を生成する
    def input_message(self, input_text):
        # ユーザーの入力をリストに追加する
        self.input_list.append({"role": "user", "content": input_text})
        # OpenAI APIを使って回答を生成する
        result = openai.ChatCompletion.create(
            model="gpt-3.5-turbo", messages=self.input_list
        )
        # 生成した回答をログに追加する
        self.logs.append(result)
        # 生成した回答をリストに追加する
        self.input_list.append(
            {"role": "assistant", "content": result.choices[0].message.content}
        )

# Discord Botを作成するための準備
intents = discord.Intents.all()
client = discord.Client(intents=intents)

# Discord Botが起動したときに呼び出される関数
@client.event
async def on_ready():
    print("起動完了")

# Discordでメッセージが送信されたときに呼び出される関数
@client.event
async def on_message(message):
    # Bot自身が送信したメッセージには反応しない
    if message.author == client.user:
        return

    # ユーザーからの質問を受け取る
    if message.content.startswith('!gpt'):
        question = message.content[4:]

        # ChatGPTクラスを使って回答を生成する
        api = ChatGPT(system_setting="あなたはアシスタントです。会話を開始します。")
        api.input_message(question)

        # 生成した回答を取得する
        answer = api.input_list[-1]["content"]

        # 回答を送信する
        await message.channel.send(answer)

# Discord Botを起動する
client.run("Discord TOKEN をここに入力")
```
このコードに自分のOpenAI keyとDiscord TOKENを入力すればすぐに使うことができます。
機能としては、Discordのテキストチャットで
```
!gpt [文章]
```
という形で文章を送るとこれに対してBOTが反応してくれるというものです。
(長くなりそうなのでコードの詳細は割愛します。)

# 4. Discord上でBOTを使えるようにする
まずBOTをサーバーに招待します。
開発者ツールの「OAuth2」→「URL Generator」と進んで、
SCOPESは「bot」、BOT PERMISSIONSは「Adiministrator」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/6bcc8e89-d707-5f77-5bdf-c488c9f656cd.png)
すると下のほうに作成したBOTをサーバに招待するためのURLが生成されるので、このURLを踏みます。
ここで、自分が管理者権限を持つサーバにBOTを追加することができます。
無事追加に成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/5afdb867-c24a-1b18-c9d9-22f8ed4c9d57.png)

サーバに追加しただけではBOTはオフラインのままで使うことができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/d1bcdec8-ed95-a5b0-e00e-0083a6c0a469.png)

ここでターミナルを開き、先ほど作成したPythonファイルである「DiscordBOT.py」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/05f2d85a-77ac-f203-af81-a253db64a844.png)
するとBOTがオンラインになり、使用可能になりました！

# 5. 試しに動かしてみる
それでは実際に使ってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/bfc0c753-0b87-aad8-63c8-d0c8c2661cbd.png)
挨拶を返してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/c35b3dbe-99a3-cbf9-6f9d-b922850703ec.png)
おいしいレシピも教えてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/3c62d0a8-63f4-e817-b923-441b737cd492.png)
コードの書き方も教えてくれます。
だいぶ上出来ですね！

# 6. 最後に
今回はChatGPTのAPIを利用したDiscordBotを作成しました。
BOT作成などは初めてやったのですが、かなり簡単にできました。
今回のBOTは1つの文章に対して1つの返答を生成するような簡単なプログラムですが、今度は幾つも前の文章を踏まえた返答が行えるようにしたいですね。