ChatGPT + discord.py で対話bot

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

追記
GitHubにも上げました．

https://github.com/yu-kod/ChatGPTDiscordBot

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

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

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





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

https://discord.com/developers/applications

New Applicationからアプリケーションの名前を入力して続行．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/4b5a4761-e515-00b8-e302-afe3160f392c.png)

左側のメニューからBotのタブへ移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/4143b527-f5e5-5e40-90fd-a0b6ac9b155d.png)

Add Botを押してボットを作成
ここでbotで表示したい名前とアイコンを入力します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/bfb7d3f1-5cc3-7e69-f431-f8ca8fc313ba.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/60e9bff3-9b1a-3eda-69b5-8ab22b719c08.png)

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

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

# 2. OpenAIのAPIキーの発行
以下のリンクを開いてください．

https://platform.openai.com/

アカウントが無ければ作成し，以下のようなページが開ければOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/cf4f8bfd-e45b-a232-dd21-19953decd033.png)
右上の自分のアカウントを押し，View API keysを押します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/cb7a9f09-c7e2-eacd-e866-8b1a5518cd24.png)

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

# 3. プログラムの作成
まずはライブラリのインストールを行います．
```
pip install discord.py
pip install openai
```
次にプログラムを作成します．
```python
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の管理ページに戻ります．一応再度リンク

https://discord.com/developers/applications

作成したアプリケーションを選択し，左のメニューからOAuth2の中のURL Generatorを選択．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/98960f18-d374-c3ac-c006-4f61b6b3a86b.png)
botにチェックを入れるとページ下部に招待用のリンクが表示されます．
リンクをコピーしてブラウザに貼り付けると招待ページが表示されるので，招待したいサーバを選択して招待してください．
以降もこのbotを招待したい場合は，このURLから招待できます．
botがサーバに追加されればOK(現状はオフラインになっているはず)　

# 5. Botの起動
作成したPythonファイルを実行します．
```
python ファイル名.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365485/3f05e76c-bd08-30fd-6b11-bbd61bc8edc0.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. おわりに
更新に伴って焦って書いたので，間違っていること，別のやり方のほうが良いことなどあれば教えてください．

### 参考文献
- [Discord.py解説ページ](https://discordpy.readthedocs.io/ja/latest/discord.html)
- [【最新速報】ChatGPT APIの「概要と使い方」（Pythonコード付き）](https://zenn.dev/umi_mori/articles/chatgpt-api-python)