События и сообщения
discord.py — библиотека для ботов Discord: модерация, музыка, игры и викторины на серверах. Как и aiogram, она асинхронная.
В курсе вы соберёте бота для мини-викторины: команды, красивые карточки-эмбеды, кнопки и подсчёт очков.
Подготовка бота
- Откройте Discord Developer Portal, нажмите New Application, придумайте имя.
- Во вкладке Bot нажмите Reset Token и скопируйте токен — это пароль бота, никому его не показывайте. Там же включите Message Content Intent.
- Во вкладке OAuth2 → URL Generator отметьте
botи права (Send Messages, Read Message History), откройте ссылку и добавьте бота на свой сервер.
Минимальный бот
import os
import discord
intents = discord.Intents.default()
intents.message_content = True # разрешение читать текст сообщений
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"Бот {client.user} запущен")
@client.event
async def on_message(message):
if message.author.bot: # не отвечаем ботам и себе
return
if message.content == "!ping":
await message.channel.send("Pong!")
client.run(os.getenv("DISCORD_TOKEN"))
- Intents — какие события бот хочет получать. Текст сообщений — «привилегированное» намерение: его включают и в коде, и в Developer Portal;
@client.eventподписывает функцию на событие по её имени:on_ready,on_message,on_member_join,on_reaction_add…;client.run(token)подключается к Discord и работает, пока программу не остановят.
Сообщение
message.content— текст;message.author— автор:display_name(имя на сервере),id(постоянный номер),bot(бот ли это);message.channel.send(текст)— ответ в тот же канал,message.reply(текст)— ответ с цитатой,message.author.send(текст)— в личку;- все эти методы — корутины, их вызывают через
await.
on_message получает все сообщения, включая сообщения самого бота. Поэтому первая строка почти всегда — проверка message.author.bot: иначе два бота могут отвечать друг другу бесконечно.
Как проверяются задачи
В задачах логика бота вынесена в функцию handle(message), которую вызывает on_message. Проверка подаёт ей готовые сообщения без Discord и печатает ответы бота. Чтобы запустить бота по-настоящему, задайте переменную окружения DISCORD_TOKEN и нажмите «Запустить у себя».
Итог
discord.Client(intents=…),message_content = True;@client.event+on_ready,on_message;message.content,message.author.id / display_name / bot;await message.channel.send(...); ботам не отвечаем.