Перейти к основному содержимому

Приём и пересылка медиа

Действие позволяет принимать файлы от подписчиков и пересылать их другим подписчикам — например, владельцу бота или менеджеру.

Конструктор не хранит файлы

Конструктор не сохраняет полученные файлы. Если нужно их хранить — используйте действие вместе с Яндекс Диском или Google Диском.

Прием и пересылка медиа


Настройка​

  1. Добавьте действие «Приём и пересылка медиа».
  2. Выберите тип файлов, которые нужно принимать.
  3. Укажите, куда переслать.

Куда переслать​

  • Адресатам — как раньше: ClientID, Messenger и BotID одного или нескольких получателей;
  • Сотруднику — привязанным сотрудникам аккаунта. Отметка «Отправить всем» отправляет файл всем активным, без неё выберите нужных из списка.
Бот переезжает в другой аккаунт

Выбирайте «Сотруднику» с отметкой «Отправить всем». Получателей бот находит в момент пересылки, поэтому настройка работает и на новом месте. Конкретный сотрудник и адресат по ClientID привязаны к текущему аккаунту.

Повторно отправленный файл доходит не сразу

Если подписчик отправляет файл, который уже лежит в переписке, Telegram не загружает его заново, а ссылается на прежний. Такой файл мессенджер отдаёт боту не всегда с первого раза — конструктор ждёт и повторяет запрос. Если файл так и не пришёл, в #{media_error} будет «мессенджер не отдал файл: попросите отправить его заново».

Оборвалась связь — конструктор повторит

Если соединение с мессенджером оборвалось на полуслове (в журнале это видно как ECONNRESET или «socket hang up»), конструктор повторяет отправку до пяти раз — через секунду, три, восемь и пятнадцать, но не дольше двух минут на файл. Отказ по существу — бот заблокирован, файл больше 20 МБ — не повторяется: ответ будет тот же.

Между файлами набора конструктор делает передышку в секунду, а связь на каждый файл открывает заново.

Внутри одного бота файл пересылается мгновенно

Если подписчик и получатель — в одном и том же боте, файл не скачивается и не загружается заново: конструктор пересылает его тем же вложением, которое уже лежит у мессенджера. Так быстрее, и ограничение в 20 МБ здесь не мешает. Работает в Telegram и MAX.

Телеграм не отдаёт файлы больше 20 МБ другому боту

Ограничение самого мессенджера: ботам он выдаёт файлы до 20 МБ. Это важно, когда файл пересылается в другой бот или в другой мессенджер — там его приходится скачивать. Файл больше бот скачать не сможет, пересылки не будет, и сценарий просто пойдёт дальше. Если ждёте от подписчиков большие видео, попросите присылать их ссылкой — либо пересылайте внутри того же бота.

Загрузка на диск без пересылки

Если файл нужно только сохранить на Яндекс / Google Диск без пересылки другим подписчикам — адресата можно не указывать. В следующем действии используйте ссылку на файл из переменной #{media_url}.


Переменные действия​

После приёма медиа конструктор автоматически заполняет несколько переменных — используйте их в последующих действиях.

ПеременнаяЧто в неё попадает
media_typeТип медиафайла (см. таблицу ниже).
media_extРасширение файла.
media_urlСсылка на файл — время жизни 1 минута.
media_urlsСсылки на все пересланные файлы, по одной в строке.
media_countСколько файлов переслали. Один файл — 1.
media_durationДлительность аудио в секундах.
ismediaСтановится 1 при пересылке медиа.
media_sent1 — файл получили все адресаты, 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} останется пустой.