Discord — популярная платформа для общения: ежедневно ей пользуются более 10 миллионов человек. И если управлять небольшим чатом друзей можно самостоятельно, то со средними и крупными каналами без помощи уже не справиться. Рассказываем, как создать чат-бота для Discord на Python: от регистрации на платформе до написания кода.
Каждый день Discord используют более 10 миллионов человек — эта статистика ясно показывает интерес людей к сообществам Discord. Пользователи постоянно исследуют эту платформу и присоединяются к новым серверам с актуальной для них тематикой. А с ростом числа участников администраторам становится сложнее управлять сервером — здесь и наступает момент, когда необходимо подключать ботов. Существует большое количество задач, которые можно передать ботам-администраторам: а в результате мы получаем и улучшение пользовательского опыта, и упрощение работы админа.
Вот только некоторые из этих задач:
- Приветствие новых членов группы.
- Ответы на часто задаваемые вопросы.
- Бан участников, нарушающих правила сервера.
- Автоматические ответы, отправка и удаление сообщений.
- Управление ролями участников.
Этот далеко не исчерпывающий список. Администраторы средних и крупных сообществ Discord всегда предпочитают включать несколько специализированных ботов на своём сервере, чтобы передать им часть своих обязанностей. Ознакомившись с нашим руководством, вы также сможете создать своего собственного бота Discord на Python.
Подготовка
Создание сервера
- Для начала нам нужен сервер Discord и канал на этом сервере. Чтобы создать сервер, понадобится учётная запись Discord; если учётной записи ещё нет, создайте её, перейдя по ссылке https://discord.com/.
- Нажмите кнопку «Добавить сервер» (символ «плюс») на левой боковой панели — это действие откроет интерфейс создания сервера. Выберите шаблон сервера.
- Укажите дополнительную информацию. Выберите цель создания сервера, есть два варианта: первый — сообщество по интересам, клуб, общественная, профессиональная организация, второй — частное объединение друзей для развлечения.
- Вам предложат персонализировать сервер: выберите подходящее и запоминающееся имя и иконку. Если вы планируете использовать его для общения членов какой-либо организации, то можете дать название своего сообщества или компании для лучшей узнаваемости.
- На этом этапе сервер создан.
Создание канала
Теперь нужно создать канал, на который впоследствии мы будем устанавливать бот. Наш бот будет работать только на этом канале.
- Нажмите «Добавить» (плюс) в списке текстовых каналов.
- Выберите тип канала («text»), дайте ему название и укажите, будет ли он приватным:
- Канал создан:
Регистрация бота
Итак, платформа для размещения бота — учётная запись, сервер и канал — готова; теперь мы можем приступить к созданию бота на Python. Вначале зарегистрируем будущего бота на портале разработчиков Discord. Портал разработчиков — это инструмент, созданный для пользователей, которые хотят расширить возможности Discord, в нашем случае — подключить бота; на портале будет создан API-ключ, позволяющий стороннему приложению (боту) взаимодействовать с сервером Discord.
- Перейдите по ссылке https://discord.com/developers/applications для входа в портал. Войдите в свою учётную запись Discord.
- Выберите создание нового приложения, чтобы инициализировать нового бота. Введите имя создаваемого приложения. Имя приложения будет именем вашего бота, впоследствии вы сможете его изменить.
- Настроим новое приложение. Нажмите «Бот» на левой боковой панели, затем нажмите «Добавить бота».
- Понадобится подтвердить действие. Во всплывающем окне с вопросом, действительно ли вы хотите добавить бота, нажмите «Да».
- Скопируйте токен аутентификации с помощью кнопки «Копировать». Этот токен используется для авторизации программ в Discord. Не передавайте свой токен никому.
Настройка и авторизация бота
Бот зарегистрирован, дадим ему разрешения и укажем сферу применения. Разрешения определяют, какие действия на сервере доступны боту (например, отправка сообщений). Сфера применения — это роль, которую будет выполнять бот.
- В левом меню нажмите на «OAuth2», после чего — на «URL Generator». Вы увидите список областей применения приложения, отметьте галочками нужные. Наше тестовое приложение мы будем использовать только в качестве бота, поэтому ставим галочку напротив «bot». Если вы хотите использовать слэш-команды, обязательно выберите пункт «applications.commands».
- На следующем шаге предоставим разрешения. Мы собираемся дать боту разрешение отправлять и отвечать на сообщения, поэтому отмечаем все пункты, связанные с этими действиями. Разрешения можно изменить в любой момент, и сгенерировать новый URL.
- Внизу страницы будет находиться сгенерированный для бота URL-адрес. Скопируйте его, нажав на «Копировать».
- Перейдите по скопированному URL-адресу в новой вкладке. По этой ссылке нужно авторизовать внешнее приложение на сервере. Выберите сервер, на котором будет добавлен бот, и нажмите «Продолжить».
- В следующем окне перечислены разрешения, если нужно — можете их отредактировать. Нажмите «Авторизовать».
- Подтвердите, что вы человек, с помощью капчи, после чего бот будет авторизован.
- Зайдите на сервер Discord, добавленный бот будет в списке участников, находящихся оффлайн.
Пишем Python-код для бота
В этом разделе мы рассказываем, как написать код бота на Python, который API Discord будет использовать для реализации поведения бота. Предварительно установите Python-библиотеку discord.py.
- Необходимо создать файл .env, в который будет записан ключ обновления бота (токен, скопированный при регистрации). Файл .env защитит учётные данные при размещении кода бота. Создадим файл .env в папке проекта и запишем в него следующий код (вставьте ваш ключ):
TOKEN = ‘<YOUR_KEY>’
- Импорт модулей.
Создадим файл Python для основного кода бота в том же каталоге; можете назвать его традиционно — main.py — или по своему усмотрению. Импортируем необходимые модули, для этого пропишем:
import discord
import os
import random
from dotenv import load_dotenv
Таким образом мы импортируем следующие модули:
- discord — библиотека для поддержки многофункционального API Discord;
- os — модуль, предназначенный для импорта переменных сред;
- random — используется для выполнения различных случайных операций с данными;
- dotenv — импортирует .env-файл в основной python-файл.
- Инициализация переменных.
Пропишем в python-файле:
load_dotenv()
client = discord.Client()
token = os.getenv('TOKEN')
Здесь мы указали, что используем функцию «load_dotenv()» для импорта переменных окружения, создаём клиента Discord для отправки запроса в API Discord и последней строкой получаем и инициализируем токен переменной окружения.
- Инициализация бота.
Далее пишем в том же python-файле:
@client.event
async def on_ready():
print("Logged in as a bot {0.user}".format(client))
Здесь мы используем событие «on_ready()», предоставленное API Discord; как только наш клиент API инициализируется, это событие запустит выполнение заданной операции. В нашем примере будет выведено имя бота.
- Настройка ответов бота.
Запрограммируем ответы бота на сообщения пользователя. Событию API Discord «on_message» будет передан аргумент «message», содержащий сведения о сообщении, авторе сообщения, канале, на котором было отправлено сообщение и т. д.
- Сначала будет извлечена информация о сообщении: имя пользователя, канал и содержание сообщения.
- Важно, чтобы бот не разговаривал сам с собой. Поэтому устанавливаем проверку отправителя: если сообщение отправляет сам бот, то он не будет отвечать на него. Если не прописать это условие, то действие будет зациклено и бот будет бесконечно отвечать сам себе.
- В нашем примере — канал с названием «random», чтобы активировать бота на своём канале, замените «random» на его название. Далее можно прописать несколько операторов if-else, также можете реализовать чат-бота с использованием машинного обучения. В примере мы прописали несколько операторов if-else для ответа на простые сообщения: приветствие и прощание — «hi», «hello», «bye» — бот будет отвечать на них, называя пользователя по имени, также наш бот будет рассказывать шутку в ответ на «tell me a joke».
Пользуясь этими примерами, вы можете добавить больше функций и сделать своего бота более интерактивным.
Блок кода Python выглядит так:
@client.event
async def on_message(message):
username = str(message.author).split("#")[0]
channel = str(message.channel.name)
user_message = str(message.content)
print(f'Message {user_message} by {username} on {channel}')
if message.author == client.user:
return
if channel == "random":
if user_message.lower() == "hello" or user_message.lower() == "hi":
await message.channel.send(f'Hello {username}')
return
elif user_message.lower() == "bye":
await message.channel.send(f'Bye {username}')
elif user_message.lower() == "tell me a joke":
jokes = [" Can someone please shed more\
light on how my lamp got stolen?",
"Why is she called llene? She\
stands on equal legs.",
"What do you call a gazelle in a \
lions territory? Denzel."]
await message.channel.send(random.choice(jokes))
- Запуск бота.
Выше мы создали API-клиент, который предоставляет функцию, вызываемую для запуска. Эта функция принимает «auth token» в качестве аргумента и запускает бота, вызывая событие «on_ready»:
client.run(token)
В результате бот начинает отвечать на сообщения участников канала.
Журнал:
Создание команд
В приведённых выше примерах мы показали, как использовать «client.event» для команд, но на практике этот метод обычно не используется. Discord предоставляет другой удобный способ создания команд — использование префикса. Отредактируем python-файл.
- Импорт команд.
Импортируем «commands» из «discord.ext», они помогут нам реализовать команды:
from discord.ext import commands
- Выбираем префикс.
Теперь выберем префикс, с которого бот должен активироваться и слушать команды. Это может быть любой символ, буква или даже слово. Для простоты выберем в качестве префикса восклицательный знак. Для этого отредактируем определённый ранее «client»:
client = commands.Bot(command_prefix="!*)
- Создание команд.
После этого мы можем создавать команды — для этого будем использовать «client.command» в качестве декоратора Python:
@client.command()
async def ping(ctx):
await ctx.send('Pong!')
В этом блоке кода:
- ctx — представляет класс «commands.context»; аргумент обязателен для всех обычных команд (не для слэш-команд). Он представляет контекст, в котором вызывается команда и может предоставить много метаданных, например: данные об авторе, содержание сообщения и т. д.
- ctx.send — используется для отправки сообщения обратно в канал, где была вызвана команда. Обязательно используйте «await», так как это сопрограмма.
Теперь запустите файл снова и перейдите на канал сервера, где находится бот.
Если вы введёте «!ping», то бот ответит «pong».
Читайте в блоге: