Создание дискорд бота на языке Python
Основы создания бота для Discord на Python
Для разработки ботов на платформе Discord используется библиотека discord.py. Она предоставляет удобный интерфейс для взаимодействия с API Discord, обработки сообщений, команд и событий.
Наиболее эффективное решение для начала - написать простого бота, который отвечает на команду !hello. Для этого потребуется:
- Зарегистрировать приложение на Discord Developer Portal и получить токен бота.
- Установить библиотеку:
pip install discord.pyбот дискорда python (бот для discord на python)
- Создать файл 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 минут в указанный канал отправляется напоминание.