Создайте бота Discord с Python 3

ПРИМЕЧАНИЕ. Это руководство основано на discord.py версии 1.4.1, и с тех пор в Discord API были внесены критические изменения, которые должны были быть внесены в v1.5.0. К сожалению, это руководство устарело в течение двух месяцев своего существования. Я укажу на основные изменения моего кода / инструкций ниже.

Независимо от того, являетесь ли вы активным пользователем Discord, модерируете ли вы сервер или владеете сервером, вам обязательно стоит подумать о создании собственного бота. Этот опыт является одновременно интересным и практичным, поскольку он может принести пользу вашему серверу и дать вам больше возможностей для настройки по своему усмотрению. Хотя в экосистеме Discord уже есть боты, которые просты в использовании, они могут не соответствовать вашим конкретным потребностям или могут быть слишком функциональными для простого варианта использования, который вам нужен, поэтому навыки создания собственного бота необходимы безусловно преимущество.

В этом руководстве представлены первые шаги по созданию discord.py бота. Если вы заинтересованы в его создании сейчас или в будущем, читайте ниже!

Предпосылки

Прежде чем мы начнем, вы должны знать следующее:

Вот и все. Не волнуйтесь, установлен discord.py или нет, я сделаю это за вас тоже.

Начиная

Я предполагаю, что вы находитесь в новом пустом каталоге (предпочтительно git инициализированном), чтобы поместить весь свой код для этого бота. Если нет, сделайте это сейчас.

Установка discord.py library

Это должно быть само собой разумеющимся - вы создаете бота Discord с Python, верно? Тем не менее, при установке discord.pyЯ рекомендую создать виртуальную среду Python. Почему это важно? Что ж, если вы создаете этого бота, вы, вероятно, собираетесь развернуть его в другом месте (в противном случае бот будет в сети только тогда, когда вы запускаете скрипт бота Python). С точки зрения непрофессионала, виртуальная среда отслеживает пакеты Python, которые вы используете для проекта, чтобы вы могли экспортировать их позже. Большинство методов развертывания зависят от этого экспорта в виде файла .txt, и это избавит вас от некоторых хлопот в дальнейшем.

Heads Up: # = comments (don't copy) ; $ = shell commands
# Go into your directory, if you haven't done so
$ cd <your_discord_bot_directory>
# Create your virtual environment (venv). I'm giving it the name
# `discordbot_env`, but you can change it to whatever you want.
$ python -m venv discordbot_env
# Activate the environment
$ source discordbot_env/bin/activate   # (MacOS & Linux)
$ bot-env\Scripts\activate.bat         # (Windows)
# Install discord.py
$ pip install -U discord.py

Теперь запустите свой любимый редактор кода или IDE, выберите виртуальную среду в качестве среды Python и создайте bot.py файл в рабочем каталоге (имя файла, вероятно, не имеет значения).

Boilerplate

Помимо прямого импорта discord, мы хотим использовать Bot API discord.py, который поставляется с пакетом Python. Вот несколько начальных операций импорта и команд для запуска вашего bot.py файла:

# NOTE: after v.1.5.0, discord.py reqires "Intents" to be used with bots. I've updated this snippet to work with discord.py's latest breaking update!
import discord
from discord.ext.commands import Bot
from discord import Intents
intents = Intents.all()
bot = Bot(intents=intents, command_prefix='$') # or whatever prefix you choose(!,%,?)

# insert the line below at the end of the file 
# define <TOKEN> as your discord bot token
bot.run(<TOKEN>)

При этом создается новый экземпляр Bot, который служит для подключения к Discord. Мы можем использовать этот экземпляр для создания слушателей событий и команд.

Bot экземпляры технически Client экземпляры, которые являются низкоуровневыми (и когда-то единственными) связями между discord.py и Discord. Однако для простоты и лучшей реализации функций придерживайтесь Bot - вы поблагодарите меня позже (иначе вам придется вручную анализировать каждое сообщение на предмет специального символа и следующих аргументов с помощью Client, где вам нужно только указать command_prefix в Bot).

Бот-модуль

События - наличие реакции бота на то, что происходит на сервере.

Модуль предоставляет простой способ связать действия бота с различными событиями на сервере Discord. discord.py поддерживает множество различных событий сервера, которые можно «прослушать».

Вот пример:

ПРИМЕЧАНИЕ. Из-за критических изменений версии 1.5.0 вам теперь нужно будет добавить дополнительную строку после on_message(), чтобы после нее можно было запускать дополнительные команды: await bot.process_commands(message) . В противном случае ваш бот может перестать отвечать! Дополнительную информацию можно найти здесь.

При запуске этот файл Python будет делать следующее:

  • Распечатайте на консоли Bot connected as <bot_username>, когда она завершит настройку.
  • Каждый раз, когда пользователь вводит test в чат, бот отвечает Testing 1 2 3!

Действительно, довольно просто! Вот некоторые моменты, на которые следует обратить внимание:

  • Декоратор @bot.event означает, что вы указываете функцию для события в следующей строке.
  • Функция события имеет ключевое слово async. Функция является асинхронной и неблокирующей, что означает, что она не препятствует запуску других функций, если эта функция все еще выполняется.
  • Метод message.channel.send() вызывается с ключевым словом await. Это указывает асинхронной функции ждать / блокировать, пока метод не будет выполнен. Если в будущем вы столкнетесь с ошибками внутри async функций, скорее всего, вы забыли ключевое слово await.
  • Обратите внимание на имена функций: on_ready() и on_message(). Они названы так намеренно, чтобы соответствовать событиям разногласий, которые discord.py поддерживают. Ваши события не будут работать, если имя вашей функции неверно.

Чтобы увидеть полный список событий, поддерживаемых discord.py, загляните здесь.

Команды

Бот Discord на самом деле не бот, если у него нет команд! Допустим, нам нужно, чтобы бот печатал имя сервера, когда кто-то вводит $server на канал. Вот как мы можем этого добиться с помощью discord.py:

Следуя коду:

  • Мы инициализируем новый Bot с префиксом команды $. Ввод этого префикса с аргументом (например, $<command>) заставляет бот найти определенную команду с параметром name, соответствующим аргументу.
  • Мы используем декоратор @bot.command, чтобы назначить следующую функцию команде с именем «сервер». Это определяет наличие команды бота $server.
  • Функция асинхронная, но имя функции больше не имеет значения. Он принимает абстрактный параметр context, который представляет относительное место (сервер и текстовый канал), откуда была использована команда $server.
  • Объект guild фактически обозначает интересующий сервер Discord в соответствии с официальным API Discord. Мы получаем этот объект из контекста, поэтому теоретически эта команда может работать на нескольких серверах без изменений.
  • Мы выводим информацию о сервере / гильдии (имя, размер, владелец) в то же место, где была набрана команда (context).

Что нужно иметь в виду

Функция «Помощь»

Когда вы используете модуль Bot (вместо Client), функция «Помощь», к счастью, позаботится о вас. Эта функция особенно полезна для напоминания пользователям о том, как использовать команды бота, а также о доступных командах. Эта функция «Помощь» выполняется путем соединения command_prefix с help; в нашем примере это будет $help.

Обычно функция печатает строку, описывающую каждую команду, каждая из которых будет написана вами. Как вы определяете строку справки для каждой команды? Он передается в качестве аргумента декоратору @bot.command(), как показано ниже:

@bot.command(name = 'server', help = 'Fetches server information')

Изменение присутствия бота в Discord

Это относительно легко сделать на discord.py. Это можно сделать с помощью метода bot.change_presence() и изменить во время выполнения бота.

Например, возможно, вы хотите сделать так, чтобы бот «играл в Fortnite», и вы хотите, чтобы он был таким с момента запуска бота. Для этого вам следует изменить функцию события on_ready() следующим образом:

@bot.event
async def on_ready():
    await bot.change_presence(activity = discord.Game('Fortnite'))

Вы также можете изменить действие немного другим способом, если хотите, чтобы действие было отличным от игры или шоу / фильма. Например, ниже показана активность бота «Наблюдая за Гамильтоном на Disney +»:

await bot.change_presence(activity = discord.Activity(
                          type = discord.ActivityType.watching, 
                          name = 'Hamilton on Disney+'))

Заключение

Вот и все, что вам понадобится, чтобы быстро приступить к работе! Пользовательские боты добавляют новое измерение вашему серверу, помогая вам повысить эффективность и даже предлагая забавный элемент. Помимо этого, получение необходимых навыков для добавления собственного бота помогает разнообразить ваши способности и может быть весьма приятным опытом. Я надеюсь, что моя статья помогла вам попробовать это, получайте удовольствие, создавая своего Discord Bot!