Telegram Mini App: не могу передать данные из mini app боту

Пишу бота для Telegram с использованием библиотеки python-telegram-bot. Подключаю к своему боту Mini App. Приложение запускается и даже может принимать данные от бота, но в обратную сторону данные почему-то не проходят: tg.sendData в мини приложении вызывается, но обработчик сообщения в боте не вызывается.

Подскажите, пожалуйста, в чём может быть проблема?

Обновление: я исследовал разные примеры и варианты реализации мини приложений. И обнаружил, что если заменить InlineKeyboardButton на KeyboardButton, а InlineKeyboardMarkup на ReplyKeyboardMarkup, то передача данных работает. То есть с помощью InlineKeyboardButton запускать мини приложения нельзя? Но я своими глазами видел бота, который запускает мини приложение с помощью кнопки InlineKeyboardButton. То есть видимо для запуска через InlineKeyboardButton нужно добавить что-то ещё?

Код бота:

from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup, WebAppInfo
from telegram.ext import Application, CommandHandler, MessageHandler, ContextTypes, filters
from telegram_token import TELEGRAM_TOKEN


async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # Создаем кнопку с Mini App
    keyboard = [
        [InlineKeyboardButton(
            "? Установить время",
            web_app=WebAppInfo(url="https://мой-личный-диетолог.рф/time-widget/test.html?time=9:33")
        )]
    ]

    await update.message.reply_text(
        "Нажмите кнопку чтобы установить время:",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )


async def handle_web_app_data(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # Получаем данные из Mini App
    data = update.message.web_app_data.data
    await update.message.reply_text(f"Получены данные: {data}")


def main():
    # Инициализация бота
    application = Application.builder().token(TELEGRAM_TOKEN).build()

    # Регистрация обработчиков
    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.StatusUpdate.WEB_APP_DATA, handle_web_app_data))

    # Запуск бота
    application.run_polling()


if __name__ == "__main__":
    main()

Код мини приложения:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Time Picker</title>
  <script src="https://telegram.org/js/telegram-web-app.js?56"></script>
</head>
<body>
    <button id="sendTimeBtn">Отправить текущее время</button>

    <script>
        // Инициализация Telegram Web App
        const tg = window.Telegram?.WebApp;
        
        function sendTime() {
            if (!tg) {
                alert('Работает только в Telegram!');
                return;
            }
            
            // Получаем текущее время
            const now = new Date();
            const time = `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
            
            // Отправляем время в формате "time:HH:MM"
            tg.sendData(`time:${time}`);
            
            // Закрываем Mini App
            tg.close();
        }

        // Инициализация приложения
        if (tg) {
            tg.ready();
            document.getElementById('sendTimeBtn').addEventListener('click', sendTime);
        } else {
            document.body.innerHTML = '<p>Запустите в Telegram!</p>';
        }
    </script>
</body>
</html>

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

Автор решения: Andrey Epifantsev

После внимательного чтения документации выяснилось, что таки да: только приложения Keyboard Button Mini Apps(открываемые через ReplyKeyboardMarkup) могут вызывать Telegram.WebApp.sendData для отправки данных обратно в Телеграм. А Inline Button Mini Apps должны использовать для этого функцию answerWebAppQuery.

→ Ссылка