DiscordにPythonで投稿する方法(bot/Webhook)
Discordにハマる
DiscordにPythonからAPIで投稿しようとしたら、結構大変だったのでメモ。
そもそも以下2つの方法があるのに気づいていなかったです。
- Webhookを使う方法
- botを使う方法
単純にPythonで投稿するだけなら、Webhookを使うほうが圧倒的に簡単です(そもそもそういう用途を想定している、投稿専用のbotという位置づけ)。
botを使うと、ユーザーに対して、インタラクティブな反応をするアプリが作れますが、基本的に24時間稼働想定になり、色々ハードル高いですし、設定も権限が複雑になります。
単にPythonから投稿するだけならbotを使うのはやめましょう。
という前提のもと、両方の方法を順に説明していきます。
Webhookを使う方法
Discordにログインして、サーバ設定から連携サービスを選択します。
以下の画面でウェブフックを作成をクリックします。
以下のように名前と投稿するチャンネルを選択します。
ウェブフックURLをコピーを選択して、URLをコピーします。
あとは、以下のようなサンプルコードで投稿できます。
# Reference
import json
from urllib.request import Request, urlopen
def post_discord(message: str, webhook_url: str):
headers = {
"Content-Type": "application/json",
"User-Agent": "DiscordBot (private use) Python-urllib/3.10",
}
data = {"content": message}
request = Request(
webhook_url,
data=json.dumps(data).encode(),
headers=headers,
)
with urlopen(request) as res:
assert res.getcode() == 204
if __name__ == "__main__":
webhook_url = '<webhook url>'
post_discord('Webhookテスト', webhook_url)
コードは、nikkieさんが教えてくださったものを参考にさせていただきました。ありがとうございます!
なお、Slackに関してもWebhookだと同じ要領で投稿ができます。本記事では扱いませんが、興味ある方は、以下記事参考に試してみてください(簡単にできます)。
botを使う方法
Discordへの投稿の前準備
以下が必要でした。ひょっとしたら不要なものとか抜けているものがあるかも、また次に1からやるときあったら見直します。
- 新しいアプリケーションとbotを作ってTokenを取得
- botの
Privileged Gateway Intents
を設定する - botがDiscordにアクセスできるようにする
- CHANNEL IDを調べる
順に説明していきます。
新しいアプリケーションとbotを作ってTokenを取得
以下にアクセスして、新しいアプリケーションを作って、botを作ってTokenを取得します。
一般的な設定をしましょう。
詳細は省略します。
Privileged Gateway Intents
を設定する
botの続けて、左メニューのbotからPrivileged Gateway Intents
の3つの項目をすべてONに設定します。
botがDiscordにアクセスできるようにする
左メニューのOAuth2->URL Generatorから、以下のようにチェックします。
すると、画面の下にURLが出てくるので、そこにアクセスすると、以下のようにbotの認証画面が出るので、認証ボタンを押します。
botのTokenを取得する
左からBotを選択して、Reset Token → Copyを選択しましょう。
CHANNEL IDを調べる
Discordにログインして、ユーザーの設定画面から、以下のように開発者モードをオンにします。
すると、CHANNELを右クリックすると、IDがみられるようになります。
Discordにbotで投稿するプログラム
discordライブラリをインストールしておきます。
$ pip install discord
あとは以下プログラムを実行するだけです。
import discord
DISCORD_TOKEN = "<discord_token>"
CHANNEL_ID = <channel_id>
client = discord.Client(intents=discord.Intents.all())
@client.event
async def on_ready():
print(f"Connected to Discord!")
channel = client.get_channel(CHANNEL_ID)
await channel.send('テスト!')
client.run(DISCORD_TOKEN)
おまけ:ChatGPTとのやりとり
最初、単にPythonで投稿したいだけだったのですが、botの設定が色々必要で結構ハマってしまいました。
そして、作成した後で投稿するだけならbotを使わないもっと楽な方法があったりする気がしてきたので、恐る恐るChatGPTに聞いてみたら…
ありそう!最初から教えてくれよー(ChatGPT、最初はdiscordライブラリとbot使う方法を紹介してきた)。
discord-webhookも便利そうですが、今回は以下のnikkieさんのアドバイスを参考にしました。
使用例
ChatGPTで論文を要約するソフトです。Discordとの連携部分(post_discord.py)に本記事の内容を使用しています。
AIを使ったChat botです。Discordのbot機能を使っています。
まとめ
DiscordにPythonから投稿する方法を紹介しました。
繰り返しになりますが投稿するだけなら、Webhookを使う方法が簡単です。
せっかくbotが使えるようになったので、投稿するだけじゃなくて、もっと色々botに仕事をさせるようなこともしてみたいですね。ずっと動かし続けるのはお金とか手間とかすこし大変そうですが。
参考リンク
関連ページ
変更履歴
- 2023/08/05 使用例追記、設定に関して追記
- 2023/04/16 Webhookを使う方法に関して追記
Discussion