💾

Discord内メッセージをCSV保存するBotを作ってみた

2024/04/22に公開

はじめに

みなさんDiscordは好きですか?わたしは今年になってDiscordのいろんなサーバーに入って楽しんでいます!
Xよりも濃い情報が集まりやすく心理的安全性が高いのが良いですよね。

そんなDiscordユーザーの私が最近になってDiscordサーバーの運営する側になって色々調べることが多くなりました。

今回はDiscordチャンネル内のメッセージをCSVファイルに保存する方法を紹介します。
具体的にはローカルPCでPythonのコードを実行していきます。

実行環境

M2 Macbook
Python 3.5.0
pyenv
vscode

Discord内のメッセージをCSVに保存するBotの作り方

さて、Discord内のメッセージをエクスポートしたいなあと思って調べてみたところ
そんな機能は備わってないので自作Botを作りそのBotを動かすためのコードをPythonで書いて実行してみました。

コードのほとんどはChatGPTが書いてくれたので手を動かさずとも簡単に導入できました!
しかし、Discordに関する日本語の情報って本当に少ないので誰かのお役に立てればなと思っています。

以下、チャンネル内のメッセージをCSVファイルに保存する手順です。

1. Discord Botを作成する

まずはDiscord developer portalにアクセスします。

New Application」をクリックして新しいアプリケーションを作成します。

アプリケーションの設定
アプリケーションの名前を入力し、「Create」をクリックします。この名前は後で変更することができます。

Botの追加
アプリケーションの設定ページで「Bot」タブを選択し、「Add Bot」をクリックして、アプリケーションをBotとして追加します。

BotのTOKENの取得
「Token」セクションにある「Copy」をクリックして、BotのTOKENをコピーします。このTOKENは非常に重要で、Botをコントロールするために必要です。他人と共有しないでください。

Botをサーバーに招待
アプリケーション設定の「OAuth2」タブに移動し、「URL Generator」サブタブを選択します。

権限の選択
「SCOPES」セクションで、「bot」をチェックします。その下の「BOT PERMISSIONS」セクションで、Botに必要な権限(例:メッセージを読む、メッセージを送信する等)を選択します。

招待URLの生成
選択した権限に基づいてURLが生成されるので、このURLをコピーし、ブラウザに貼り付けてアクセスします。

Botをサーバーに追加
Discordにログインしていることを確認し、Botを追加したいサーバーを選択します。「認証」をクリックして、Botをサーバーに追加します。(サーバーの管理権限が必要です。)

2. Botを実行するプログラムを書く

新しいディレクトリを作成し、そのディレクトリ内でPythonの仮想環境を設定します。

# ディレクトリの作成
mkdir my_discord_bot
cd my_discord_bot

# 仮想環境の作成 (Linux/macOS)
python3 -m venv botenv

# 仮想環境の作成 (Windows)
python -m venv botenv

仮想環境をアクティベートします。

# Linux/macOS
source botenv/bin/activate

# Windows
botenv\Scripts\activate

Pythonファイル(例:app.py)を作成し、以下のコードを記述します。

from dotenv import load_dotenv
import discord
import csv
import asyncio
import os

load_dotenv()

TOKEN = os.getenv('DISCORD_TOKEN')
CHANNEL_ID_STR = os.getenv('DISCORD_CHANNEL_ID')  # メッセージを取得したいチャンネルのID(整数)
CHANNEL_ID = int(CHANNEL_ID_STR)

LAST_MESSAGE_ID_FILE = 'last_message_id.txt'  # 最後に取得したメッセージIDを保存するファイル名

# 特権インテントの有効化
intents = discord.Intents.default()
intents.members = True
intents.presences = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')

    # CHANNEL_ID を適切なチャネルIDに置き換える
    channel = client.get_channel(CHANNEL_ID)  
    if channel is None:
        print('チャンネルが見つかりませんでした。')
        return

    # 最後に取得したメッセージIDを読み込む
    if os.path.exists(LAST_MESSAGE_ID_FILE):
        with open(LAST_MESSAGE_ID_FILE, 'r') as file:
            last_message_id = int(file.read().strip())
    else:
        last_message_id = None

    after = discord.Object(id=last_message_id) if last_message_id else None
        
    # メッセージを保存するCSVファイルを開く
    with open('output.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        # "Nickname" 列を追加
        writer.writerow(["Username", "Nickname", "UserID", "MessageID", "Timestamp", "Content"])

        messages = [message async for message in channel.history(limit=1000, after=after)]
        
        for message in messages:
            # サーバー上のメンバーであればニックネームを、そうでなければユーザー名を使用する
            nickname = message.author.nick if message.author.nick else message.author.name
            writer.writerow([message.author.name, nickname, message.author.id, message.id, message.created_at, message.content])

    if messages:
        # 最新のメッセージIDをファイルに記録
        with open(LAST_MESSAGE_ID_FILE, 'w') as file:
            file.write(str(messages[0].id))

    print('CSVファイルが保存されました。')
    # Botをログアウトします
    await client.close()

# TOKENを適切なトークンに置き換える
client.run(TOKEN)

必要なパッケージのインストール

今回は.envで環境変数を設定するので以下のパッケージをディレクトリで実行しておきます

pip install python-dotenv

また、discordに関するパッケージも入れておきましょう

pip install discord.py

そして、app.pyと同じディレクトリに.envファイルを作成し、TOKENとCHANNEL_ID_STRを記述しておきます。

TOKEN = XXXXXXX
CHANNEL_ID_STR = XXXXXXXX

TOKENはDiscord developer portalから取得します。
CHANNEL_ID_STRはサーバーのチャンネル名を左クリックにしすると表示されます。
表示されない場合はDiscordの開発者モードになっていない場合があるので開発者モードにしておきましょう。

以下の記事が参考になります
https://aprico-media.com/posts/8960

Botを実行

以下のコマンドでBotを実行します。

python app.py

うまくいくと、同じディレクトリ内にCSVファイルが保存されます。

うまくいかないとき

Botの権限が正しく設定されていないと4XX系のエラーになります。
Discord developer portalから権限を見直してみましょう!
※私はここで詰まりました

まとめ

DiscordはAPIを使ってBotにさまざまな機能を持たせることができます。
コードに関してはChatGPTを使ってわりとすんなり実装できましたので参考になれば幸いです!

GitHubで編集を提案

Discussion