media
Макрос !{media} прикрепляет медиа-ресурсы (фото, видео, аудио, документы и т.д.) к реакциям SendMessage и ShowMenu.
Что умеет макрос:
| Возможность | Описание |
|---|---|
| Одиночный файл | Отправить одно фото, видео, документ |
| Альбом | Отправить до 10 файлов одним сообщением |
| Автоопределение типа | Угадать тип медиа по значению параметра |
| Спойлер | Отправить фото/видео под спойлером |
Где используется:
| Реакция | Назначение |
|---|---|
| SendMessage | Отправить сообщение с медиа (файл прикрепляется к сообщению) |
| ShowMenu | Отправить меню с медиа (файл отображается над кнопками) |
💡 Самый частый сценарий: отправить фото, которое только что прислал пользователь:
!{media|path:${update.message.photo.0}}
Синтаксис
!{media|
параметр1: значение1;
параметр2: значение2;
}
Правила:
- Макрос начинается с
!{media|и заканчивается} - Параметры разделяются символом
;(точка с запятой) - Рекомендуется каждый параметр писать с новой строки
Режимы работы
Макрос работает в трёх режимах. Режим определяется автоматически по наличию параметров.
| Режим | Признак | Что делает |
|---|---|---|
| Path | Есть параметр path | Берёт данные из контекста |
| Альбом | Есть параметры с номерами (id1, url1, ...) | Отправляет несколько файлов |
| Одиночный файл | Ни то, ни другое | Отправляет один файл по ID или URL |
⚠️ Нельзя смешивать режимы в одном вызове.
Общие параметры
| Параметр | Тип | Описание |
|---|---|---|
| type | Строка | Тип медиа (photo, video, audio, document, voice, animation, video_note, sticker) |
| spoiler | Boolean | Закрыть медиа спойлером (только для photo, video, animation) |
⚠️ В режиме Path параметр
typeне действует — тип берётся из самого объекта или угадывается по значениюpath. Параметрspoilerв режиме Path действует только когда по пути лежит один объект, а не список.
Режим 1: Path (через путь в контексте)
Самый удобный режим. Вы просто указываете путь к данным, которые уже есть в контексте.
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| path | Строка | ✅ Да | Путь к данным в контексте либо сами данные |
| spoiler | Boolean | ❌ Нет | Закрыть спойлером (только для одного объекта) |
⚠️ Параметр
typeв этом режиме не действует. Тип берётся из самого объекта, а если его там нет — угадывается по значениюpath(см. «Автоопределение типа»).
Что можно передать в path
| Что | Пример | Как работает |
|---|---|---|
| Путь текстом | path:update.message.photo.0 | Данные ищутся по этому пути в контексте |
| Переменная | path:${update.message.photo.0} | Переменная раскрывается в объект файла |
| Готовые данные | path:${var.cloud.saved_file} | Объект или список объектов используется напрямую |
Все три варианта равнозначны — макрос сам определяет, что ему передали.
Формат данных
Один объект
{
"file_id": "AgACAgIAAxk...",
"file_type": "photo",
"spoiler": true
}
Список объектов (альбом)
[
{"file_id": "AgACAgIAAxk1...", "type": "photo", "spoiler": true},
{"file_id": "AgACAgIAAxk2...", "type": "video"},
{"url": "https://example.com/file.jpg", "type": "photo"}
]
Правила
| Правило | Описание |
|---|---|
| Идентификатор | Объект должен содержать file_id или url |
| Приоритет | Сначала ищется file_id, затем url |
| Имена полей | Регистр, _, - и пробелы не важны: file_id, fileId, id — одно и то же |
| Тип | Берётся из поля type или file_type. Если их нет — включается автоопределение по пути |
| Спойлер | Берётся из поля spoiler, has_spoiler или has_media_spoiler |
| Пропуск | Элементы без валидных данных пропускаются |
💡 Файлы, которые пользователь прислал в форму, приходят с полем
file_type— тип для них определяется сам, указывать ничего не нужно.
Примеры
Одно фото из сообщения пользователя
!{media|path:${update.message.photo.0}}
То же самое, путём без скобок
!{media|path:update.message.photo.0}
Альбом из нескольких фото (если в photo массив)
!{media|path:${update.message.photo}}
Файл, который пользователь загрузил в форму
!{media|path:${form.fields.screenshot.0}}
Список файлов из локальной переменной
!{media|path:${var.local.files}}
Фото со спойлером
!{media|path:${update.message.photo.0}; spoiler:true}
⚠️ Спойлер параметром можно поставить только когда по пути лежит один объект. Если там список, спойлер берётся из самих объектов, а параметр
spoilerигнорируется.
Режим 2: Одиночный файл (прямое указание)
Используйте этот режим, когда нужно отправить конкретный файл по его file_id или URL.
Через ID файла
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
id |
Строка | ✅ Да | file_id файла (длинная строка от Telegram) |
type |
Строка | ❌ Нет | Тип медиа (угадывается, если не указан) |
spoiler |
Boolean | ❌ Нет | Закрыть спойлером |
Через URL
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
url |
Строка | ✅ Да | HTTP-ссылка на файл |
type |
Строка | ❌ Нет | Тип медиа (угадывается, если не указан) |
spoiler |
Boolean | ❌ Нет | Закрыть спойлером |
Примеры
По file_id
!{media|id:AgACAgIAAxkBAAI...; type:photo}
По URL
!{media|url:https://example.com/photo.jpg; type:photo}
Со спойлером
!{media|id:AgACAgIAAxkBAAI...; type:photo; spoiler:true}
Без указания типа (включится автоопределение)
!{media|id:AgACAgIAAxkBAAI...}
Режим 3: Альбом (несколько файлов)
Для отправки альбома используйте параметры с номерами от 1 до 10.
Параметры
| Параметр | Описание |
|---|---|
| id1 ... id10 | Идентификаторы файлов |
| url1 ... url10 | URL файлов |
| type1 ... type10 | Типы файлов (угадываются, если не указаны) |
| spoiler1 ... spoiler10 | Закрыть соответствующий файл спойлером |
Правила
| Правило | Описание |
|---|---|
| Идентификатор | Каждый файл должен иметь idN или urlN |
| Тип | Если typeN не указан — включается автоопределение |
| Пропуск | Файлы с невалидным типом пропускаются |
| Лимит | Максимум 10 файлов в одном альбоме |
Примеры
Два фото по ID
!{media|id1:AgACAgIAAxkBAAI...; type1:photo; id2:AgACAgIAAxkBAAJ...; type2:photo}
Два фото по URL
!{media|url1:https://example.com/1.jpg; type1:photo; url2:https://example.com/2.jpg; type2:photo}
Первое фото со спойлером, второе без
!{media|id1:${form.photo_id}; type1:photo; spoiler1:true; id2:${form.video_id}; type2:video}
Без указания типов (включится автоопределение)
!{media|id1:${form.photo_id}; id2:${form.video_id}}
Автоопределение типа
Если тип не указан, макрос пытается угадать его по значению параметра — path, id, url (и idN, urlN в альбоме). Смотрится текст как он написан в настройке, до подстановки переменных, поэтому имя типа достаточно упомянуть в пути.
Примеры
| Запись | Определённый тип |
|---|---|
| !{media|path:${update.message.photo.0}} | photo |
| !{media|path:${update.message.video_note}} | video_note |
| !{media|id:${update.message.audio.file_id}} | audio |
| !{media|id1:${form.voice_id}; id2:${form.doc_file}} | voice, document |
Правила
| Правило | Описание |
|---|---|
| Приоритет | Явно указанный тип всегда важнее угаданного |
| Регистр | Не имеет значения |
| Похожие типы | video_note проверяется раньше video, чтобы не сработало короткое совпадение |
| Не нашли тип | Файл пропускается (режимы Path и Альбом) или макрос возвращает ошибку (Одиночный файл) |
⚠️ Обратная сторона: имя типа ищется в любом месте строки. Путь
var.local.myphotosдаст тип photo, даже если по нему лежит документ. В таких случаях указывайте тип явно или храните его в самом объекте.
Когда угадывание не сработает: если в записи нет имени типа — например ${var.local.file} или ${form.result.0}.
Спойлер
Медиа можно отправить закрытым спойлером — размытием, которое раскрывается по тапу пользователя.
Поддержка по типам
| Тип | Спойлер |
|---|---|
| photo | ✅ Да |
| video | ✅ Да |
| animation | ✅ Да |
| audio | ❌ Нет |
| document | ❌ Нет |
| voice | ❌ Нет |
| sticker | ❌ Нет |
| video_note | ❌ Нет |
Для типов без поддержки параметр просто игнорируется.
Как указать спойлер
| Режим | Параметр |
|---|---|
| Path | spoiler:true (только один объект) |
| Одиночный файл | spoiler:true |
| Альбом | spoiler1:true, spoiler2:true, ... |
Допустимые значения
| Значение | Результат |
|---|---|
| true, 1, yes, on | Спойлер включён |
| Любое другое или не задан | Спойлер выключен |
Регистр не имеет значения.
Особенность режима Path
Если в объекте уже есть поле spoiler, has_spoiler или has_media_spoiler, спойлер будет унаследован — медиа, изначально присланное под спойлером, останется под спойлером.
Параметр spoiler у макроса перекрывает значение из объекта, только когда по пути лежит один объект. Для списка объектов параметр игнорируется, и спойлер каждого файла берётся из его собственных полей.
Доступные типы медиа (справочно)
| Тип | Описание | Спойлер |
|---|---|---|
| photo | Фотография | ✅ |
| video | Видео | ✅ |
| animation | GIF-анимация | ✅ |
| video_note / videonote | Видео-заметка («кружок») | ❌ |
| audio | Аудиофайл (музыка, подкаст) | ❌ |
| voice | Голосовое сообщение | ❌ |
| document | Документ (PDF, ZIP, XLS и др.) | ❌ |
| sticker | Стикер | ❌ |
Частые ошибки и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| Медиа не отправляется | Не указан тип, и автоопределение не сработало | Укажите type явно или добавьте тип в сам объект |
| В режиме Path не помогает type | В этом режиме параметр type не действует | Добавьте поле type в объект либо назовите путь так, чтобы тип угадался |
| Отправляется часть файлов | Элементы без идентификатора или с неопределённым типом пропускаются | Проверьте структуру данных по пути |
| Альбом не формируется | В path передан одиночный объект, а не список | Убедитесь, что по пути лежит список объектов |
| Спойлер не работает | Тип медиа не поддерживает спойлер | Спойлер работает только для photo, video, animation |
| Спойлер не работает в режиме Path | По пути лежит список — параметр spoiler для списка игнорируется | Задайте спойлер в самих объектах или отправляйте файлы по одному |
| Макрос возвращает ошибку | В режиме одиночного файла не удалось определить тип | Укажите type явно |
Быстрые ответы (шпаргалка)
Отправить фото из сообщения пользователя
!{media|path:${update.message.photo.0}}
Отправить альбом из нескольких фото
!{media|path:${update.message.photo}}
Отправить документ по URL
!{media|url:https://example.com/file.pdf; type:document}
Отправить видео со спойлером
!{media|id:${video_id}; type:video; spoiler:true}
Отправить два файла по ID
!{media|id1:${id1}; type1:photo; id2:${id2}; type2:video}