Веб Застосунок (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).
True, якщо цей користувач має підписку Telegram Premium.
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.