Skip to main content

Эмбеды

Возможно, вы видели некоторые специальные сообщения в Discord (часто отправляемые ботами/вебхуками), которые имеют цветную рамку, встроенные изображения, текстовые поля и другие свойства. Эти элементы называются Эмбедами, и в этом разделе будет рассказано, как вы можете создать и отправить их с помощью своего бота. Это делается с помощью объекта Embed.

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

Предпросмотр эмбеда

Вот пример того, как может выглядеть эмбед. Мы рассмотрим конструкцию эмбеда в следующей части этой статьи.


Disnake BotBot05/16/2023
Описание эмбеда
Обычный заголовок
Обычное значение
Встроенный заголовок
Встроенное значение
Встроенный заголовок
Встроенное значение
Встроенный заголовок
Встроенное значение

Код для этого эмбеда приведен ниже.

embed.py
import disnake
from disnake.ext import commands

# Внутри команды, прослушивателя событий и т.д.
embed = disnake.Embed(
title="Заголовок эмбеда",
description="Описание эмбеда",
color=disnake.Colour.yellow(),
timestamp=datetime.datetime.now(),
)

embed.set_author(
name="Автор эмбеда",
url="https://disnake.dev/",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)
embed.set_footer(
text="Футер эмбеда",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)

embed.set_thumbnail(url="https://disnake.dev/assets/disnake-logo.png")
embed.set_image(url="https://disnake.dev/assets/disnake-thin-banner.png")

embed.add_field(name="Обычный заголовок", value="Обычное значение", inline=False)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)

await ctx.send(embed=embed)
Примечание

Нет строгой необходимости использовать все элементы, представленные выше. Вы можете оставить некоторые из них в соответствии с вашими потребностями.

Цвет вставки (с помощью параметра color) принимает экземпляр Colour, шестнадцатеричная строка или целое число.

Чтобы добавить пустое поле для эмбеда, вы можете использовать embed.add_field(name='\u200b', value='\u200b').

Создание эмбеда

Вы можете использовать Embed для создания эмбедов и манипулирования ими.

embed.py
embed = disnake.Embed(
title="Заголовок эмбеда",
description="Описание эмбеда",
colour=0xF0C43F,
)

Disnake BotBot05/16/2023
Заголовок эмбеда
Описание эмбеда

Установка автора

Вы можете указать автора эмбеда с помощью метода set_author. Обратите внимание, что этот код запускается после того, как вы определили embed через embed = disnake.Embed(...).

embed.py
embed.set_author(
name="Автор эмбеда",
url="https://disnake.dev/",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)

Disnake BotBot05/16/2023
Заголовок эмбеда
Описание эмбеда

Поскольку в этом случае мы установили URL-адрес, нажатие на "Автор эмбеда" перенаправит пользователя на сайт disnake.dev.

Установка футера

Вы можете указать футер эмбеда с помощью метода set_footer. Обратите внимание, что этот код запускается после того, как вы определили embed через embed = disnake.Embed(...).

embed.py
embed.set_footer(
text="Футер эмбеда",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)

Disnake BotBot05/16/2023
Заголовок эмбеда
Описание эмбеда

Установка миниатюры

Вы можете указать миниатюру с помощью метода set_thumbnail. Обратите внимание, что этот код запускается после того, как вы определили embed через embed = disnake.Embed(...).

embed.py
embed.set_thumbnail(url="https://disnake.dev/assets/disnake-thin-banner.png")

Disnake BotBot05/16/2023
Embed Thumbnail
It is shown in the top-right corner of the embed. You can set this as a URL, but disnake also allows you to use a locally stored file instead, using the file parameter.

embed.set_thumbnail(file=disnake.File("asset/path.png"))

Использование временных отметок

Временные отметки отображаются возле футера эмбеда, указывая время, в которое было отправлен/инициирован эмбед. Это можно сделать с помощью параметра timestamp disnake.Embed(). Обратите внимание, что вам нужно будет импортировать пакет datetime в ваш код.

embed.py
import datetime

# Внутри команды, прослушивателя событий и т.д.
embed = disnake.Embed(
title="Эмбед!",
description="Описание",
colour=0xF0C43F,
timestamp=datetime.datetime.now(),
)

Disnake BotBot05/16/2023
Временные отметки

Добавление полей

Поля эмбеда имеют два параметра - название (или заголовок) и значение внутри с помощью метода add_field. Также можно использовать markdown в обоих параметрах.

embed.py
# Обычные поля
embed.add_field(name="Обычный заголовок", value="Обычное значение", inline=False)

# Встроенные поля
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)

Disnake BotBot05/16/2023
Заголовок эмбеда
Описание эмбеда
Обычный заголовок
Обычное значение
Встроенный заголовок
Встроенное значение
Встроенный заголовок
Встроенное значение
Встроенный заголовок
Встроенное значение

Эти атрибуты также полностью поддерживают использование markdown, а также выделение ссылок. Вы также можете вставлять поля в определенную позицию с указанным индексом, используя embed.insert_field_at(index, ...).

Добавление изображений

Это можно сделать с помощью методв set_image, который принимает либо ссылку, либо объект File.

embed.py
# Используя ссылку
embed.set_image(url="https://disnake.dev/assets/disnake-thin-banner.png")

# Используя локальный файл
embed.set_image(file=disnake.File("path/to/file.png"))

Disnake BotBot05/16/2023
Изображения

Отправка эмбеда

Как только эмбед будет создан, вам также нужно отправить его в канал. Это означает, что вам нужно вызвать метод send(embed=embed) для объекта, например объекта TextChannel (т.е. message.channel.send) или объекта Context (ctx.send). В противном случае эмбед не будет отправлен.

Словарь в эмбед

Тип данных dict (и, по сути, файл json) может быть преобразован в вложение, используя метод Embed.from_dict(). Мы можем воссоздать вставку, сделанную в начале этой страницы, используя то же самое.

embed.py
embed_dict = {
"title": "Заголовок эмбеда",
"description": "Описание эмбеда",
"color": 0xFEE75C,
"timestamp": datetime.datetime.now().isoformat(),
"author": {
"name": "Автор эмбеда",
"url": "https://disnake.dev/",
"icon_url": "https://disnake.dev/assets/disnake-logo.png",
},
"thumbnail": {"url": "https://disnake.dev/assets/disnake-logo.png"},
"fields": [
{"name": "Обычный заголовок", "value": "Обычное значение", "inline": "false"},
{"name": "Встроенный заголовок", "value": "Встроенное значение", "inline": "true"},
{"name": "Встроенный заголовок", "value": "Встроенное значение", "inline": "true"},
{"name": "Встроенный заголовок", "value": "Встроенное значение", "inline": "true"},
],
"image": {"url": "https://disnake.dev/assets/disnake-thin-banner.png"},
"footer": {"text": "Футер эмбеда", "icon_url": "https://disnake.dev/assets/disnake-logo.png"},
}

await channel.send(embed=disnake.Embed.from_dict(embed_dict))

Это даст точно такой же результат, как и встраивание, показанное здесь. Обратите внимание, что временная отметка, передаваемая через словарь, должна быть в формате ISO8601 (что было достигнуто здесь с помощью datetime.datetime.now().isoformat()). Вы можете узнать больше о формате вложений dict в официальной документации Discord.

Примечания

  • Для отображения полей рядом друг с другом необходимо, чтобы по крайней мере для двух последовательных полей было установлено значение inline=True.
  • Временная отметка автоматически настраивает часовой пояс в зависимости от устройства пользователя.
  • Упоминания любого рода в эмбедах будут корректно отображаться только в пределах описания и значений полей эмбеда.
  • Упоминания во вложениях не будут вызывать уведомление.
  • Эмбеды позволяют маскировать ссылки (например, [Guide](https://guide.disnake.dev/ 'optional hovertext')), но только в описании и значениях полей.
Источник: Руководство по Discord.js

Ограничения

Есть несколько ограничений, о которых следует помнить при планировании ваших эмбедов из-за ограничений API. Вот краткий список ограничений:

  • Заголовок эмбеда ограничен 256 символами.
  • Описание эмбеда ограничен 4096 символами.
  • Максимум 25 полей.
  • Название поля ограничено 256 символами и их значение 1024 символами.
  • Текст футера ограничен 2048 символами.
  • Имя автора ограничено 256 символами.
  • Сумма всех символов из всех структур эмбеда в сообщении не должна превышать 6000 символов.
  • Одно сообщение может содержать до 10 эмбедов.
Источник: документация Discord API

Получившийся код

Код, представленный на этой странице, можно найти в нашем репозитории GitHub здесь.