Как отправить пользователю видео внутри Telegram бота, если информация о user.id и fail.id получена от сервера Flask

Собственно, у нас есть небольшой бот в телеграмме, который отправляет пользователям исходя из их запроса видео. Изначально в базе хранятся соответствующие названия самих видео и их Fail-id. Запущен простой сервер и написана небольшая HTML страница с сайтом. На нем есть кнопка "смотреть", к которой привязано Fail-id видео. При нажатии на нее, в логах мы получаем информацию о пользователе, если он запустил сайт (приложение) внутри телеграмм, и соответственное Fail-id. Примерно так:

INFO:main:Пользователь с ID 374208152. Fail ID фильма: BAACAgIAAxkBAAINS2XGFa2VuYVZwj1WASLBCW6JJDn-AALiPAADT4hIZ2CrLzgCDZI0BA

Как нам непосредственно отправить видео внутри бота? Для проверки делал сохранение информации на рабочий стол. Все работает, информацию из запроса получаем. На звание программиста не претендую, но очень интересна вся эта штука.

Ниже сам код:

@app.route('/watch-film', methods=['POST'])
async def watch_film():
    # Получаем данные из запроса
    data = request.json
    chat_id = data.get('userId')
    fail_id = data.get('failId')

    # Логируем информацию
    app.logger.info(f"Пользователь с ID {chat_id}. Fail ID фильма: {fail_id}")

    # Создаем путь к файлу на рабочем столе
    desktop_path = Path.home() / 'Desktop'
    file_path = desktop_path / 'film_info.txt'

    # Записываем информацию в файл
    with open(file_path, 'a') as file:
        file.write(f"chat_id:{chat_id}\nfail_id:{fail_id}")

    return 'OK'

Ответы (1 шт):

Автор решения: Alex

Добавляем в код сайта:

<script src="https://telegram.org/js/telegram-web-app.js"></script> <!--Подключаем скрипт от телеграм-->

Далее, передаем в кнопку все необходимые значения:

<button class="watch-button" data-fail-id="{{ film['Fail-ID_film'] }}" data-name="{{ film['Name_film'] }}" data-data="{{ film['Data_film'] }}" onclick="watchFilm(this)">Смотреть</button>

Подключаем скрипт:

<script>
    let tg = window.Telegram.WebApp; //получаем объект webapp телеграма

Передаем все необходимые данные дальше:

   // Функция для отправки сообщения с fail id
    async function watchFilm(button) {
        let tg = window.Telegram.WebApp;

        // Получаем ID пользователя
        let userId = document.getElementById("userid").innerText;

        // Получаем Fail-ID фильма из атрибута data-fail-id
        let failId = button.getAttribute('data-fail-id');

        // Получаем название фильма из атрибута data-name
        let filmName = button.getAttribute('data-name');

        // Получаем название фильма из атрибута data-name
        let filmData = button.getAttribute('data-data');

        // Отправляем запрос на сервер для отправки сообщения с видео
        const response = await fetch('/watch-film', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({userId: userId,failId: failId})
        });

        // Проверяем успешность запроса
        if (response.ok) {console.log('отправлено пользователю');}
        else {console.error('Ошибка при отправке');}

        // Отправляем данные о фильме в Telegram
        tg.sendData(JSON.stringify({userId: userId, failId: failId, filmName: filmName, filmData: filmData}));

        tg.close();
    }
   </script>

И самое интересное... принимаем все данные в теле бота:

@dp.message(WebAppDataFilter())
async def handle_web_app_data(message: types.Message, web_app_data: types.WebAppData):
    web_app = WebAppInfo(url='...')
    keyboard = types.ReplyKeyboardMarkup(keyboard=[[types.KeyboardButton(text='...', web_app=web_app)]], resize_keyboard=True)
    data_dict = json.loads(web_app_data.data)  # Преобразуем JSON-строку в словарь
    file_id = data_dict.get('failId')
    name_film = data_dict.get('filmName')
    data_film = data_dict.get('filmData')

И запоминаем, что данные возможно передать обратно, если только пользователь открыл приложение через инлайн кнопку.

→ Ссылка