7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-18

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を取得できます。

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

2. DiscordBOTの作成

BOTの作成はDiscordの開発者ツールを利用します。
まず開発者ツール(https://discord.com/developers/docs/intro)に移動し、Discordアカウントでログインしましょう。
ログインしたら
「Applications」 → 「New Application」 を選択して新しいアプリケーションを作成します。
今回は「ChatGPTbot」という名前で作成していきます(名前は後で変更可)。
image.png
作成したら左側のバーの「Bot」から「Add Bot」を選択して新しいBOTを作成します。
image.png
これでBOTの作成完了です!
BOTのトークンはプログラムでBOTを動かすときに使うのでこの画面の「Reset Token」から取得できることを覚えておきましょう。

3. BOTの動作を記述するPythonファイルを作成する

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

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
すると下のほうに作成したBOTをサーバに招待するためのURLが生成されるので、このURLを踏みます。
ここで、自分が管理者権限を持つサーバにBOTを追加することができます。
無事追加に成功しました!
image.png

サーバに追加しただけではBOTはオフラインのままで使うことができません。
image.png

ここでターミナルを開き、先ほど作成したPythonファイルである「DiscordBOT.py」を実行します。
image.png
するとBOTがオンラインになり、使用可能になりました!

5. 試しに動かしてみる

それでは実際に使ってみましょう。

image.png
挨拶を返してくれました。

image.png
おいしいレシピも教えてくれました。

image.png
コードの書き方も教えてくれます。
だいぶ上出来ですね!

6. 最後に

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

7
6
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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?