Делаем турбо удобную интеграцию между ботами телеграм

Раскрываем тему передачи файлов, аудио и любых сущностей между ботами, без лишних движений\сохранений\загрузок
Раскрываем тему передачи файлов, аудио и любых сущностей между ботами, без лишних движений\сохранений\загрузок
Результат за 2 клика

Одному моему заказчику, владельцу бота Мелодист (Суно генерация музыки), так понравился мой Вжух, что он предложил как-нибудь интегрировать наших ботов между собой. Идея клёвая, оба бота про музыку, один её создает, второй из готовой музыки делает видеокружочки, и сразу было ощущение, что можно реализовать интергейшн в максимально простом удобном формате, как мы любим, чтоб чик-пук и готов Вжух

Задача - когда Суно бот выдаёт юзеру сгенереный аудио - добавить под этот аудио кнопку "сделать Вжух". Кнопка открывает Вжух бот с уже заряженным в состояние аудио файлом - юзеру остается закинуть картинку, и получится Вжух

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

f_up_file = FSInputFile( 'some_song.mp3' ) f_msg = await bot.send_audio(f_user_id, audio=f_up_file) f_audio_id = f_msg.audio.file_id ... await bot2.send_audio(f_user_id, audio=f_audio_id)

Решение - вешать на кнопку диплинк ссылку на бота, с вшитыми данными трека - file_id, по которому бот сможет загрузить себе аудио

Проблема 1 - бот может работать с file_id только тех файлов, которые он уже где-то видел - в переписках с юзером, сам загрузил, или в группах каналах

Решение - Cуно бот все треки, которые отправляет юзерам, также отправляет в приватную группу, в которой еще в админах Вжух бот. Получается любой файл они оба видят и могут обращаться к нему по чистым file_id

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

support_bot = Bot(token='support_bot_token') f_support_message = await support_bot.send_audio('group_id', f_up_file) f_audio_id = f_support_message.audio.file_id

создаем приват канал\группу, узнаем её id (-23545366346 как то так), подставляем в функцию send_audio() и добавляем саппорт бота в эту группу, готово.

Прикладываем id файла в диплинк, и показываем юзеру кнопку перехода во Вжух по этому диплинку

payload = encode_payload(f_audio_id) f_wjooh_bot = f'https://t.me/Wjooh_bot?start={payload}' kb_build = InlineKeyboardBuilder() kb_build.row(InlineKeyboardButton(text='Сделать Вжух!', url=f_wjooh_bot)) await bot.send_audio(f_user_id,f_up_file,reply_markup=kb_build.as_markup())

добавляем Вжух бота в эту же группу\канал, и обрабатываем start команду с диплинком:

@start_router.message(Command('start')) async def process_start_command(message: Message,command: Command = None): if command and command.args: f_audio_id = decode_payload(command.args)

проблема 2 - телеграм не дает боту обработать диплинк в котором пейлоад - параметры ссылки - вотэтовотвсё после somebot?start= - больше 64 символов. Во Вжух просто не приходит событие /start от юзера по такой ссылке. Айди файла около 80 символов

решение - ставить в диплинк кнопки id сообщения в приватной группе, а не файла. Id сообщения считается с нуля или около того, и сейчас у меня занимает 3 символа:

f_support_message = await back_bot.send_audio('group_id', f_up_file) f_message_id = f_support_message.message_id payload = encode_payload(f_message_id)

проблема 3 - бот не может просто взять и достать обьект сообщения (из которого можно получить id аудио) по его id.

варианты:

1 - сохранять во Вжухе все сообщения из приват группы в собственную базу (какой-то перегруз)

2 - ЛЮБОЙ БОТ МОЖЕТ РЕДАКТИРОВАТЬ СООБЩЕНИЕ ПО АЙДИ И ПОЛУЧАТЬ В ЭТОТ МОМЕНТ ОБЬЕКТ НОВОГО СООБЩЕНИЯ чтобы достать оттуда аудио и всё остальное (это интересно)

Но всё таки бот не может редактировать чужое сообщение. Группу переделываем в канал, там все сообщения общие, и все их могут редактировать. Дописываем код получения аудио файла во Вжухе:

@start_router.message(Command('start')) async def process_start_command(message: Message,command: Command = None): if command and command.args: f_message_id = decode_payload(command.args) f_body = f'send to wjooh \n\n{datetime.datetime.now().timestamp()}' f_msg = await bot.edit_message_caption(group_id, f_message_id, caption=f_body) f_audio_id = f_msg.audio.file_id

И всё, интеграция готова, боты теперь как родные :3

Вжух бот :

Суно бот:

Смотри предыдущую статью, как я создавал Вжух бота:

22
Начать дискуссию