Веб Застосунок (WebApp)#

Telegram Bot API 6.0 зробив революцію у розробці чат-ботів, використовуючи особливості Веб Застосунків.

Ви можете прочитати більше про це в офіційному блозі та документації.

aiogram реалізує прості утиліти для усунення головного болю, надаючи готові інструменти перевірки даних із Веб Застосунку Telegram на серверній стороні.

Використання#

Наприклад, із фронтенду ви передасте application/x-www-form-urlencoded в POST запиті із полем _auth у тілі та хочете повернути інформацію про користувача у відповідь як application/json

from aiogram.utils.web_app import safe_parse_webapp_init_data
from aiohttp.web_request import Request
from aiohttp.web_response import json_response

async def check_data_handler(request: Request):
    bot: Bot = request.app["bot"]

    data = await request.post()  # application/x-www-form-urlencoded
    try:
        data = safe_parse_webapp_init_data(token=bot.token, init_data=data["_auth"])
    except ValueError:
        return json_response({"ok": False, "err": "Unauthorized"}, status=401)
    return json_response({"ok": True, "data": data.user.dict()})

Функції#

aiogram.utils.web_app.check_webapp_signature(token: str, init_data: str) bool[source]#

Перевірка вхідного підпису даних ініціалізації Веб Застосунку

Джерело: https://core.telegram.org/bots/webapps#validating-data-received-via-the-web-app

Параметри:
  • token – Токен бота

  • init_data – дані з фронтенду, що підлягають перевірці

Повертає:

aiogram.utils.web_app.parse_webapp_init_data(init_data: str, *, loads: ~typing.Callable[[...], ~typing.Any] = <function loads>) WebAppInitData[source]#

Аналіз данихі ініціалізації Веб Застосунку і повернення їх як об’єкту WebAppInitData

Цей метод не забезпечує безпеку, тому вам не варто довіряти цим даним, замість цього використовуйте safe_parse_webapp_init_data.

Параметри:
  • init_data – дані з frontend для аналізу

  • loads

Повертає:

aiogram.utils.web_app.safe_parse_webapp_init_data(token: str, init_data: str, *, loads: ~typing.Callable[[...], ~typing.Any] = <function loads>) WebAppInitData[source]#

Перевірка необроблених даних ініціалізації Веб Застосунку і повернення їх як об’єкту WebAppInitData

Видає ValueError, коли дані недійсні

Параметри:
  • token – токен бота

  • init_data – дані з фронтенду для аналізу і перевірки

  • loads

Повертає:

Типи#

class aiogram.utils.web_app.WebAppInitData(**extra_data: Any)[source]#

Об’єкт, що містить дані які передаються у Веб Застосунок під час його відкриття. Він порожній, якщо Веб Застосунок було запущено за допомогою кнопки клавіатури.

Джерело: https://core.telegram.org/bots/webapps#webappinitdata

model_computed_fields: ClassVar[dict[str, ComputedFieldInfo]] = {}#

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'defer_build': True, 'extra': 'allow', 'frozen': True, 'populate_by_name': True, 'use_enum_values': True, 'validate_assignment': True}#

Конфігурація для моделі має бути словником, що відповідає [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[dict[str, FieldInfo]] = {'auth_date': FieldInfo(annotation=datetime, required=True), 'can_send_after': FieldInfo(annotation=Union[int, NoneType], required=False), 'chat': FieldInfo(annotation=Union[WebAppChat, NoneType], required=False), 'chat_instance': FieldInfo(annotation=Union[str, NoneType], required=False), 'chat_type': FieldInfo(annotation=Union[str, NoneType], required=False), 'hash': FieldInfo(annotation=str, required=True), 'query_id': FieldInfo(annotation=Union[str, NoneType], required=False), 'receiver': FieldInfo(annotation=Union[WebAppUser, NoneType], required=False), 'start_param': FieldInfo(annotation=Union[str, NoneType], required=False), 'user': FieldInfo(annotation=Union[WebAppUser, NoneType], required=False)}#

Метадані про поля, визначені на моделі, відображення назв полів у [FieldInfo][pydantic.fields.FieldInfo].

Це замінює Model.__fields__ з Pydantic V1.

query_id: str | None#

Унікальний ідентифікатор сеансу Веб Застосунку, необхідний для надсилання повідомлень через метод answerWebAppQuery.

user: WebAppUser | None#

Об’єкт, що містить дані про поточного користувача.

receiver: WebAppUser | None#

Об’єкт, що містить дані про співрозмовника поточного користувача в чаті, де бот був запущений через меню вкладення. Повертається тільки для веб-додатків, запущених через меню вкладень.

chat: WebAppChat | None#

Об’єкт, що містить дані про чат, в якому бот був запущений через меню вкладень. Повертається для супергруп, каналів і групових чатів - тільки для веб-додатків, запущених через меню вкладень.

chat_type: str | None#

Тип чату, з якого було відкрито веб-додаток. Може бути як «sender» для приватного чату з користувачем, який відкрив посилання, так і «private», «group», «supergroup» або «channel». Повертається тільки для веб-програм, запущених за прямим посиланням.

chat_instance: str | None#

Глобальний ідентифікатор, що унікальний для чату, з якого було відкрито веб-програму. Повертається тільки для веб-додатків, запущених за прямим посиланням.

start_param: str | None#

Значення параметра startattach, передане через посилання. Повертається лише для Веб Застосунків, коли їх запускають із меню вкладень за посиланням. Значення параметра start_param також буде передано в GET-параметр tgWebAppStartParam, тому Веб Застосунок може відразу завантажити правильний інтерфейс.

can_send_after: int | None#

Час в секундах після якого повідомлення може бути відправлене за допомогою метода answerWebAppQuery.

auth_date: datetime#

Unix час відкриття форми.

hash: str#

Хеш усіх переданих параметрів, за допомогою якого бот-сервер може перевірити їх дійсність.

class aiogram.utils.web_app.WebAppUser(**extra_data: Any)[source]#

Об’єкт що містить дані користувача Веб Застосунку.

Джерело: https://core.telegram.org/bots/webapps#webappuser

id: int#

Унікальний ідентифікатор користувача або бота. Це число може мати більше 32 значущих бітів, і деякі мови програмування можуть мати труднощі в його інтерпретації. Він має щонайбільше 52 значущі біти, тому 64-бітне ціле число або тип з плаваючою точністю подвійної точності є безпечним для зберігання цього ідентифікатора.

is_bot: bool | None#

True, якщо цей користувач бот. Повертаєтся лише в полі отримувача(receiver).

first_name: str#

Ім’я користувача або бота.

last_name: str | None#

Прізвище користувача або бота.

username: str | None#

Нік користувача або бота.

language_code: str | None#

Мовний тег IETF мови користувача. Повертаєтся лише в полі користувача(user).

is_premium: bool | None#

True, якщо цей користувач має підписку Telegram Premium.

added_to_attachment_menu: bool | None#

True, якщо цей користувач додав бота до меню вкладень.

allows_write_to_pm: bool | None#

True, якщо цей користувач дозволив надсилати йому повідомлення.

model_computed_fields: ClassVar[dict[str, ComputedFieldInfo]] = {}#

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'defer_build': True, 'extra': 'allow', 'frozen': True, 'populate_by_name': True, 'use_enum_values': True, 'validate_assignment': True}#

Конфігурація для моделі має бути словником, що відповідає [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[dict[str, FieldInfo]] = {'added_to_attachment_menu': FieldInfo(annotation=Union[bool, NoneType], required=False), 'allows_write_to_pm': FieldInfo(annotation=Union[bool, NoneType], required=False), 'first_name': FieldInfo(annotation=str, required=True), 'id': FieldInfo(annotation=int, required=True), 'is_bot': FieldInfo(annotation=Union[bool, NoneType], required=False), 'is_premium': FieldInfo(annotation=Union[bool, NoneType], required=False), 'language_code': FieldInfo(annotation=Union[str, NoneType], required=False), 'last_name': FieldInfo(annotation=Union[str, NoneType], required=False), 'photo_url': FieldInfo(annotation=Union[str, NoneType], required=False), 'username': FieldInfo(annotation=Union[str, NoneType], required=False)}#

Метадані про поля, визначені на моделі, відображення назв полів у [FieldInfo][pydantic.fields.FieldInfo].

Це замінює Model.__fields__ з Pydantic V1.

photo_url: str | None#

URL-адреса фотографії профілю користувача. Фотографія може бути у форматах .jpeg або .svg. Повертається лише для Веб Застосунків, запущених із меню вкладень.

class aiogram.utils.web_app.WebAppChat(**extra_data: Any)[source]#

Об’єкт чату.

Джерело: https://core.telegram.org/bots/webapps#webappchat

id: int#

Унікальний ідентифікатор цього чату. Це число може мати більше 32 значущих бітів, і деякі мови програмування можуть мати труднощі в його інтерпретації. Він має щонайбільше 52 значущі біти, тому 64-бітне ціле число або тип з плаваючою точкою подвійної точності є безпечним для зберігання цього ідентифікатора.

type: str#

Тип чату, може бути «group», «supergroup» або «channel»

title: str#

Назва чату

username: str | None#

Нік користувача або бота

photo_url: str | None#

URL-адреса фотографії чату. Фотографія може бути у форматах .jpeg або .svg. Повертається лише для Веб Застосунків, запущених із меню вкладень.

model_computed_fields: ClassVar[dict[str, ComputedFieldInfo]] = {}#

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'defer_build': True, 'extra': 'allow', 'frozen': True, 'populate_by_name': True, 'use_enum_values': True, 'validate_assignment': True}#

Конфігурація для моделі має бути словником, що відповідає [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[dict[str, FieldInfo]] = {'id': FieldInfo(annotation=int, required=True), 'photo_url': FieldInfo(annotation=Union[str, NoneType], required=False), 'title': FieldInfo(annotation=str, required=True), 'type': FieldInfo(annotation=str, required=True), 'username': FieldInfo(annotation=Union[str, NoneType], required=False)}#

Метадані про поля, визначені на моделі, відображення назв полів у [FieldInfo][pydantic.fields.FieldInfo].

Це замінює Model.__fields__ з Pydantic V1.