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

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


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

Автор решения: Anton Savitskiy

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

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")

→ Ссылка
Автор решения: Krog-13

I have this code

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

→ Ссылка
Автор решения: Ser.Makarov

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

  1. @dp.message(F.content_type == ContentType.WEB_APP_DATA) или
  2. @dp.message(lambda message: message.web_app_data)

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

→ Ссылка
Автор решения: Alright

Можно использовать магический фильтр 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)
→ Ссылка