Formatting used advanced scenario

This commit is contained in:
vasilytray 2025-03-07 16:28:35 +07:00
parent 687209ed0f
commit 2d8340bacf
2 changed files with 158 additions and 3 deletions

View File

@ -124,3 +124,80 @@ from config_reader import config
# чтобы получить настоящее содержимое вместо '*******'
bot = Bot(token=config.bot_token.get_secret_value())
```
## Работа с сообщениями
Разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.
### ТЕКСТ
В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2.
Наиболее продвинутыми из них считаются HTML и MarkdownV2
#### Форматированный вывод
За выбор форматирования при отправке сообщений отвечает аргумент ``parse_mode``, например:
```py
from aiogram import F
from aiogram.types import Message
from aiogram.filters import Command
from aiogram.enums import ParseMode
# Если не указать фильтр F.text,
# то хэндлер сработает даже на картинку с подписью /test
@dp.message(F.text, Command("test"))
async def any_message(message: Message):
await message.answer(
"Hello, <b>world</b>!",
parse_mode=ParseMode.HTML
)
await message.answer(
"Hello, *world*\!",
parse_mode=ParseMode.MARKDOWN_V2
)
```
В aiogram можно задать параметры бота по умолчанию. Для этого создайте объект DefaultBotProperties и передайте туда нужные настройки:
```py
from aiogram.client.default import DefaultBotProperties
bot = Bot(
token=config.bot_token.get_secret_value(),
default=DefaultBotProperties(
parse_mode=ParseMode.HTML
# тут ещё много других интересных настроек
)
)
# где-то в функции...
await message.answer("Сообщение с <u>HTML-разметкой</u>")
# чтобы явно отключить форматирование в конкретном запросе,
# передайте parse_mode=None
await message.answer(
"Сообщение без <s>какой-либо разметки</s>",
parse_mode=None
)
```
#### Экранирование ввода
Второе чуть сложнее, но более продвинутое: воспользоваться специальным инструментом,
который будет собирать отдельно текст и отдельно информацию о том, какие его куски должны быть отформатированы.
```py
from aiogram.filters import Command
from aiogram.utils.formatting import Text, Bold
@dp.message(Command("hello"))
async def cmd_hello(message: Message):
content = Text(
"Hello, ",
Bold(message.from_user.full_name)
)
await message.answer(
**content.as_kwargs()
)
```
В примере выше конструкция **content.as_kwargs() вернёт аргументы text, entities, parse_mode и подставит их в вызов answer()

84
bot.py
View File

@ -6,7 +6,12 @@ from datetime import datetime
from aiogram import Bot, Dispatcher, types
from aiogram.enums.dice_emoji import DiceEmoji
from aiogram.filters.command import Command
from aiogram import F, html
from aiogram.types import Message
from aiogram.filters import Command
from aiogram.utils.formatting import Text, Bold, as_list, as_marked_section, as_key_value, HashTag
from aiogram.enums import ParseMode
from aiogram.client.default import DefaultBotProperties
from config_reader import config
# Включаем логирование, чтобы не пропустить важные сообщения
@ -15,7 +20,12 @@ logging.basicConfig(level=logging.INFO)
# Для записей с типом Secret* необходимо
# вызывать метод get_secret_value(),
# чтобы получить настоящее содержимое вместо '*******'
bot = Bot(token=config.bot_token.get_secret_value())
bot = Bot(
token=config.bot_token.get_secret_value(),
default=DefaultBotProperties(
parse_mode=ParseMode.HTML
# тут ещё много других интересных настроек
))
# Объект бота напрямую из .env
# bot = Bot(token=os.getenv("BOT_TOKEN"))
@ -27,7 +37,36 @@ dp["started_at"] = datetime.now().strftime("%Y-%m-%d %H:%M")
# Хэндлер на команду /start
@dp.message(Command("start"))
async def cmd_start(message: types.Message):
await message.answer("Привет!")
# await message.answer("Привет! ")
content = as_list(
Text(
"Привет! ",
Bold(message.from_user.first_name)
),
as_marked_section(
Bold("Я умею:"),
"/test1 - Отвечу Test1",
"/answer - Просто отвечу",
"/reply - Отвечу ответом",
"/name - Поприветствую тебя по Имени и Фамилии",
"/aboute - Дам тебе характеристику",
"/dice - Подкину для тебя кубик, загадай число ;)",
marker="",
),
as_marked_section(
Bold("Failed:"),
"Не смогу назвать номер твоего телефона :( )",
marker="",
),
HashTag(""),
# Text(
# "Номер телефона, ",
# Bold(message.contact.phone_number)
# )
)
await message.answer(
**content.as_kwargs()
)
# Хэндлер на команду /test1
@dp.message(Command("test1"))
@ -44,6 +83,45 @@ async def cmd_test2(message: types.Message):
async def cmd_answer(message: types.Message):
await message.answer("Это простой ответ")
# Хэндлер на команду /name
@dp.message(Command("name"))
async def cmd_name(message: Message):
await message.answer(
f"Доброго дня тебе, <b>{html.bold(html.quote(message.from_user.full_name))}</b>",
parse_mode=ParseMode.HTML
# f"Мой ник, <b>{html.bold(html.quote(message.from_user.username))}</b>",
# parse_mode=ParseMode.HTML
)
@dp.message(Command("aboute"))
async def cmd_aboute(message: Message):
content = as_list(
Text(
"User_name, ",
Bold(message.from_user.username)
),
as_marked_section(
Bold("Это Ты:"),
"Молодец",
"Красава",
"Умка",
marker="",
),
as_marked_section(
Bold("Это точно не ты:"),
"Душнила",
marker="",
),
HashTag("#характеристика"),
# Text(
# "Номер телефона, ",
# Bold(message.contact.phone_number)
# )
)
await message.answer(
**content.as_kwargs()
)
@dp.message(Command("reply"))
async def cmd_reply(message: types.Message):