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