原文: Python Discord Bot Tutorial – Code a Discord Bot And Host it for Free

このチュートリアルでは、クラウド環境だけを利用して独自の Discord ボットを構築する方法をお伝えします。

ご自身のコンピューターに何かをインストールする必要も、ボットをホストするために料金を支払う必要もありません。

Discord API、Python のライブラリ、および Repl.it と呼ばれるクラウドコンピューティングプラットフォームなど、いくつかのツールを使用します。

このチュートリアルには動画バージョンもあります。下の埋め込み動画をご覧ください。テキストバージョンは動画の下に続きます。

Discord ボットのアカウントを作成する方法

Python のライブラリと Discord API を扱うには、まず Discord ボットのアカウントを作成しなければなりません。

Discord ボットのアカウントを作成する手順は次のとおりです。

1. Discord のウェブサイト にログインしているか確認します。

2. application ページ に移動してください。

3.「New Application」ボタンをクリックします。

click_new_application_button

4. アプリケーションの名前を入力し、「Create」をクリックします。

give_apprication_name

5.「Bot」タブに移動してから、「Add Bot」をクリックしてください。その後で「Yes, do it!」をクリックして確定する必要があります。

add_bot_button

PUBLIC BOT (チェック済み) と REQUIRES OAUTH2 CODE GRANT (チェックなし) は、デフォルトの設定のままにしておいてください。

これでボットが作成されました。次のステップは、トークンをコピーすることです。

copy_token

このトークンはボットのパスワードなので、誰にも共有しないようにしてください。誰かがボットにログインして、さまざまな悪さを働いてしまいかねませんので。

もし誤って共有してしまったとしても、トークンは作り直せます。

ボットをサーバーに招待する方法

ここで、ボットユーザーをサーバーに追加しなければなりません。そのためには、ボット用の招待 URL を作成する必要があります。

では「OAuth2」タブに移動してください。次に、「SCOPES」セクション下の 「bot」を選択します。

select_bot_in_scopes

ここでは必要なボット用のパーミッションを選びます。ボットはもっぱらテキストメッセージを使用するので、多くのパーミッションは必要ありません。ボットに何をさせたいかによって、さらにパーミッションが必要になるかもしれません。「Administrator」パーミッションには注意してください。

permission

適切なパーミッションを選んだら、その上にある「Copy」ボタンをクリックしてください。これで、ボットをサーバーに追加するのに使用する URL をコピーできます。

URL をブラウザーに貼り付け、ボットを招待するサーバーを選んで、「Authorize」をクリックしてください。

ボットを追加するには、あなたのアカウントに「Manage Server」パーミッションが必要です。

これでボットユーザーが作成されたので、ボット用の Python コードを記述し始めましょう。

基本的な Discord ボットを discord.py ライブラリを用いてコーディングする方法

ボット用のコードは、discord.py という Python ライブラリを使用して記述します。discord.py とは、Discord 用の API ラッパーであり、Python の中で Discord ボットを作成しやすくしてくれます。

repl (Read-Eval-Print Loop - 対話型実行環境) を作成し discord.py をインストールする方法

ボットは、ローカルコンピューター上で、任意のコードエディターを使用して開発できます。ですが、このチュートリアルでは、Repl.it を使用して、誰もがもっと簡単に理解できるようにしています。Repl.it とは、ウェブブラウザー内で使用できるオンライン IDE です。

Repl.it に移動することから始めましょう。次に、新しい repl を作成し、言語は「Python」を選びます。

discord.py ライブラリを使用するには、main.py の先頭に import discord を記述します。「RUN」ボタンを押すと、Repl.it は自動的にこの依存関係をインストールしてくれます。

ローカルでボットをコーディングしたい場合は、次のコマンドを使用して MacOS に discord.py をインストールできます:

python3 -m pip install -U discord.py

pip の代わりに、pip3 を使用しなければならないかもしれません。

Windows を使用している場合は、先ほどのコマンドではなく、次の行を使用する必要があります:

py -3 -m pip install -U discord.py

ボット用の Discord Events をセットアップする方法

discord.py の中心にあるのはイベントの概念です。イベントとは、なにかを検出してから応答するものです。たとえば、メッセージが起こると、そのメッセージに関するイベントを受けて応答できます。

特定のメッセージに応答するボットを作ってみましょう。このシンプルなボットのコードとその説明は、discord.py の公式ドキュメントから抜粋しています。後のセクションで、さらにボットへ機能を追加していきます。

次のコードを main.py に追加してください (discord.py でなければ、このファイルにお好きな名前をつけてもらってかまいません)。このコード全体で行われていることについては、コードの後で手短に説明します。

import discord
import os

client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

client.run(os.getenv('TOKEN'))

Discord 上でボットユーザーを作成した時に、トークンをコピーしましたね。ではここで、.env ファイルを作成し、トークンを保存しましょう。コードをローカルで動作させている場合は、.env ファイルは必要ありません。os.getenv('TOKEN') をトークンに置き換えるだけです。

.env ファイルは、環境変数を宣言するのに使用します。Repl.it では、作成したファイルのほとんどは誰でも見ることができますが、.env ファイルはあなただけにしか見えません。公開されている repl を見ている他の人々には、.env ファイルの内容は見ることができないのです。

したがって、Repl.it 上で開発している場合は、トークンやキーなどの個人情報だけを .env ファイル内に入れるようにしましょう。

「Add file」ボタンをクリックして .env という名前のファイルを作成してください。

click_add_file_button

作成したファイル内に、前にコピーした実際のトークンを含む、以下の行を追加してください:

TOKEN=[トークンをこちらに貼り付けてください]

ここで、 Discord ボットのコードの、各行で行われていることを調べてみましょう。

  1. 最初の行で discord.py ライブラリをインポートしています。
  2. 2 行目で os ライブラリをインポートしていますが、これは TOKEN 変数を .env ファイルから取得するためだけに使用されています。.env ファイルを使用しない場合は、この行は必要ありません。
  3. 次に、Client のインスタンスを作成しています。これで Discord に接続します。
  4. @client.event() デコレータはイベントを登録します。これは非同期ライブラリなので、コールバックを使用して処理を行います。コールバックとは、何らかの処理が実行された時に呼び出される関数のことです。このコード内では、ボットを使用する準備ができた時に、on_ready() イベントが呼び出されます。その後で、ボットがメッセージを受け取る時に、on_message() イベントが呼び出されます。
  5. on_message() イベントはメッセージを受け取るたびに発生しますが、 メッセージがボットからのものである場合には、イベントで何も処理しないようにする必要があります。そのため、Message.authorClient.user と同じ場合は、コードは単にリターンします。
  6. 次に、Message.content (メッセージの内容) が '$hello' で始まるかどうかをチェックします。もしそれで始まっていれば、ボットは使用されているチャンネルに 'Hello!' と返信します。
  7. これでボットが設定できたので、最後の行でログイントークンを使用してボットを実行します。この行は、外部の .env ファイルからトークンを取得しています。

ボット用のコードが用意できたので、ここで動作させてみる必要があります。

ボットを動作させる方法

では、Repl.it 内の上側にある RUN ボタンをクリックして、ボットを実行してください。

ボットをローカルで記述している場合は、ターミナル内で以下のコマンドを使用すれば、ボットを実行できます:

Windows:

py -3 main.py

その他のシステム:

python3 main.py

次に、Discord のルームに移動し、「$hello」と入力してください。ボットが「Hello!」と返事をするはずです。

bot_returns_hello

ボットを改良する方法

これで、基本的なボットを動作させることができたので、それを改良してみましょう。このボットは、次の理由から「励ましボット (Encourage Bot)」と呼ばれます。

このボットは、誰かが悲しい、または重苦しい言葉を含むメッセージを送った時に、必ず励ましのメッセージで答えてくれます。

使用する励ましのメッセージを誰もがボットに追加でき、またユーザーが提案したメッセージは、Repl.it データベース内に保存されます。

さらに、誰かが「$inspire」とチャット内で入力すると、ボットは、API でランダムに取得された心を動かす引用句を返信してくれます。

では、その「$inspire」機能の追加から始めましょう。

ボットに心を動かす引用句を追加する方法

zenquotes.io という API から、心を動かす引用句を取得します。Python モジュールをさらにいくつかインポートし、get_quote() 関数を追加し、その関数を呼び出すようにボットのコードを更新する必要があります。

こちらが更新されたコードです。新たな部分についてはコードの後で説明します。

import discord
import os
import requests
import json

client = discord.Client()

def get_quote():
  response = requests.get("https://zenquotes.io/api/random")
  json_data = json.loads(response.text)
  quote = json_data[0]['q'] + " -" + json_data[0]['a']
  return(quote)

@client.event
async def on_ready():
  print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('$inspire'):
    quote = get_quote()
    await message.channel.send(quote)

client.run(os.getenv('TOKEN'))

ここでは、requests モジュールをインポートしなければなりません。このモジュールを使用すれば、コードで HTTP リクエストを作成して、API からデータを取得できるようになります。API は JSON を返すので、 json モジュールを使用することで、返ってきたデータが簡単に扱えるようになります。

get_quote() 関数は、その名のとおり引用句を取得する関数です。まず、この関数は requests モジュールを使用して API の URL からデータを要求しています。この API は、心を動かす引用句をランダムに 1 つ返します。この関数は、今回のものが機能しなくなった場合でも、別の API から引用句を取得するように、簡単に書き直せます。

次に、API からのレスポンスを JSON に変換するのに、json.loads() をこの関数内で使用します。試行錯誤の末に、私は JSON の引用句を必要な文字列形式に変える方法を発見しました。この関数は、引用句 (quote) を文字列として返してくれます。

コード内で最後に更新された部分は、コードの終わりの方にあります。これまで、この部分は「$hello」で始まるメッセージを待ち受けていました。ですが、ここでは「$inspire」を待ち受けています。そして「Hello!」を返す代わりに、quote = get_quote() で取得した引用句を返します。

ここまでくればコードを実行して試してみることができます。

励ましのメッセージをボットに追加する方法

では、悲しい言葉を含むメッセージをユーザーが投稿した際に、ボットが励ましのメッセージで応答する機能を実装しましょう。

ボットに悲しい言葉を追加する方法

まずは、ボットが反応する悲しい言葉を含む、Python のリストを作成する必要があります。

作成した client 変数の後に次の行を追加してください:

sad_words = ["sad", "depressed", "unhappy", "angry", "miserable"]

別の言葉を自由にリストに追加してみてください。

ボットに励ましのメッセージを追加する方法

次に、応答するときにボットが使用する、励ましのメッセージのリストを追加しましょう。

以下のリストを、作成した sad_words リストの後に追加してください:

starter_encouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

先ほどと同じように、自身で選択した語句を自由にリストに追加してみてください。ここでは、語句を 3 つしか使用していませんが、それは、ボットが使用する励ましの言葉をユーザーがさらに追加する機能を、後で追加するからです。

メッセージに応答する方法

ここで、作成した 2 つのリストを使用するために、ボットを更新する必要があります。まず、励ましのメッセージを、ボットがランダムに選べるようにするために、random モジュールをインポートします。コードの先頭のインポート文に次の行を追加してください: import random

次に、すべてのメッセージをチェックして、それらが sad_words リストの言葉を含んでいるかどうか確認するために、on_message() 関数を更新します。これで、悲しい言葉を見つけると、ボットはランダムに励ましのメッセージを送ってくれます。

更新されたコードはこちらです:

async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content

  if msg.startswith('$inspire'):
    quote = get_quote()
    await message.channel.send(quote)
    
  if any(word in msg for word in sad_words):
    await message.channel.send(random.choice(starter_encouragements))

ボットをテストする良い頃合いです。これで、独自のボットを作成するための十分な知識が得られました。ですが、さらに高度な機能を実装する方法と、Repl.it データベースを使用してデータを保存する方法を、これから学習しましょう。

ユーザーが投稿したメッセージを有効にする方法

ボットは完全に機能していますが、ここで、Discord から直接ボットを更新できるようにしてみましょう。悲しい言葉を見つけた時にボットが使用できる励ましのメッセージを、ユーザーがさらに追加できるほうがいいですよね。

ユーザーが投稿したメッセージを保存するのに、ここでは Repl.it の組み込みデータベースを使用します。このデータベースは、すべての repl に組み込まれているキーバリューストアです。

コードの先頭にある他のインポート文の下に、from replit import db を追加してください。これで、Repl.it データベースが使用できるようになります。

では、ユーザーが、使用する個別の励ましのメッセージを、Discord チャットからボットに直接追加できるようにしましょう。ボットに新しいコマンドを追加する前に、個別のメッセージをデータベースに追加し、またそれらを削除する、2 つの補助的な関数を作成します。

以下のコードを get_quote() 関数の後に追加してください:

def update_encouragements(encouraging_message):
  if "encouragements" in db.keys():
    encouragements = db["encouragements"]
    encouragements.append(encouraging_message)
    db["encouragements"] = encouragements
  else:
    db["encouragements"] = [encouraging_message]

def delete_encouragment(index):
  encouragements = db["encouragements"]
  if len(encouragements) > index:
    del encouragements[index]
  db["encouragements"] = encouragements

update_encouragements() 関数は、励ましのメッセージを 1 つ、引数として受け取ります。

最初に、この関数は「encouragements」というキーがデータベース内にあるかチェックします。そのキーがある場合は、データベース内の既存の励ましのリストを取得し、そのリストに新しい励ましのメッセージを加え、更新されたリストをデータベース内の「encouragements」キーに保存します。

データベースに「encouragements」が含まれていない場合は、その名前のキーが新たに作成され、新しい励ましのメッセージが、キーに保存するリストの中の最初の要素として追加されます。

delete_encouragement() 関数は、インデックスを 1 つ、引数として受け取ります。

この関数は、「encouragements」キーに保存されている、励ましのリストをデータベースから取得します。励ましのリスト内の項目数がインデックスよりも大きければ、そのインデックスの項目が削除されます。

最後に、更新されたリストをデータベース内の「encouragements」キーに保存します。

on_message() 関数で更新されたコードはこちらです。新たな部分については、コードの後で説明します。

async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content
 
  if msg.startswith("$inspire"):
    quote = get_quote()
    await message.channel.send(quote)

  options = starter_encouragements
  if "encouragements" in db.keys():
    options = options + db["encouragements"]

  if any(word in msg for word in sad_words):
    await message.channel.send(random.choice(options))

  if msg.startswith("$new"):
    encouraging_message = msg.split("$new ",1)[1]
    update_encouragements(encouraging_message)
    await message.channel.send("New encouraging message added.")

  if msg.startswith("$del"):
    encouragements = []
    if "encouragements" in db.keys():
      index = int(msg.split("$del",1)[1])
      delete_encouragment(index)
      encouragements = db["encouragements"]
    await message.channel.send(encouragements)

上記のコードの最初の新しい行は、options = starter_encouragements です。ここで starter_encouragements のコピーを作成していますが、これはボットが送信するメッセージをランダムに選ぶ前に、ユーザーが投稿したメッセージを、コピーしたリストに追加しようとしているためです。

データベースのキーの中に、「encouragements」が含まれている (これは、ユーザーが個別のメッセージを、少なくとも 1 つ投稿したことを意味します) かどうかチェックします。含まれている場合は、starter encouragements にユーザーメッセージを追加します。

その後、starter_encouragements からランダムにメッセージを送る代わりに、ボットは options からランダムにメッセージを送ります。

次の新しいセクションのコードは、新しいユーザー投稿メッセージをデータベースに追加するのに使用されます。Discord メッセージが「$new」で始まっている場合は、「$new」の後ろのテキストが、新しい励ましのメッセージとして使用されます。

ここで、コード msg.split("$new ",1)[1] は「$new」コマンドをユーザー投稿メッセージから分離し、変数内にそのメッセージを格納しています。この行のコードの "$new " に含まれるスペースに注意してください。スペースのにある文字列を取得したいからです。

新しいメッセージと一緒に update_encouragements という補助的な関数を呼び出すと、ボットは、Discord チャットへ新しいメッセージが追加されたことを確認するメッセージを送信します。

3 つ目の新しいセクション (上記のコードの最後部) は、新しい Discord メッセージが「$del」で始まっているかどうかチェックしています。
これは、データベース内の「encouragements」リストの項目を、1 つ削除するコマンドです。

まず、encouragements という名前の新しい変数を、空の配列で初期化しています。これを行っている理由は、「encouragement」キーがデータベースに含まれていない場合に、このセクションのコードに空の配列を送信させるためです。

もし「encouragement」キーがデータベース内にあれば、「$del」で始まる Discord メッセージから、インデックスが分離されます。それから、削除するメッセージのインデックスが渡された delete_encouragement() 関数を呼び出しています。更新された励ましのリストは encouragements 変数に格納され、ボットは現在のリストを含むメッセージを Discord へ送ります。

ボットに最後に追加する機能について

ボットは動作してくれるはずなので、テストするには良い頃合いでしょう。ではここで、最後にいくつか機能を追加します。

ユーザー投稿メッセージのリストを Discord から直接取得する機能と、ボットが悲しい言葉に応答する動作をオンまたはオフする機能を、追加してみましょう。

まずプログラムの最終的なコード全体を示し、更新された部分については、コードの下で説明します。

import discord
import os
import requests
import json
import random
from replit import db

client = discord.Client()

sad_words = ["sad", "depressed", "unhappy", "angry", "miserable"]

starter_encouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

if "responding" not in db.keys():
  db["responding"] = True

def get_quote():
  response = requests.get("https://zenquotes.io/api/random")
  json_data = json.loads(response.text)
  quote = json_data[0]["q"] + " -" + json_data[0]["a"]
  return(quote)

def update_encouragements(encouraging_message):
  if "encouragements" in db.keys():
    encouragements = db["encouragements"]
    encouragements.append(encouraging_message)
    db["encouragements"] = encouragements
  else:
    db["encouragements"] = [encouraging_message]

def delete_encouragment(index):
  encouragements = db["encouragements"]
  if len(encouragements) > index:
    del encouragements[index]
  db["encouragements"] = encouragements

@client.event
async def on_ready():
  print("We have logged in as {0.user}".format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content

  if msg.startswith("$inspire"):
    quote = get_quote()
    await message.channel.send(quote)

  if db["responding"]:
    options = starter_encouragements
    if "encouragements" in db.keys():
      options = options + db["encouragements"]

    if any(word in msg for word in sad_words):
      await message.channel.send(random.choice(options))

  if msg.startswith("$new"):
    encouraging_message = msg.split("$new ",1)[1]
    update_encouragements(encouraging_message)
    await message.channel.send("New encouraging message added.")

  if msg.startswith("$del"):
    encouragements = []
    if "encouragements" in db.keys():
      index = int(msg.split("$del",1)[1])
      delete_encouragment(index)
      encouragements = db["encouragements"]
    await message.channel.send(encouragements)

  if msg.startswith("$list"):
    encouragements = []
    if "encouragements" in db.keys():
      encouragements = db["encouragements"]
    await message.channel.send(encouragements)
    
  if msg.startswith("$responding"):
    value = msg.split("$responding ",1)[1]

    if value.lower() == "true":
      db["responding"] = True
      await message.channel.send("Responding is on.")
    else:
      db["responding"] = False
      await message.channel.send("Responding is off.")

client.run(os.getenv("TOKEN"))

追加された最初のセクションは、starter_encouragements リストのすぐ下のコードです:

if "responding" not in db.keys():
  db["responding"] = True

データベース内に「responding」という名前のキーを新たに作成し、それを「True」に設定しています。ボットが悲しい言葉に応答すべきかどうかを決定するのに、これが使用されます。プログラムの動作が停止した後でも、データベースは保存されているので、データベースの中にないキーは新しく作るだけで済みます。

コードの次の新しい部分は if db["responding"]: で、悲しい言葉に応答するセクションを含んでいます。ボットは db["responding"] = True の時だけ、悲しい言葉に応答します。この値を更新する機能は、このセクションの後ろに記述されています。

次に、「$del」コマンドにボットを応答させるコードの後に、Discord メッセージとして送信される「$list」コマンドにボットを応答させる新しいコードがあります。

このセクションは、encouragements という名前で空リストを作成することから始まります。そしてもし、データベース内に「encouragements」キーが含まれていれば、たった今作成した空リストを、そのキーの値に置き換えます。

このセクションの最後で、ボットは励ましのリストを Discord メッセージとして送信しています。

次が最後の新しいセクションです。このコードはボットを「$responding」コマンドに応答させます。このコマンドは「true」または「false」のどちらか 1 つの引数を取ります。たとえば、「$responding true」という形で使用します。

このコードはまず、引数を value = msg.split("$responding ",1)[1] で取り出しています (上記の「$new」の場合と同じように、"$responding " の中のスペースに注意してください)。その下には、データベース内の「responding」キーを適切に設定し、Discord へ通知メッセージを送り返す if/else 文があります。引数が「true」以外の場合は、コードは「false」であると見なします。

ボットが継続的に動作するように設定する方法

ボットを Repl.it 内で実行してから、実行中のタブを閉じると、ボットはやがて停止してしまいます。

ところが、たとえウェブブラウザーを閉じた後でも、ボットが継続的に動作し続けられるようにする方法が 2 つあります。

最もシンプルな 1 つ目の方法は、Repl.it の有料プランで契約することです。 Hacker プランと呼ばれる安価な有料プランがあり、常時オンにできる repl を 5 つ利用可能です。

このプランにサインアップしたら、repl を開き上部にある名前をクリックします。次に、「always on」オプションを選択します。

always-on-repl

もう少し複雑ですが、無料利用枠で、コードが動作し続けるようにする別の方法があります。Repl.it は、タブを閉じた後もウェブサーバーを動作させ続けてくれます。ただ、そのウェブサーバーさえも、使用しなければ 1 時間までしか動作しません。

Repl.it の公式ドキュメントには次のように記載されています:

Once deployed, the server will continue to run in the background, even after you close the browser tab. The server will stay awake and active until an hour after its last request, after which it will enter a sleeping stage. Sleeping repls will be woken up as soon as it receives another request; there is no need to re-run the repl. However, if you make changes to your server, you will need to restart the repl in order to see those changes reflected in the live version. (引用元)

(訳: サーバーは一度デプロイされると、ブラウザータブを閉じた後でも、バックグラウンド内で動作し続けます。このサーバーは、最後のリクエストから 1 時間後まで起動したままアクティブな状態を維持し、その後で休止状態に入ります。休止中の repl は、別のリクエストを受けるとすぐに起動されるので、repl を再実行する必要はありません。ただし、サーバーに変更を加えた場合は、ライブバージョンに変更が反映されていることを確認するために、repl を再起動する必要があります)

ボットを継続的に動作させ続けるには、Uptime Robot (https://uptimerobot.com/) と呼ばれる別の無料サービスを使用します。

Uptime Robot では、Repl.it 上のボットのウェブサーバーへの接続を、5 分ごとに確認する ping を設定できます。一定間隔で接続を確認することにより、ボットは休止状態に入ることが無くなり、動作し続けてくれます。

つまり、ボットを継続的に動作させるには、さらに以下の 2 つのことを行わなければなりません:

  1. Repl.it 内でウェブサーバーを作成する
  2. Uptime Robot でウェブサーバーへの接続を確認する ping を設定する。

Repl.it 内でウェブサーバーを作成する方法

ウェブサーバーの作成は思っているよりも簡単なことです。

その作成にあたり、keep_alive.py という名前の新しいファイルを、プロジェクト内で作成してください。

次に、新しいファイルに以下のコードを追加してください:

from flask import Flask
from threading import Thread

app = Flask('')

@app.route('/')
def home():
    return "Hello. I am alive!"

def run():
  app.run(host='0.0.0.0',port=8080)

def keep_alive():
    t = Thread(target=run)
    t.start()

このコード内では、Flask を使用してウェブサーバーを起動しています。サーバーは訪れる人へ、「Hello. I am alive.」を返します。サーバーは、ボットとは別のスレッドで動作します。残りのコードはボットとあまり関係がないので、そのすべてについての説明をここではしません。

ここで、このウェブサーバーを起動するボットが必要になります。

main.py の先頭に次の行を追加して、サーバーをインポートしてください。

from keep_alive import keep_alive

main.py を実行する際にウェブサーバーを起動するには、ボットを実行する直前の、最後から 2 番目の行に、次の行を追加してください。

keep_alive()

コードを追加してから Repl.it 上でボットを実行するときに、新しいウェブサーバーウィンドウが開きます。そこには、ウェブサーバーの URL が表示されます。次のセクションで使用できるように、この URL をコピーしてください。

web-server-url

Uptime Robot の設定方法

ここで、5 分ごとにサーバーへの接続を確認するために、Uptime Robot を設定する必要があります。

まずは https://uptimerobot.com/ で無料のアカウントを作成してください。

アカウントへログインしたら、「Add New Monitor」をクリックします。

add-new-monitor

新しいモニターに対し、Monitor Type は「HTTP(s)」を選択して、好きな名前をつけてください。それから、Repl.it のウェブサーバーの URL を貼り付けます。最後に、「Create Monitor」をクリックしてください。

new-monitor-setup

やりました!これでボットは継続的に動作し、誰もが Repl.it 上でそれと対話できるようになりました。

結び

これで、クラウド内で Discord ボットを Python を使用して作成し、継続的に動作させる方法が理解できましたね。

discord.py ライブラリにできることは、まだまだたくさんあります。したがって、もし Discord ボットにさらに機能を追加したいならば、次のステップは discord.py の公式ドキュメントを調べてみることです。