[Python] Discord Botに使えるテンプレート4選!

Bot

DiscordのBotを作れたはいいけど何に使ったらいいのか分からん!

そんな悩みを解決します。

今回はDiscord Botに使えるPythonのテンプレートを紹介します。

テンプレート同士を組み合わせたりカスタマイズするのも全然アリです。

環境

Python3系が動く環境であればOSはなんでも良いです。

Discord Botの準備

こちらの記事でBotの作り方とPythonで実行するまでの手順を解説しています。

テンプレート

今回紹介するのは以下の3つです。

  • おうむ返し
  • 特定のメッセージに応答
  • 特定のユーザーに応答
  • ランダムな返答

おうむ返し

ユーザーがチャンネルに発言すると、全く同じ内容を返します。

ソースコード

import discord

TOKEN = 'ABCD0123' # TOKENを貼り付け
CHANNELID = 0123456789 # チャンネルIDを貼り付け

client = discord.Client()

@client.event
async def on_ready():
    print('起動しました')

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        await channel.send(message.content)
        print(message.content)

client.run(TOKEN)

解説

@client.event
async def on_ready():
    print('起動しました')

Botが起動すると通知されます。

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        await channel.send(message.content)
        print(message.content)
  1. メッセージの送り主がBotではないことを確認
  2. チャンネルIDからチャンネルを取得
  3. messageの内容をそのまま送信
  4. ログに出力

on_message(message)は、メッセージが送信されたときに呼び出され、そのメッセージをmessage変数に格納します。

message.contentは、メッセージの内容を指します。

つまり、「messageの内容をそのまま送信」とは「送信されたメッセージの内容をそのまま送信」という意味です。

これが、おうむ返しの仕組みとなっています。

特定のメッセージに応答

ユーザーが「hello」と送信すると「ハロー!」と返すようにしてみます。

もちろん好きな文字列にカスタマイズ可能です。

ソースコード

import discord

TOKEN = 'ABCD0123' # TOKENを貼り付け
CHANNELID = 0123456789 # チャンネルIDを貼り付け

client = discord.Client()

@client.event
async def on_ready():
    print('起動しました')

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        topic = 'hello' #反応する文字列
        text = 'ハロー!' #返信する文字列
        if message.content == topic:
            await channel.send(text)
            print(text)

client.run(TOKEN)

解説

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        topic = 'hello' #反応する文字列
        text = 'ハロー!' #返信する文字列
        if message.content == topic:
            await channel.send(text)
            print(text)
  1. メッセージの送り主がBotではないことを確認
  2. チャンネルIDからチャンネルを取得
  3. 反応する文字列と返信する文字列を設定
  4. もし、メッセージの内容と反応する文字列が一致していたら、
  5. メッセージを送信
  6. ログに出力

長い感じがしますが、大事なのは4行目です。

message.contentは送られてきたメッセージを指します。

送られてきたメッセージと反応する文字列が同じかどうかを判定しています。

特定のユーザーに応答

ある特定のユーザーがメッセージを送信すると、「ハロー!」と返すようにしてみます。

このテンプレートは他のテンプレートと組み合わせると、より効果を発揮すると思います。

ソースコード

import discord

TOKEN = 'ABCD0123' # TOKENを貼り付け
CHANNELID = 0123456789 # チャンネルIDを貼り付け

client = discord.Client()

@client.event
async def on_ready():
    print('起動しました')

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        userid = 0123456789 #反応するユーザーのユーザーID
        text = 'ハロー!' #返信する文字列
        if message.author.id == userid:
            await channel.send(text)
            print(text)

client.run(TOKEN)

ユーザーIDの取得方法

ユーザーIDはサーバー右側の一覧から、

ユーザーを右クリック → IDをコピー

で取得できます。

解説

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        userid = 0123456789 #反応するユーザーのユーザーID
        text = 'ハロー!' #返信する文字列
        if message.author.id == userid:
            await channel.send(text)
            print(text)
  1. メッセージの送り主がBotではないことを確認
  2. チャンネルIDからチャンネルを取得
  3. ユーザーIDと返信する文字列を設定
  4. もし、メッセージの送り主のIDが反応するユーザーのIDと一致していたら、
  5. メッセージを送信
  6. ログに出力

長いですが、大事なのは4行目です。

message.author.idでメッセージを送ったユーザーのIDを取得し、それが指定したユーザーのID一致しているかどうかを判定しています。

ランダムな返答

何かしらのメッセージが送られたとき、「おはよう」「こんにちは」「こんばんは」のうちどれかを返信するようにしてみます。

他のテンプレートと組み合わせると、より実用的になるかと思います。

ソースコード

import discord
import random

TOKEN = 'ABCD0123' # TOKENを貼り付け
CHANNELID = 0123456789 # チャンネルIDを貼り付け

client = discord.Client()

@client.event
async def on_ready():
    print('起動しました')

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        texts = [ #ランダムで返す文字列
            'おはよう',
            'こんにちは',
            'こんばんは'
        ]
        index = random.randint(0, len(texts) - 1)
        text = texts[index]
        await channel.send(text)
        print(text)

client.run(TOKEN)

使い方

他と比べて少し複雑なので解説します。

ランダムで返す文字列を変更したい場合は、次のように書きます。

texts = [ #ランダムで返す文字列
    'おはよう',
    'こんにちは',
    'こんばんは',
    'おやすみなさい'
]

他の箇所は書き換えなくてOKです。

※「,」カンマ忘れに注意

解説

  1. メッセージの送り主がBotではないことを確認
  2. チャンネルIDからチャンネルを取得
  3. ランダムで返す文字列を設定
  4. 生成した乱数をもとに返す文字列を決定
  5. メッセージを送信
  6. ログに出力

3、4行目が大事です。

文字列をいくつか入れた配列を作り、その中からランダムで一つ文字列を選んでいます。

import randomもお忘れなく。

いかがだったでしょうか。

分からない、できない、質問等あれば、コメントまでご気軽にお問い合わせください。

コメント

  1. huyu より:

    こんばんは!とてもわかりやすい記事で、記事を参考に初心者の自分でもBOTが作れました!
    ランダムな返答についての質問なのですが、ランダムで返す文字列を
    「特定のロールが付与されたメンバーの名前」にすることは可能でしょうか?
    例えば「チームA」というロールが付与された人たちの中から一人の名前を選んで返答するというような動作をさせたいです!
    よろしくお願いします。

    • しろくま しろくま より:

      コメントの確認が遅れてしまい、申し訳ありませんでした。

      まず、ロールのIDをコピーします。
      ‘サーバー設定’ の ‘ロール’から、対象のロールのIDをコピーすることができます。
      コードは以下の通りです。
      一部変数名が変わっているので注意してください。

      import random
      import discord

      TOKEN = ‘ABCD0123’ # TOKENを貼り付け
      CHANNELID = 0123456789 # チャンネルIDを貼り付け

      #変更箇所
      intents = discord.Intents.default()
      intents.members = True
      client = discord.Client(intents=intents)

      @client.event
      async def on_ready():
      print(‘起動しました’)

      @client.event
      async def on_message(message):
      if not message.author.bot:
      channel = client.get_channel(CHANNELID)
      #変更箇所
      role = message.guild.get_role(0123456789) #ロールIDを貼り付け
      members = role.members
      index = random.randint(0, len(members) – 1)
      member = members[index]
      await channel.send(member.name)
      print(member.name)

      client.run(TOKEN)