Added support of direct mini app links

This commit is contained in:
welaskez 2025-03-09 11:12:32 +05:00
parent 35d334b83c
commit 21cb9cd6cd
2 changed files with 27 additions and 2 deletions

View file

@ -82,6 +82,7 @@ async def create_startapp_link(
bot: Bot,
payload: str,
encode: bool = False,
app_name: Optional[str] = None,
encoder: Optional[Callable[[bytes], bytes]] = None,
) -> str:
"""
@ -93,6 +94,7 @@ async def create_startapp_link(
:param bot: bot instance
:param payload: args passed with /start
:param encode: encode payload with base64url or custom encoder
:param app_name: if you want direct mini app link
:param encoder: custom encoder callable
:return: link
"""
@ -101,6 +103,7 @@ async def create_startapp_link(
username=cast(str, username),
link_type="startapp",
payload=payload,
app_name=app_name,
encode=encode,
encoder=encoder,
)
@ -110,6 +113,7 @@ def create_deep_link(
username: str,
link_type: Literal["start", "startgroup", "startapp"],
payload: str,
app_name: Optional[str] = None,
encode: bool = False,
encoder: Optional[Callable[[bytes], bytes]] = None,
) -> str:
@ -117,8 +121,9 @@ def create_deep_link(
Create deep link.
:param username:
:param link_type: `start` or `startgroup`
:param link_type: `start`, `startgroup` or `startapp`
:param payload: any string-convertible data
:param app_name: if you want direct mini app link
:param encode: encode payload with base64url or custom encoder
:param encoder: custom encoder callable
:return: deeplink
@ -138,4 +143,9 @@ def create_deep_link(
if len(payload) > 64:
raise ValueError("Payload must be up to 64 characters long.")
return create_telegram_link(username, **{cast(str, link_type): payload})
if not app_name:
deep_link = create_telegram_link(username, **{cast(str, link_type): payload})
else:
deep_link = create_telegram_link(username, app_name, **{cast(str, link_type): payload})
return deep_link

View file

@ -52,6 +52,10 @@ class TestDeepLinking:
link = await create_startapp_link(bot, payload)
assert link == f"https://t.me/tbot?startapp={payload}"
async def test_get_startapp_link_with_app_name(self, bot: MockedBot, payload: str):
link = await create_startapp_link(bot, payload, app_name="app")
assert link == f"https://t.me/tbot/app?startapp={payload}"
async def test_filter_encode_and_decode(self, payload: str):
encoded = encode_payload(payload)
decoded = decode_payload(encoded)
@ -102,6 +106,17 @@ class TestDeepLinking:
assert link == f"https://t.me/tbot?startapp={encoded_payload}"
async def test_get_startapp_link_with_app_name_and_encoding(
self, bot: MockedBot, wrong_payload: str
):
# define link
link = await create_startapp_link(bot, wrong_payload, encode=True, app_name="app")
# define reference link
encoded_payload = encode_payload(wrong_payload)
assert link == f"https://t.me/tbot/app?startapp={encoded_payload}"
async def test_64_len_payload(self, bot: MockedBot):
payload = "p" * 64
link = await create_start_link(bot, payload)