[discord.py] グローバルチャットのつくりかた (Webhook版)

discord.pyでグローバルチャットをつくる (Webhook版)

[discord.py] グローバルチャットをつくる (Webhook版)

この記事について

この記事ではdiscord.pyを使って、Webhook版のグローバルチャットを作成します。
PythonやBotの稼働環境などは既に構築済みのものとして話を進めます。
また、前の記事で説明していたイベント云々の機能・仕組みを理解している前提です。

Webhookをつくろう

Webhookを作成しないことにはまず始まりません。
チャンネルの設定からも作成できますが、どうせならBotから作成しちゃいましょう
今回からはコマンドフレームワークを使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import discord
from discord.ext import commands

# Botオブジェクト作成
bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())
bot.GLOBALCHAT_NAME = "globalchat" # グローバルチャットの名前
bot.webhooks = {} # !create で作成したWebhookをおいておく場所

@bot.command()
async def create(ctx: commands.Context):
    webhook = await ctx.channel.create_webhook(name="globalchat")
    bot.webhooks[ctx.guild.id] = webhook.url
    return await ctx.reply("> 作成しました! {0.url}".format(webhook))

これで !create をチャンネルで入力すると、権限不足でなければWebhookが作成されます
が、Webhookを保存しておかなければ後々使えませんので、どこかに置いておきましょう
Ex: bot.webhooks = {} にしておいてその中に足していく等

メッセージ送受信

さっき作ったWebhookを使います

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@bot.event
async def on_message(msg: discord.Message):
    # メッセージを送信したユーザーがBotならreturn
    if msg.author.bot:
        return
    if msg.author.id == bot.user.id:
        return
    # チャンネルがグローバルチャットでなければreturn
    if not msg.channel.name == bot.GLOBALCHAT_NAME:
        return

    # このコードではメッセージを送信したチャンネルにもwebhookが送信されるので、
    # 邪魔な元のメッセージは消しておく
    await msg.delete()
    
    for i in bot.webhooks.values():
        # Webhookオブジェ作成
        wh = discord.Webhook.from_url(i)
        
        # メッセージに画像が添付されているか
        if msg.attachments:
            await wh.send(
                content=msg.content, # メッセージの内容
                username=msg.author, # ユーザー名設定
                avatar_url=msg.author.avatar, # アイコン設定
                files=[await i.to_file() for i in msg.attachments], # 画像とか
                allowed_mentions=discord.AllowedMentions.none() # メンション無効化
            )
        else:
            await wh.send(
                content=msg.content, # メッセージの内容
                username=msg.author, # ユーザー名設定
                avatar_url=msg.author.avatar, # アイコン設定
                allowed_mentions=discord.AllowedMentions.none() # メンション無効化
            )

こんな感じで動くと思います ↓↓↓
discord-gc-wh

これをいじって自分好みのものにしてみましょう!

おわり

前回同様この記事内のコードでは動作しない場合や、思っているような動作にはならない場合があります。

宣伝

こういうBot作ってます↓↓↓
mirei-dbot

Bot Webサイト | 導入はこちら


Made with 💚 and Stack (Jimmy)