🤖

DiscordにPythonで投稿する方法(bot/Webhook)

2023/04/16に公開

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さんが教えてくださったものを参考にさせていただきました。ありがとうございます!

https://github.com/ftnext/meetup-host-ops/blob/6581cb86914912633b117a7297e09a83c0f06764/discord.py

なお、Slackに関してもWebhookだと同じ要領で投稿ができます。本記事では扱いませんが、興味ある方は、以下記事参考に試してみてください(簡単にできます)。

https://qiita.com/bakira/items/8fa06ab10edf1f42ff97

https://slides.takanory.net/slides/20221015pyconjp/#/11

https://twitter.com/ftnext/status/1647423789175836672

botを使う方法

Discordへの投稿の前準備

以下が必要でした。ひょっとしたら不要なものとか抜けているものがあるかも、また次に1からやるときあったら見直します。

  • 新しいアプリケーションとbotを作ってTokenを取得
  • botのPrivileged Gateway Intentsを設定する
  • botがDiscordにアクセスできるようにする
  • CHANNEL IDを調べる

順に説明していきます。

新しいアプリケーションとbotを作ってTokenを取得

以下にアクセスして、新しいアプリケーションを作って、botを作ってTokenを取得します。

https://discord.com/developers/applications/

一般的な設定をしましょう。

詳細は省略します。

botのPrivileged Gateway Intentsを設定する

続けて、左メニューの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さんのアドバイスを参考にしました。

https://twitter.com/ftnext/status/1647395087767441408

使用例

ChatGPTで論文を要約するソフトです。Discordとの連携部分(post_discord.py)に本記事の内容を使用しています。
https://github.com/karaage0703/ronshuku

AIを使ったChat botです。Discordのbot機能を使っています。

https://zenn.dev/karaage0703/articles/c8baa66c40f9b7

まとめ

DiscordにPythonから投稿する方法を紹介しました。

繰り返しになりますが投稿するだけなら、Webhookを使う方法が簡単です。

せっかくbotが使えるようになったので、投稿するだけじゃなくて、もっと色々botに仕事をさせるようなこともしてみたいですね。ずっと動かし続けるのはお金とか手間とかすこし大変そうですが。

参考リンク

https://zenn.dev/disneyresidents/articles/discordintents

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

https://github.com/openai/gpt-discord-bot

関連ページ

https://zenn.dev/karaage0703/articles/fcc3dde4ad090a

変更履歴

  • 2023/08/05 使用例追記、設定に関して追記
  • 2023/04/16 Webhookを使う方法に関して追記

Discussion