gpt-discordぼっと備忘録

# ChatGPTのDiscord Botを作る

ほぼ、ここを参考にしました

https://qiita.com/wataru86/items/12958c36d010733b00be

## 仮想環境の利用
ここは、飛ばしても構いません

筆者は、ローカルの環境が汚れると嫌だったので、仮想環境を使いました。[Miniforge](https://github.com/conda-forge/miniforge)を使って仮想環境を構築しました
`conda create -n 仮想環境名 python=バージョン`
`conda activate 仮想環境名`<-これで仮想環境にはいる


なぜ、仮想環境を使うのか、何が便利なのかは、リンク先が分かりやすいです。(記事は、英語なのでGoogleChromeの拡張などで翻訳してください)
[How to Set Up a Virtual Environment in Python – And Why It's Useful](https://www.freecodecamp.org/news/how-to-setup-virtual-environments-in-python/#:~:text=Python%20virtual%20environments%20give%20you,and%20makes%20it%20easily%20reproducible.)


## botを作る

https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf

ここだけ権限の変える必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557291/72d24bd4-3806-5247-dc45-0e441e7da5a1.png)


## botと接続
ここを参考にしてください

https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f


### 接続テスト
ここは、上の記事と異なっているので、注意してください

```main.py
import discord

DISCORD_TOKEN = 'discord bot のトークン'

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

client = discord.Client(intents=intents)


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


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

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

client.run(DISCORDTOKEN)

```

このようになれば、成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557291/8763b349-b546-1d90-353f-a835395f13f7.png)

## openai apiとの接続
まず、openaiのpythonモジュールをインストールしてください
`pip3 install openai`

[ここを参考](https://qiita.com/wataru86/items/12958c36d010733b00be#2-openai-%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)に、API KEYを取得してください
諸々の説明はここを見ると分かりやすい
https://book.st-hakky.com/docs/open-ai-api-in-python/

messagasというリストがあって、そこの配列に文字列を入れることで、Chatしているみたい。
ChatCompletionによって、あらかじめ会話を設定できる。
```example.py
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)
```

## 完成したのがこちら、ほぼ記事と一緒
[ここを参考](https://qiita.com/wataru86/items/12958c36d010733b00be#3-bot-%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%83%A1%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8C%E6%9D%A5%E3%81%9F%E3%82%89-chatgpt-%E3%81%A7%E8%BF%94%E4%BA%8B%E3%82%92%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
```main.py
import discord
from discord.ext import commands
import openai

DISCORD_TOKEN = 'discord bot のトークン'
openai.api_key = 'openapi のkey'


intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="?", intents=intents)

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "あなたは誰ですか?"},
    {"role": "assistant", "content": "私はAIアシスタントです。どうかしましたか?"}
]


@bot.event
async def on_ready():
    print(f'Logged in as {bot.user} (ID: {bot.user.id})')
    print('------')


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

    # ユーザーからの質問を受け取る
    if bot.user.id in [member.id for member in message.mentions]:
        print(message.content)
        print(message.content.split('>')[1].lstrip())
        question = message.content.split('>')[1].lstrip()
        messages.append({"role": "user", "content": question})


        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            max_tokens=200,#tokenの最大値
        )

        answer = response.choices[0].message.content
        print(answer)
        # 回答を送信する
        await message.channel.send(answer)

bot.run(DISCORD_TOKEN)

```
## 使い方
@bot　{メッセージ}
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557291/2665255e-8bc3-48a7-fde2-8e7284a126d1.png)



## ChatGPTの料金について
1000tokenあたり0.0015$
意外に料金は安く済みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557291/3bbad514-7f2f-4327-ca66-3eaf47bf990e.png)

## 感想
Discord Bot 初めて作ったけど、意外と早く作れた
みんなもやってみてね
次は、Youtubeの質問コーナーをテキストにして、人格を生成したい


## その他[Prefixについて]
DiscordBotとか見てると
?help　とか見かけると思うけども、あれは bot.commandでイベントが発火する。この例だと、
?test [ここの文章が入力値になる]
```pre.py

bot = commands.Bot(command_prefix='?', intents=intents)
@bot.command()
async def test(ctx, arg):
    await ctx.send(arg)
```