add url-button

This commit is contained in:
vasilytray 2025-03-11 22:29:39 +07:00
parent a30b25e9f5
commit 082d67d651
3 changed files with 82 additions and 1 deletions

View File

@ -134,6 +134,11 @@ bot = Bot(token=config.bot_token.get_secret_value())
В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2. В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2.
Наиболее продвинутыми из них считаются HTML и MarkdownV2 Наиболее продвинутыми из них считаются HTML и MarkdownV2
> Часто требуется получить id user-а (user_id), получить его можно так:
```py
user_id = message.from_user.id
```
#### Форматированный вывод #### Форматированный вывод
За выбор форматирования при отправке сообщений отвечает аргумент ``parse_mode``, например: За выбор форматирования при отправке сообщений отвечает аргумент ``parse_mode``, например:
@ -538,3 +543,18 @@ async def on_user_shared(message: types.Message):
f"User ID: {message.chat_shared.chat_id}" 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 очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до запуска вычислений на кластере суперкомпьютеров.

34
bot.py
View File

@ -322,7 +322,7 @@ async def cmd_special_buttons(message: types.Message):
text="Выбрать премиум пользователя", text="Выбрать премиум пользователя",
request_user=types.KeyboardButtonRequestUser( request_user=types.KeyboardButtonRequestUser(
request_id=1, request_id=1,
user_is_premium=True user_is_premium=False
) )
), ),
types.KeyboardButton( types.KeyboardButton(
@ -357,8 +357,10 @@ async def handle_contact(message: types.Message):
async def on_user_shared(message: types.Message): async def on_user_shared(message: types.Message):
await message.answer( await message.answer(
f"Request {message.user_shared.request_id}. " f"Request {message.user_shared.request_id}. "
f"User ID: {message.user_shared.user_id}" f"User ID: {message.user_shared.user_id}"
) )
abc_id = message.user_shared.request_id
@dp.message(F.chat_shared) @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}" 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(Command("vfy"))
@dp.message(CommandStart( @dp.message(CommandStart(
deep_link=True, magic=F.args == "vfy" deep_link=True, magic=F.args == "vfy"

29
bot2.py
View File

@ -126,6 +126,35 @@ async def handle_contact(message: types.Message):
else: else:
await message.answer("Это не ваш контакт!") 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(): async def main():