Приём и пересылка медиа
Действие позволяет принимать файлы от подписчиков и пересылать их другим подписчикам — например, владельцу бота или менеджеру.
Конструктор не сохраняет полученные файлы. Если нужно их хранить — используйте действие вместе с Яндекс Диском или Google Диском.
Настройка
- Добавьте действие «Приём и пересылка медиа».
- Выберите тип файлов, которые нужно принимать.
- Укажите, куда переслать.
Куда переслать
- Адресатам — как раньше:
ClientID,MessengerиBotIDодного или нескольких получателей; - Сотруднику — привязанным сотрудникам аккаунта. Отметка «Отправить всем» отправляет файл всем активным, без неё выберите нужных из списка.
Выбирайте «Сотруднику» с отметкой «Отправить всем». Получателей бот находит в момент пересылки, поэтому настройка работает и на новом месте. Конкретный сотрудник и адресат по ClientID привязаны к текущему аккаунту.
Если подписчик отправляет файл, который уже лежит в переписке, Telegram
не загружает его заново, а ссылается на прежний. Такой файл мессенджер
отдаёт боту не всегда с первого раза — конструктор ждёт и повторяет запрос.
Если файл так и не пришёл, в #{media_error} будет «мессенджер не отдал
файл: попросите отправить его заново».
Если соединение с мессенджером оборвалось на полуслове (в журнале это видно
как ECONNRESET или «socket hang up»), конструктор повторяет отправку
до пяти раз — через секунду, три, восемь и пятнадцать, но не дольше двух
минут на файл. Отказ по существу — бот заблокирован, файл больше 20 МБ —
не повторяется: ответ будет тот же.
Между файлами набора конструктор делает передышку в секунду, а связь на каждый файл открывает заново.
Если подписчик и получатель — в одном и том же боте, файл не скачивается и не загружается заново: конструктор пересылает его тем же вложением, которое уже лежит у мессенджера. Так быстрее, и ограничение в 20 МБ здесь не мешает. Работает в Telegram и MAX.
Ограничение самого мессенджера: ботам он выдаёт файлы до 20 МБ. Это важно, когда файл пересылается в другой бот или в другой мессенджер — там его приходится скачивать. Файл больше бот скачать не сможет, пересылки не будет, и сценарий просто пойдёт дальше. Если ждёте от подписчиков большие видео, попросите присылать их ссылкой — либо пересылайте внутри того же бота.
Если файл нужно только сохранить на Яндекс / Google Диск без пересылки другим подписчикам — адресата можно не указывать. В следующем действии используйте ссылку на файл из переменной #{media_url}.
Переменные действия
После приёма медиа конструктор автоматически заполняет несколько переменных — используйте их в последующих действиях.
| Переменная | Что в неё попадает |
|---|---|
media_type | Тип медиафайла (см. таблицу ниже). |
media_ext | Расширение файла. |
media_url | Ссылка на файл — время жизни 1 минута. |
media_urls | Ссылки на все пересланные файлы, по одной в строке. |
media_count | Сколько файлов переслали. Один файл — 1. |
media_duration | Длительность аудио в секундах. |
ismedia | Становится 1 при пересылке медиа. |
media_sent | 1 — файл получили все адресаты, 0 — кому-то не досталось, пусто — адресатов не было. |
media_notsent | Сколько отправок не удалось за это сообщение. |
media_error | Короткая причина последней неудачи. |
media_url действует всего 1 минуту. Если файл нужно использовать дольше — сразу же сохраняйте его на Яндекс Диск или Google Диск и работайте с постоянной ссылкой.
Если файлов сразу несколько
Подписчик может отправить не один файл, а альбом: пять фотографий, пачку документов, фото вперемешку с видео. Действие пересылает все такие файлы, каждый отдельным сообщением.
Пересылаются только файлы того типа, который выбран в настройке действия. Остальное действие пропускает:
- принимаем изображения — из альбома «три фото и договор» уйдут три фото;
- принимаем файлы — из того же альбома уйдёт только договор.
Нужны оба типа — поставьте два действия подряд, одно за другим: первое с приёмом изображений, второе с приёмом файлов. Каждое разбирает весь присланный набор заново и берёт из него своё, так что из альбома «два фото и два договора» адресат получит все четыре файла.
#{media_url}, #{media_ext}, #{media_type}, #{media_count}
и #{media_urls} описывают файлы того действия, которое только что
отработало. После пары в них лежат данные второго — так и задумано:
следом за действием обычно идёт сохранение на диск, и ссылка нужна свежая.
А вот признак доставки считается по всему сообщению целиком:
#{media_sent}, #{media_notsent} и #{media_error} учитывают оба
действия. Если первое не дошло до адресата, а второе дошло, #{media_sent}
останется 0 — проверку достаточно поставить один раз, после обоих
действий.
Подпись к альбому (текст, который подписчик написал вместе с файлами) не дублируется: адресат получает её один раз, с первым же действием.
Сколько файлов ушло, лежит в #{media_count}, а ссылки на них — в
#{media_urls}, по одной в строке. В #{media_url} остаётся ссылка
на первый файл, как и раньше.
Работает в Telegram, MAX, ВКонтакте, Viber, WhatsApp и WhatsApp Business.
Видео адресату в MAX уходит видео, если MAX принимает его формат — MP4, MOV, MKV или WEBM. Видео другого формата или такое, которое MAX не смог обработать, адресат получит файлом.
Мессенджеры присылают такой набор по-разному, и конструктор подстраивается.
Telegram при отправке файлов показывает галочку «Группировать». С галочкой файлы приходят альбомом, без неё — каждый отдельным сообщением. Фото вместе с документом Telegram в один альбом не собирает вовсе: два фото и docx — это альбом и отдельное сообщение, а то и три сообщения. Всё, что подписчик прислал в личку подряд, конструктор собирает в один набор — и альбом, и отдельные файлы.
Остальные мессенджеры картинки обычно присылают одним сообщением с несколькими вложениями, а документы разных типов — например xlsx и txt — отдельными сообщениями. Их конструктор собирает так же.
Набор закрывается, когда после последнего файла прошло 3 секунды тишины, — но не позже чем через 12 секунд от первого файла: телефон догружает файлы по одному, и каждый новый файл продлевает ожидание. В наборе — до 10 файлов, как в альбоме Telegram; одиннадцатый начинает следующий набор.
В любом случае блок срабатывает один раз — со всеми файлами, а не по разу на файл. Бот ответит одним сообщением, а не по сообщению на файл.
Бот отвечает на файл чуть позже обычного — он ждёт, не летит ли следом ещё один. На текстовые сообщения и нажатия кнопок это не распространяется: они идут без задержки. В группах и каналах Telegram отдельные сообщения тоже идут без ожидания; собирается только альбом.
Действие Яндекс Диск или Google Диск сохраняет файл
по ссылке. Чтобы сохранить весь альбом, положите #{media_urls} в список
и пройдите по нему циклом — на каждой строке своя ссылка.
Значения media_type
| Значение | Тип файла |
|---|---|
file | Файл / документ. |
image | Изображение. |
audio | Аудио. |
video | Видео. |
Дошёл ли файл до адресата
Пересылка может не удаться, и бот об этом не догадается сам: подписчик заблокировал бота, файл оказался слишком большим, канал получателя отключили. Раньше сценарий шёл дальше как ни в чём не бывало — теперь он может проверить.
Сразу после действия поставьте переход с условием по переменной
#{media_sent}:
1— файлы получили все адресаты;0— кому-то не досталось;- пусто — адресатов в действии не было, файл только скачали.
Считается по всему входящему сообщению: если действий приёма два, итог второго не затирает неудачу первого.
Условие: #{media_sent} равно 0
→ сообщить администратору: «Файл от [ClientID] не переслался: #{media_error}»
Сколько отправок не удалось, лежит в #{media_notsent},
а короткая причина последней неудачи — в #{media_error}: её удобно
подставлять в сообщение администратору, чтобы не лезть в журнал.
Если пересылка — это уведомление менеджеру о заявке с фото, проверка обязательна: иначе заявка потеряется молча. Для необязательных картинок проверять незачем.
Стикер этим действием не примешь: в Telegram и MAX это отдельный объект, а не файл.
Он приходит обычным ответом подписчика — меткой [Sticker(...)], которая в тексте
превращается в эмодзи, а сам стикер уходит отдельным сообщением. Подробнее —
в шаблонах.
media_sent — про пересылку адресатам. Если файл вообще не удалось забрать
у мессенджера, переменная тоже будет 0, а #{media_url} останется пустой.
