БэкендPython

Как сделать Discord-бота на Python: добавляем первую команду и ответ

Создаём Discord-приложение, подключаем бота на Python через discord.py, храним токен в .env, регистрируем тестовую slash-команду /hello и проверяем ответ.

Кодик

Автор

6 мин чтения

Чтобы сделать Discord-бота на Python, создайте приложение в Developer Portal, сохраните токен в .env, подключите discord.py и зарегистрируйте slash-команду /hello. Команда будет доступна только на тестовом сервере и ответит пользователю по имени. Для неё не нужен привилегированный доступ к содержимому всех сообщений, поэтому стартовая конфигурация остаётся небольшой и понятной.

У Discord есть два разных объекта, которые новичок часто смешивает. Application описывает интеграцию и команды, а bot user представляет её в сервере. Токен позволяет программе действовать от имени этого бота, поэтому его нельзя вставлять в статью, отправлять в чат или коммитить в Git. В этом проекте секрет останется в локальном файле .env, а код получит его через переменную окружения.

1Создаём

Заводим приложение и bot user в официальном Developer Portal.

2Подключаем

Запускаем discord.py с обычными intents и тестовым guild id.

3Отвечаем

Регистрируем /hello и отправляем ответ на interaction.

Что подготовить в Discord и в папке проекта

Откройте Discord Developer Portal, создайте новое приложение и добавьте bot user в разделе Bot. Скопируйте токен один раз в .env. Затем включите Developer Mode в настройках клиента Discord и скопируйте ID своего тестового сервера. ID не является паролем, но токен является. Для быстрой разработки используем guild-команду: Discord рекомендует команды сервера для тестирования, а глобальные оставляет для готовой публичной версии.

ЗначениеГде взятьГде хранить
Bot tokenDeveloper Portal, раздел Bot.env, никогда не в Git
Guild IDCopy Server ID в Discord.env для тестового сервера
Код приложенияФайл bot.pyВ репозитории без секретов
Зависимостиdiscord.py и python-dotenvВ отдельном виртуальном окружении
Команда/helloРегистрируется через CommandTree

Схема Discord приложения bot user токена и Python процесса
Приложение хранит настройки, bot user виден на сервере, а Python-процесс подключается по секретному токену.

Сразу исключите файл окружения из Git. Если токен когда-либо попал в публичный репозиторий, сообщение или скриншот, считайте его скомпрометированным и сбросьте в Developer Portal. Простого удаления из последнего коммита недостаточно.

Пишем бота со slash-командой /hello

Создайте виртуальное окружение командами python -m venv .venv и python -m pip install -U discord.py python-dotenv. В .env положите строки DISCORD_TOKEN=... и DISCORD_GUILD_ID=.... Сам файл назовите bot.py, а не discord.py, иначе он перекроет импорт установленной библиотеки.

import os

import discord
from discord import app_commands
from dotenv import load_dotenv

load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")
GUILD_ID = os.getenv("DISCORD_GUILD_ID")

if not TOKEN or not GUILD_ID:
    raise RuntimeError("Заполните DISCORD_TOKEN и DISCORD_GUILD_ID в .env")

TEST_GUILD = discord.Object(id=int(GUILD_ID))


class CodikClient(discord.Client):
    async def setup_hook(self) -> None:
        commands = await tree.sync(guild=TEST_GUILD)
        print(f"Синхронизировано команд: {len(commands)}")


intents = discord.Intents.default()
client = CodikClient(intents=intents)
tree = app_commands.CommandTree(client)


@tree.command(
    name="hello",
    description="Поздороваться с ботом",
    guild=TEST_GUILD,
)
async def hello(interaction: discord.Interaction) -> None:
    await interaction.response.send_message(
        f"Привет, {interaction.user.display_name}! Бот работает."
    )


@client.event
async def on_ready() -> None:
    print(f"Вошли как {client.user}")


client.run(TOKEN)
Что делает каждая часть
  • load_dotenv() читает локальный файл, после чего os.getenv() получает два значения без встраивания секрета в код.
  • setup_hook() синхронизирует дерево команд с тестовым сервером до обычной работы клиента.
  • Декоратор @tree.command связывает имя hello с асинхронной функцией ответа.
  • interaction.response.send_message() отвечает именно на вызов команды, а не читает все сообщения канала.

Поток slash-команды hello от пользователя через Discord к Python боту
Пользователь вызывает команду, Discord передаёт interaction, а обработчик отправляет один ответ.

Как добавить приложение на тестовый сервер

В разделе Installation или OAuth2 URL Generator выберите установку на сервер и scope bot. Scope applications.commands включается вместе с bot scope, но интерфейс портала может показывать его отдельно. Для нашего ответа достаточно разрешения отправлять сообщения. Не выдавайте Administrator ради удобства: минимальные права проще объяснить и безопаснее отлаживать.

НастройкаДля /helloПочему
Guild installДаДобавляет приложение на тестовый сервер
bot scopeДаДобавляет bot user
applications.commandsНужен командамДелает slash-команды доступными в клиенте
Send MessagesДаПозволяет ответить в канале
AdministratorНетНе нужен для одного ответа
Message Content IntentНетSlash-команда приходит как interaction
Slash-команда удобнее префиксной для первого бота. Префиксная команда вроде !hello должна читать содержимое сообщений и требует соответствующего intent. Нативная /hello появляется в интерфейсе и передаётся приложению как interaction.

Практика: запускаем и проверяем первый ответ

Запускайте бота из активированного виртуального окружения. Пока процесс работает, соединение с Discord остаётся открытым. Сначала дождитесь двух сообщений в терминале: количество синхронизированных команд и имя вошедшего пользователя. Затем откройте канал тестового сервера и начните вводить /hello. Guild-команда обычно удобна тем, что изменения предназначены именно для быстрой проверки.

Проверка от терминала до Discord
  1. Создайте .venv, активируйте его и установите две зависимости через python -m pip.
  2. Создайте .env с реальным токеном и guild id, а в .gitignore добавьте строки .env и .venv/.
  3. Добавьте приложение на собственный тестовый сервер с минимальным разрешением отправки сообщений.
  4. Запустите python bot.py и дождитесь строк о синхронизации и входе.
  5. Введите /hello в канале, выберите команду из подсказки и отправьте её.
  6. Убедитесь, что ответ содержит ваше отображаемое имя и что в терминале нет traceback.
  7. Остановите процесс сочетанием Ctrl+C и проверьте: офлайн-бот больше не отвечает. Это ожидаемо.
Ожидаемый результат
  • В списке участников bot user отображается онлайн, пока bot.py запущен.
  • Команда /hello видна в подсказках тестового сервера.
  • После отправки появляется ответ с вашим именем и фразой «Бот работает».
  • В коде и истории Git нет реального токена.

Матрица диагностики Discord бота по запуску синхронизации установке и правам
Симптом определяет слой проверки: Python, регистрация команды, установка или права канала.

Почему бот офлайн или команда не появляется

Разделите проблему на три уровня. Если программа не стартует, читайте traceback Python. Если клиент вошёл, но команда отсутствует, проверяйте guild id, установку и синхронизацию. Если команда видна, но ответ завершается ошибкой, смотрите функцию обработчика и права в конкретном канале. Такой порядок быстрее, чем многократный сброс токена без причины.

Файл назван discord.py

Python импортирует ваш файл вместо библиотеки. Переименуйте его и удалите созданный кэш модуля.

В файле окружения остались кавычки или пробелы

Проверьте точные имена переменных и отсутствие лишних символов. Не печатайте токен для диагностики.

Указан ID другого сервера

Команда синхронизируется не туда, где вы её ищете. Скопируйте ID при включённом Developer Mode.

Приложение не установлено на сервер

Синхронизация сама по себе не добавляет интеграцию. Пройдите установочную ссылку под владельцем тестового сервера.

Выдан Administrator

Это может скрыть неправильно выбранные разрешения. Верните минимальный набор и проверьте доступ канала отдельно.

Не публикуйте секрет даже на секунду. Автоматические сканеры могут успеть подобрать токен из открытого репозитория. При утечке сразу используйте Reset Token и обновите локальный .env. Технические детали сверены с официальной документацией Discord по application commands.
Короткие ответы
Чем application отличается от bot user?

Application описывает интеграцию и команды, bot user представляет её среди участников сервера.

Можно ли хранить токен в bot.py?

Не стоит. Храните его в локальном .env, исключённом из Git.

Зачем нужен guild id?

В примере команда регистрируется только на тестовом сервере, что удобно для быстрой разработки.

Нужен ли Message Content Intent?

Нет, потому что /hello является application command и приходит как interaction.

Почему бот офлайн после закрытия терминала?

Локальный Python-процесс поддерживает соединение. После его остановки выполнять код некому.

Добавьте команде один полезный аргумент

Асинхронные функции, строки и условия удобно закрепить в курсе Python. Если установка библиотек ещё путается, начните с виртуального окружения и диагностики команды pip.

Затем добавьте к /hello строковый параметр или случайный ответ и сравните архитектуру с Telegram-ботом на Python. Идеи для следующих небольших инструментов собраны в статье об автоматизации на Python.