Получение данных от Web App Telegram aiogram 3.0

Рейтинг: 0Ответов: 4Опубликовано: 17.01.2023

Делаю кастомную форму в web app telegram,и когда при нажатии на кнопку Сохранить отправляю данные в виде строки от веб-приложения к боту с поvощью Senddata(), строка приходит, но не понятно, как её отловить, не нашёл в инете ни одного примера, хотя вроде как технологии уже год. Если писать просто @dp.message() или @route.messsage строка приходит, но тогда не примешь остальные текстовые сообщения. Как отловить данные через хэндэлер или какой-то фильтр?

Ответы

▲ 1

Вот код:

@router.message(~F.message.via_bot)
async def web_app2(message: Message):
    print(message.web_app_data)
    await message.answer("test")
▲ 0

Тоже не нашел, поэтому так:

from typing import Union, Dict, Any
from aiogram.filters import Filter
from aiogram.types import Message

class WebAppDataFilter(Filter):
    async def __call__(self, message: Message, **kwargs) -> 
              Union[bool, Dict[str, Any]]:
        return dict(web_app_data=message.web_app_data) if message.web_app_data 
                                                       else False

# ... Инициализация бота

@dp.message(WebAppDataFilter())
async def handle_web_app_data(message: types.Message, 
                              web_app_data: types.WebAppData):
    print(web_app_data)
    await message.answer("Received web app data")
▲ 0

Решил таким образом:

  1. @dp.message(F.content_type == ContentType.WEB_APP_DATA)

или

  1. @dp.message(lambda message: message.web_app_data)

Есть еще 3й вариант, описанный вами. Но он не работает...

▲ 0

Можно использовать магический фильтр F.content_type, 100% работает:

from aiogram import F
from aiogram.types import Message, ContentType
    
# Хендлер:
@dp.message(F.content_type == ContentType.WEB_APP_DATA)
async def parse_data(message: Message):
    data = message.web_app_data.data
    print(data)