Создание дискорд бота на языке Python

Раздел: Боты -> Discord боты

Основы создания бота для Discord на Python

Для разработки ботов на платформе Discord используется библиотека discord.py. Она предоставляет удобный интерфейс для взаимодействия с API Discord, обработки сообщений, команд и событий.

Наиболее эффективное решение для начала - написать простого бота, который отвечает на команду !hello. Для этого потребуется:

  1. Зарегистрировать приложение на Discord Developer Portal и получить токен бота.
  2. Установить библиотеку:
    pip install discord.py

    бот дискорда python (бот для discord на python)

  3. Создать файл bot.py со следующим кодом:
import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.event
async def on_ready():
    print(f'Бот {bot.user} готов к работе!')

@bot.command()
async def hello(ctx):
    await ctx.send('Привет, мир!')

bot.run('ВАШ_ТОКЕН')

После запуска бот будет ожидать команды с префиксом !. Проверка: отправьте в любой канал, куда приглашён бот, сообщение !hello - бот ответит Привет, мир!.

Возможные проблемы:

  • Токен неверен - убедитесь, что токен скопирован точно, без лишних пробелов. Храните токен в переменной окружения (например, через os.getenv).
  • Intents (намерения) - для некоторых событий (например, чтение содержимого сообщений) необходимо включить соответствующие намерения в коде и на портале разработчика. Если бот не видит сообщения, добавьте intents=discord.Intents.default() или intents.message_content=True.
  • Отсутствие прав - бот должен быть приглашён с необходимыми разрешениями (например, Send Messages, Read Message History).

Как добавить команду с аргументами?

Чтобы бот принимал аргументы, используется синтаксис функций с параметрами:

@bot.command()
async def greet(ctx, name: str):
    await ctx.send(f'Привет, {name}!')

Теперь команда !greet Михаил отправит Привет, Михаил!.

Как использовать слэш-команды (slash commands)?

Начиная с версии discord.py 2.0 поддерживаются слэш-команды. Для их использования требуется библиотека py-cord или обновлённая версия discord.py с поддержкой app_commands. Пример с использованием discord.py:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!', intents=discord.Intents.default())

@bot.tree.command(name='hello', description='Приветствие')
async def hello(interaction: discord.Interaction):
    await interaction.response.send_message('Привет из слэш-команды!')

@bot.event
async def on_ready():
    await bot.tree.sync()
    print(f'Бот {bot.user} синхронизировал слэш-команды.')

bot.run('ТОКЕН')

Обратите внимание на вызов bot.tree.sync() - он регистрирует команды на сервере. Без этого команды не появятся.

Как организовать код с помощью Cog?

Cog позволяют группировать команды и события в отдельные классы для удобства поддержки. Пример:

import discord
from discord.ext import commands

class MyCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def ping(self, ctx):
        await ctx.send('Pong!')

bot = commands.Bot(command_prefix='!')
bot.add_cog(MyCog(bot))
bot.run('ТОКЕН')

Такой подход упрощает разработку крупных проектов и тестирование.

Как обрабатывать события (например, приход нового участника)?

События регистрируются через декоратор @bot.event. Пример приветствия нового пользователя:

@bot.event
async def on_member_join(member):
    channel = member.guild.system_channel
    if channel:
        await channel.send(f'Добро пожаловать, {member.mention}!')

Не забудьте включить намерение members (в коде и на портале).

Расширенные примеры использования бота Discord на Python

Пример 1: Бот с командами для модерации

Создадим бота, который может очищать сообщения (команда !clear) и выдавать предупреждения.

Пример
import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.command()
@commands.has_permissions(manage_messages=True)
async def clear(ctx, amount: int):
    await ctx.channel.purge(limit=amount + 1)
    await ctx.send(f'Удалено {amount} сообщений.', delete_after=5)

@bot.command()
@commands.has_permissions(kick_members=True)
async def warn(ctx, member: discord.Member, *, reason='Причина не указана'):
    await ctx.send(f'{member.mention} получил предупреждение: {reason}')

bot.run('ТОКЕН')

Результат: команда !clear 10 удалит 10 последних сообщений (плюс саму команду), команда !warn @Пользователь выведет предупреждение в чат.

Пример 2: Встраиваемые сообщения (Embed)

Использование Embed для красивого вывода информации:

Пример
@bot.command()
async def info(ctx):
    embed = discord.Embed(
        title='Информация о пользователе',
        description='Ваш профиль на сервере',
        color=discord.Color.blue()
    )
    embed.add_field(name='Имя', value=ctx.author.name, inline=False)
    embed.add_field(name='ID', value=ctx.author.id, inline=False)
    embed.set_thumbnail(url=ctx.author.avatar.url)
    await ctx.send(embed=embed)

Результат: бот отправляет red-сообщение с полями и аватаркой пользователя.

Пример 3: Работа с базой данных SQLite

Сохраним количество сообщений пользователя:

Пример
import sqlite3

conn = sqlite3.connect('stats.db')
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS messages (user_id INTEGER, count INTEGER)')
conn.commit()

@bot.event
async def on_message(message):
    if message.author.bot:
        return
    c.execute('INSERT OR IGNORE INTO messages (user_id, count) VALUES (?, 0)', (message.author.id,))
    c.execute('UPDATE messages SET count = count + 1 WHERE user_id = ?', (message.author.id,))
    conn.commit()
    await bot.process_commands(message)

@bot.command()
async def stats(ctx):
    c.execute('SELECT count FROM messages WHERE user_id = ?', (ctx.author.id,))
    result = c.fetchone()
    count = result[0] if result else 0
    await ctx.send(f'Вы отправили {count} сообщений на этом сервере.')

Результат: бот отслеживает количество сообщений и отвечает на команду !stats.

Пример 4: Асинхронные задачи (фоновые процессы)

Использование tasks.loop для периодического выполнения действий:

Пример
from discord.ext import tasks

@tasks.loop(minutes=5)
async def remind():
    channel = bot.get_channel(123456789)  # ID канала
    if channel:
        await channel.send('Не забудьте сделать паузу!')

@bot.event
async def on_ready():
    remind.start()
    print('Фоновая задача запущена.')

Результат: каждые 5 минут в указанный канал отправляется напоминание.

бот для discord на python - comments

En
бот дискорда python (python)