From 082d67d65105bf9f2fe51c49ba80aa6c49286b63 Mon Sep 17 00:00:00 2001 From: vasilytray Date: Tue, 11 Mar 2025 22:29:39 +0700 Subject: [PATCH] add url-button --- README.md | 20 ++++++++++++++++++++ bot.py | 34 +++++++++++++++++++++++++++++++++- bot2.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 94ffc20..7583986 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,11 @@ bot = Bot(token=config.bot_token.get_secret_value()) В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2. Наиболее продвинутыми из них считаются HTML и MarkdownV2 +> Часто требуется получить id user-а (user_id), получить его можно так: +```py +user_id = message.from_user.id +``` + #### Форматированный вывод За выбор форматирования при отправке сообщений отвечает аргумент ``parse_mode``, например: @@ -538,3 +543,18 @@ async def on_user_shared(message: types.Message): f"User ID: {message.chat_shared.chat_id}" ) ``` + +### Инлайн-кнопки + +В отличие от обычных кнопок, инлайновые цепляются не к низу экрана, а к сообщению, с которым были отправлены. В этой главе мы рассмотрим два типа таких кнопок: **URL** и **Callback**. + +#### URL-кнопки + +Самые простые инлайн-кнопки относятся к типу URL, т.е. «ссылка». Поддерживаются только протоколы **HTTP(S)** и **tg://** + +При попытке создать URL-кнопку с ID юзера, у которого отключен переход по форварду, бот получит ошибку **Bad Request: BUTTON_USER_PRIVACY_RESTRICTED**. Соответственно, прежде чем показывать такую кнопку, необходимо выяснить состояние упомянутой настройки. Для этого можно вызвать метод **getChat** и в ответе проверить состояние поля **has_private_forwards**. Если оно равно **True**, значит, попытка добавить **URL-ID** кнопку приведёт к ошибке. + +#### Callback-кнопки + +У колбэк-кнопок есть специальное значение **(data)**, по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до запуска вычислений на кластере суперкомпьютеров. + diff --git a/bot.py b/bot.py index a652228..873065a 100644 --- a/bot.py +++ b/bot.py @@ -322,7 +322,7 @@ async def cmd_special_buttons(message: types.Message): text="Выбрать премиум пользователя", request_user=types.KeyboardButtonRequestUser( request_id=1, - user_is_premium=True + user_is_premium=False ) ), types.KeyboardButton( @@ -357,8 +357,10 @@ async def handle_contact(message: types.Message): async def on_user_shared(message: types.Message): await message.answer( f"Request {message.user_shared.request_id}. " + f"User ID: {message.user_shared.user_id}" ) + abc_id = message.user_shared.request_id @dp.message(F.chat_shared) @@ -368,6 +370,36 @@ async def on_user_shared(message: types.Message): f"Chat ID: {message.chat_shared.chat_id}" ) +# новый импорт +from aiogram.utils.keyboard import InlineKeyboardBuilder + +@dp.message(Command("inline_url")) +async def cmd_inline_url(message: types.Message, bot: Bot): + builder = InlineKeyboardBuilder() + builder.row(types.InlineKeyboardButton( + text="GitHub", url="https://github.com") + ) + builder.row(types.InlineKeyboardButton( + text="Оф. канал Telegram", + url="tg://resolve?domain=telegram") + ) + + # Чтобы иметь возможность показать ID-кнопку, + # У юзера должен быть False флаг has_private_forwards + user_id = message.from_user.id + chat_info = await bot.get_chat(user_id) + if not chat_info.has_private_forwards: + builder.row(types.InlineKeyboardButton( + text="Какой-то пользователь", + url=f"tg://user?id={user_id}") + ) + + await message.answer( + 'Выберите ссылку', + reply_markup=builder.as_markup(), + ) + + @dp.message(Command("vfy")) @dp.message(CommandStart( deep_link=True, magic=F.args == "vfy" diff --git a/bot2.py b/bot2.py index 5b24291..f63d27b 100644 --- a/bot2.py +++ b/bot2.py @@ -126,6 +126,35 @@ async def handle_contact(message: types.Message): else: await message.answer("Это не ваш контакт!") +# новый импорт +from aiogram.utils.keyboard import InlineKeyboardBuilder + +@dp.message(Command("inline_url")) +async def cmd_inline_url(message: types.Message, bot: Bot): + builder = InlineKeyboardBuilder() + builder.row(types.InlineKeyboardButton( + text="GitHub", url="https://github.com") + ) + builder.row(types.InlineKeyboardButton( + text="Оф. канал Telegram", + url="tg://resolve?domain=telegram") + ) + + # Чтобы иметь возможность показать ID-кнопку, + # У юзера должен быть False флаг has_private_forwards + user_id = message.from_user.id + chat_info = await bot.get_chat(user_id) + if not chat_info.has_private_forwards: + builder.row(types.InlineKeyboardButton( + text="Какой-то пользователь", + url=f"tg://user?id={user_id}") + ) + + await message.answer( + 'Выберите ссылку', + reply_markup=builder.as_markup(), + ) + # Запуск процесса поллинга новых апдейтов async def main():