Formatting used advanced scenario
This commit is contained in:
parent
687209ed0f
commit
2d8340bacf
77
README.md
77
README.md
@ -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
84
bot.py
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user