4
7

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.

ChatGPT + discord.py で対話bot

Last updated at Posted at 2023-03-02

はじめに

友人と使用しているDiscordサーバでChatGPTが流行っており,面白い会話内容を画像で共有していました.
そこで,チャンネル内で直接会話がしたいという要求で作成しました.

追記
GitHubにも上げました.

※注意

ChatGPTのAPIを利用するためには利用料金が発生します.会員登録時点で18ドル分のクレジットが追加され,登録から3ヶ月間使用することができます.3ヶ月を過ぎ,支払い登録をすると,18ドル相当のクレジットも支払対象になります.
金額は1000トークンで0.2円ほど(正確な金額はこちら)で日本語は1文字当たり1~3トークン程と言われています.

支払い登録をしなければ3ヶ月時点で自動的に使用できなくなるため,まずは3ヶ月間試してみるといいと思います.

目次

1.botアカウント作成
2.OpenAIのAPIキーの発行
3.プログラムの作成
4.Botの招待
5.Botの起動
6.自動実行(おまけ)
7.おわりに

1. botアカウント作成

まずは以下のサイトにアクセスして,botアカウントを作成しましょう.

New Applicationからアプリケーションの名前を入力して続行.
image.png

左側のメニューからBotのタブへ移動
image.png

Add Botを押してボットを作成
ここでbotで表示したい名前とアイコンを入力します.
image.png

チェックボックスはこのようにしました.一番上の設定は,自分以外の人がこのBotをサーバに追加できるか決めるものです.嫌だったらオフにしましょう.
下の設定はBotがサーバからメッセージを読めるようにするかを決める設定です.基本オンでいいと思います.

image.png

USERNAMEの下にはTokenがあると思います.これを利用して作成したプログラムとBotを紐付けます.後で使うのでメモしておきましょう.

このページはまた後で使用するので開いておいてください.

2. OpenAIのAPIキーの発行

以下のリンクを開いてください.

アカウントが無ければ作成し,以下のようなページが開ければOK
image.png
右上の自分のアカウントを押し,View API keysを押します.

image.png

Create new secret keyを押し,APIキーを作成します.後で使用するのでメモしておいてください.ページは閉じても大丈夫です.

3. プログラムの作成

まずはライブラリのインストールを行います.

pip install discord.py
pip install openai

次にプログラムを作成します.

import discord
import openai

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)
token = "-------"  #Discordのトークンを入力
openai.api_key = "----"  #APIキーを入力
model_engine = "gpt-3.5-turbo"

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')

@client.event
async def on_message(message):
    global model_engine
    if message.author.bot:
        return
    if message.author == client.user:
        return

    if message.content.startswith('/gpt'):
        msg = await message.reply("生成中...", mention_author=False)
        try:
            prompt = message.content[4::]
            if not prompt:
                await msg.delete()
                await message.channel.send("質問内容がありません")
                return
            completion = openai.ChatCompletion.create(
            model=model_engine,
            messages=[
                {
                    "role": "system",
                    "content": "日本語で返答してください。"
                },
                {
                    "role": "user",
                    "content": prompt
                }
            ],
            )

            response = completion["choices"][0]["message"]["content"]
            await msg.delete()
            await message.reply(response, mention_author=False)
        except:
            import traceback
            traceback.print_exc()
            await message.reply("エラーが発生しました", mention_author=False)

client.run(token)

上記コードでは各コマンドごとに独立した応答が行なえます.連続して会話を行うためにはもう少し工夫する必要があります.

トークンの部分とAPIキーの部分を書き換えてファイルを保存します.

4. Botの招待

Discordの管理ページに戻ります.一応再度リンク

作成したアプリケーションを選択し,左のメニューからOAuth2の中のURL Generatorを選択.
image.png
botにチェックを入れるとページ下部に招待用のリンクが表示されます.
リンクをコピーしてブラウザに貼り付けると招待ページが表示されるので,招待したいサーバを選択して招待してください.
以降もこのbotを招待したい場合は,このURLから招待できます.
botがサーバに追加されればOK(現状はオフラインになっているはず) 

5. Botの起動

作成したPythonファイルを実行します.

python ファイル名.py

image.png

このように表示されればOK.
サーバで/gpt こんにちは等入力し,返答が帰ってくれば起動成功です.

6. 自動実行(おまけ)

私の環境ではbatファイルを使用して,自動起動しています.

python chatGPT.py

ここではGPT.batというファイル名とします.
これでクリックだけで起動できるようになりました.しかし黒い画面が出るのが煩わしいので,バックグラウンドで開けるようにします.
vbsファイルを作成

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c GPT.bat", vbhide

ここではGPT.vbsとします.これでバックグラウンド実行されるようになりました.実行しているかどうかはDiscordのオンライン表示で確認してください.あとはこれをスタートアップに追加すればPCを起動したタイミングで自動的にBotが起動するようになります.

もっといいやり方あったら教えてください.

7. おわりに

更新に伴って焦って書いたので,間違っていること,別のやり方のほうが良いことなどあれば教えてください.

参考文献

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?