В этой статье расскажу, как я организовал работу с голосовыми сообщениями и кружками в SaleBot и какой путь изначально был пройден.
Основная проблема SaleBot в том, что даже сейчас, на момент написания статьи (18.03.23) этот конструктор не умеет нативно работать с такого рода контентом. Т.е нет такой возможности загрузить видео файл и на его основе отправлять кружки пользователям как и нет возможности с mp3 файла сделать голосовое сообщение. Хотя технически организовать это возможно и мне даже удалось сделать такой конвертер в одном из Telegram-ботов собственной разработки. По какой причине нет такого функционала в самом SaleBot пока всё еще загадка.
Что будем делать?
Для начала разберемся, как вообще можно отправить аудио- видео- сообщения в SaleBot? В этом плане поможет документация в которой описан этот процесс с применением стороннего бота. Прочитав несколько строк по указанной ссылке, становится понятно, что вся логика отправки, что видео, что аудио сообщений крутится вокруг идентификатора файла в Telegram.
Так вот, вкратце, что предлагает нам документация: по сути взять уже готовое круглое видео, отправить его в сторонний бот, получить file_id и использовать обертки над функциями Telegram API tg_send_video_note и tg_send_audio_note. Первое время в принципе все так и делали, затем в тематических Telegram-чатах стал распространяться более упрощенный способ получения file_id в котором для получения этого идентификатора предложили использовать не сторонний бот, а возможности конструктора. Более того, те кто использовали такой метод, отмечали, что время жизни кружка или гс полученного таким образом было несколько дольше, чем если бы file_id получить в другом боте.
О том, что, эти сообщения «отваливаються» это вообще тема для отдельного разговора. Это связано с спецификой самого API Telegram.
На скриншоте выше в документации Telegram прямым текстом указывают, что file_id уникальный, но каким-то чудом может быть разным для одного и того же файла в одном и том же боте.
И при том, что file_id может изменится тем не менее это не мешает использовать (и рекомендовать!) такой способ отправки кругляков и гс в документации Telegram.
Так что собственно делать?
И так, что у нас есть:
- Мы знаем, что отправлять придется готовое видео-/аудио- сообщение.
- Для конвертации mp3/mp4 в формат кругляков и гс всё равно нужен будет сторонний бот.
- Отправлять такой контент нужно через функции API и использовать file_id
- file_id, как мы выяснили, может внезапно «протухнуть» и работать отправка не будет.
И что нужно реализовать?
- Какое-то более менее удобное меню для отправки кругляков и гс
- Получение file_id
- Максимально упростить работу с API что бы сократить время и кол-во ошибок при настройке
- Как-то отслеживать отправку гс и кругляков и нужны уведомления, если что-то пошло не так
Решение задачи
Ввиду требований которые я описал выше, была разработана вот такая схемка как на скрине выше. В неё не всё относится к отправки кругляков и голосовых в бот, но раз начал делать инструмент, то почему-бы не сделать его полноценным и многофункциональным? Но обо всем по порядку.
В основе схемы мы будем использовать всё тот-же подход, который гуляет в тематических чатах, и получать file_id будем непосредственно в целевом боте, т.е в том, который подключен к SaleBot и без привлечений сторонних решений. Для того, что бы эта часть схемы работала, в константах проекта в SaleBot необходимо прописать переменную save_webhook и присвоить её значение равное единице.
Следующим шагом добавляем зеленый блок в котором размещаем удобное для Вас ключевое слово для запуска схемы. И создаем небольшое кнопочное меню.
Затем протягиваем обычную стрелку (без таймера) и создаем следующий блоки. В условии перехода стрелки выбираем соответствующие кнопки с меню в блоке выше.
Далее я приведу текстовку в блоках и их калькуляторах, саму схему следует собирать по скриншоту выше, ничего необычного в ней нет. Если будете повторять эту схему, учтите, что в большей части блоков включен режим разметки текста Markdown.
1 2 3 4 |
_Пришли кругляк \(видео\-сообщение\)_ И не забудь установить переменную проекта *adminid* Твой adminid `#{platform_id}` |
Второй после стартового блок.
Текст
1 2 3 4 5 6 7 8 |
`vComm \= 'сюда впиши комментарий' blNo \= '11882653' aws \= get\(tg\_send\_video\_note\(platform\_id, \'#{id}\'\),'ok'\) status\_video \= if\(aws \=\= 'false' AND notSubscribed \!\= 1,'Не работает','Активно'\) sb\_st \= 'https://salebot\.pro/projects/\#\{project\_id\}/clients/\#\{client\_id\}' report \= 'Статус видео: ' \+ status\_video \+ '\\n' \+ 'Блок №: \#\{blNo\}' \+ '\\n' \+ 'Комментарий: ' \+ vComm \+ '\\n' \+ 'Ссылка: ' \+ sb\_st request \= if\(status\_video \!\= 'Активно','tg\_send\_message',''\) tmp \= \#\{request\}\(adminid, report, None, None, 'html', 1\)` |
Калькулятор
1 |
id = get(tg_request, 'message|video_note|file_id') |
Третий, после стартового блок
Текст: #{none}
Калькулятор:
1 |
tg_send_chat_action(platform_id, 'record_video') |
Четвертый блок (Test PASS, через 4 секунды):
Текст: Если тебе пришло видео-сообщение выше, значит ID получен верно,код сгенерирован верно.
(markdown-разметка выключена)
Калькулятор (для видео сообщений):
1 2 3 4 5 6 7 8 |
vComm = 'сюда впиши комментарий' blNo = 'здесь номер блока' aws = get(tg_send_video_note(platform_id, id),'ok') status_video = if(aws == 'false' AND notSubscribed != 1,'Не работает','Активно') sb_st = 'https://salebot.pro/projects/#{project_id}/clients/#{client_id}' report = '<b>Статус видео: </b>' + status_video + '\n' + '<b>Блок №: </b>; #{blNo}' + '\n' + '<b>Комментарий: </b>' + vComm + '\n' + '<b>Ссылка: </b>' + sb_st request = if(status_video != 'Активно','tg_send_message','') tmp = #{request}(adminid, report, None, None, 'html', 1) |
Калькулятор: (для аудио сообщений):
1 2 3 4 5 6 7 8 |
vComm = 'сюда впиши комментарий' blNo = 'здесь номер блока' aws = get(tg_send_voice(platform_id,id),'ok') status_video = if(aws == 'false' AND notSubscribed != 1,'Не работает','Активно') sb_st = 'https://salebot.pro/projects/#{project_id}/clients/#{client_id}' report = 'Статус аудио: ' + status_video + '\n' + 'Блок №: #{blNo}' + '\n' + 'Комментарий: ' + vComm + '\n' + 'Ссылка: ' + sb_st request = if(status_video != 'Активно','tg_send_message','') tmp = #{request}(adminid, report, None, None, 'html', 1) |
И затем следует добавить пустой блок, в который будут сходится ветки и с голосовых и с видео сообщений и возвращаться в главное меню.
Как это работает?
После ввода ключевого слово срабатывает зеленый блок и отправляет меню доп.функций в бот. В этом меню нужно выбрать, какую опцию мы хотим использовать. Например видео сообщение. После этого в нужный нам бот необходимо переслать видеосообщение (кругляк).
В ответ бот сгенерирует код для калькулятора и проведет ряд проверок.
После этих не хитрых процедур, всё, что остается, так это просто полностью скопировать код присланный в ответ на видео или аудио сообщение и чуть-чуть настроить.
Вся настройка сводится к тому, что бы ввести комментарий в переменную vComm для того, что бы было более менее понятно, что за кругляк отправляется и где его можно искать. Для таких целей я использую хэштеги в телеграм. Основная идея следующая:
когда заказчик скидывает мне все необходимые кругляшки и голосовые, в первую очередь я пересылаю их в свой закрытый Telegram-канал. А в при пересылке я дописываю некие хэштеги по котором я могу понять, что это за сообщение, к какому проекту оно относится и т.д Хотя вообще хорошо бы под разные имеющиеся проекты заводить отдельный Telegram-канал, что бы контент не перемешивался. И вот уже после того, как у гс и кругляков появился свой хэштег, я пересылаю его в бот. А когда бот отправляет уже готовый код калькулятора, я как раз и вписываю хэштег в переменную vComm. Так же, если у вас разные листы под разные воронки, то в эту переменную можно вписать и ссылку на лист, что бы можно было быстрее понять, где искать блок, когда file_id в нем протухнет. Также я рекомендую вписывать номер блока в котором используется конкретный код в переменную blNo.
Теперь, когда все настроено, можно смело использовать блок в составе нужной вам воронки. Вашим клиентам ничего лишнего, кроме самого контента отправляться не будет. Но особенность генерируемого таким ботом, кода в том, что в случае, когда file_id «протухнет» вы автоматически получите уведомление об этом.
Работа с голосовыми сообщениями происходит абсолютно аналогичным образом и отличия от видео сообщения только в блоке калькулятора нашей системной воронки. Основная суть абсолютно одинакова. Если при создании этой системной схемы вы не допустите ошибок, то схема заработает сразу и не в какой дополнительной настройке не нуждается.
Вместо вывода
В итоге мы получаем универсальную схему, которая не нуждается в стороннем боте для получения file_id. Так же эта схема автоматически генерирует весь необходимый код калькулятора, который уже содержит элементы которые позволяют проверить, было ли отправлено такое сообщение клиенту и если отправка не удалась, система автоматически уведомит вас (администратора) о том, что что-то пошло не так. Использование автоматической кодогенерации также позволяет существенно сократить время на создание и настройку блока воронки который содержит голосовое или видео, а так же практически сводит на нет любые ошибки связанные с человеческим фактором, если до этого подобный код приходилось копировать с другого блока или же текстового документа с шаблоном (снипетом) такого кода.
И как бонус, подход, в котором контент изначально пересылаеться в закрытый канал, добавляеться к круглякам или голосовым хэштег, и затем уже происходит пересылка в бот, позволяет оперативно найти нужный контент и исправить проблему с file_id, если вдруг этот идентификатор внезапно «протух». Достаточно просто взять хэштег протухшего видео/аудио сообщения, найти его на канале и просто повторить кодогенерацию.
А про другие возможности такой, системной, воронки мы поговорим в следующий раз. Если вам нужна какая-то помощь по настройке этой воронки пишите мне в Telegram. Так же можете указать в сообщении свой email и я предоставлю вам доступ к проекту с которого вы сможете скопировать всю готовую схему в свой проект.