From de240b62ac474ee821914d0c3237a8bbb7267e3d Mon Sep 17 00:00:00 2001 From: naz <85476822+welaskez@users.noreply.github.com> Date: Sat, 8 Mar 2025 05:25:50 +0500 Subject: [PATCH] Added support of "startapp" deep links (#1648) * Added "startapp" deep link support * Remove link_type param, added create_startapp_link method * Write tests for create_startapp_link method * Refactor with black & isort * Added CHANGELOG --- CHANGES/1648.feature.rst | 2 ++ aiogram/utils/deep_linking.py | 31 ++++++++++++++++++++++++++- tests/test_utils/test_deep_linking.py | 19 +++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 CHANGES/1648.feature.rst diff --git a/CHANGES/1648.feature.rst b/CHANGES/1648.feature.rst new file mode 100644 index 00000000..bc86ada4 --- /dev/null +++ b/CHANGES/1648.feature.rst @@ -0,0 +1,2 @@ +Added new method to utils/deep_linking.py module to creating "startapp" deep links, see also +https://core.telegram.org/api/links#main-mini-app-links diff --git a/aiogram/utils/deep_linking.py b/aiogram/utils/deep_linking.py index fe2764f7..3cb3cc25 100644 --- a/aiogram/utils/deep_linking.py +++ b/aiogram/utils/deep_linking.py @@ -3,6 +3,7 @@ from __future__ import annotations __all__ = [ "create_start_link", "create_startgroup_link", + "create_startapp_link", "create_deep_link", "create_telegram_link", "encode_payload", @@ -77,9 +78,37 @@ async def create_startgroup_link( ) +async def create_startapp_link( + bot: Bot, + payload: str, + encode: bool = False, + encoder: Optional[Callable[[bytes], bytes]] = None, +) -> str: + """ + Create 'startapp' deep link with your payload. + + If you need to encode payload or pass special characters - + set encode as True + + :param bot: bot instance + :param payload: args passed with /start + :param encode: encode payload with base64url or custom encoder + :param encoder: custom encoder callable + :return: link + """ + username = (await bot.me()).username + return create_deep_link( + username=cast(str, username), + link_type="startapp", + payload=payload, + encode=encode, + encoder=encoder, + ) + + def create_deep_link( username: str, - link_type: Literal["start", "startgroup"], + link_type: Literal["start", "startgroup", "startapp"], payload: str, encode: bool = False, encoder: Optional[Callable[[bytes], bytes]] = None, diff --git a/tests/test_utils/test_deep_linking.py b/tests/test_utils/test_deep_linking.py index c5f5259a..b5818c52 100644 --- a/tests/test_utils/test_deep_linking.py +++ b/tests/test_utils/test_deep_linking.py @@ -1,6 +1,10 @@ import pytest -from aiogram.utils.deep_linking import create_start_link, create_startgroup_link +from aiogram.utils.deep_linking import ( + create_start_link, + create_startapp_link, + create_startgroup_link, +) from aiogram.utils.payload import decode_payload, encode_payload from tests.mocked_bot import MockedBot @@ -44,6 +48,10 @@ class TestDeepLinking: link = await create_startgroup_link(bot, payload) assert link == f"https://t.me/tbot?startgroup={payload}" + async def test_get_startapp_link(self, bot: MockedBot, payload: str): + link = await create_startapp_link(bot, payload) + assert link == f"https://t.me/tbot?startapp={payload}" + async def test_filter_encode_and_decode(self, payload: str): encoded = encode_payload(payload) decoded = decode_payload(encoded) @@ -85,6 +93,15 @@ class TestDeepLinking: assert link == f"https://t.me/tbot?start={encoded_payload}" + async def test_get_startapp_link_with_encoding(self, bot: MockedBot, wrong_payload: str): + # define link + link = await create_startapp_link(bot, wrong_payload, encode=True) + + # define reference link + encoded_payload = encode_payload(wrong_payload) + + assert link == f"https://t.me/tbot?startapp={encoded_payload}" + async def test_64_len_payload(self, bot: MockedBot): payload = "p" * 64 link = await create_start_link(bot, payload)