Skip to content

Commit ef4f169

Browse files
Обновление учебника (май 2024) (#86)
- Обновлено вступление про установку библиотек - Обновлена секция про установку параметров бота по умолчанию - Добавлена секция о настройке предпросмотра ссылок - Добавлен пример с переносом подписей к медиафайлам наверх - Исправлены опечатки (#81, #82, #83) - Поднята версия aiogram до 3.7.0 - Обновлен mkdocs-material
1 parent 92302c4 commit ef4f169

22 files changed

+359
-174
lines changed

book_src/buttons.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Кнопки
66
# Кнопки
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
В этой главе мы познакомимся с такой замечательной фичей Telegram-ботов как кнопки. Прежде всего, чтобы избежать
1212
путаницы, определимся с названиями. То, что цепляется к низу экрана вашего устройства, будем называть **обычными**

book_src/filters-and-middlewares.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Фильтры и мидлвари
66
# Фильтры и мидлвари
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
Настало время разобраться, как устроены фильтры и мидлвари в aiogram 3.x, а также познакомиться с
1212
«убийцей лямбда-выражений» фреймворка — _магическими фильтрами_.

book_src/fsm.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Конечные автоматы (FSM)
66
# Конечные автоматы (FSM) {: id="fsm-start" }
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
## Теория {: id="theory" }
1212

@@ -141,7 +141,7 @@ async def food_chosen(message: Message, state: FSMContext):
141141
в хранилище FSM, и эти данные уникальны для пары `(chat_id, user_id)` (есть нюанс, о нём позже). Наконец,
142142
в строке 11 мы переводим пользователя в состояние `OrderFood.choosing_food_size`.
143143

144-
А если пользователь решит ввести что-то самостоятельно, без клавиатуры? В этом случае, надо сообщить пользователю
144+
А если пользователь решит ввести что-то самостоятельно, без клавиатуры? В этом случае надо сообщить пользователю
145145
об ошибке и дать ему ещё попытку. Очень часто начинающие разработчки ботов на этом моменте задают вопрос:
146146
«а как оставить юзера в том же состоянии?». Ответ простой: чтобы оставить пользователя в текущем состоянии, достаточно
147147
его \[состояние\] не менять, т.е. буквально _ничего не делать_.
34.8 KB
Loading
Loading

book_src/index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ title: Введение
2121
курсов по Python, пройдите их, а лишь затем принимайтесь за написание ботов, сэкономите себе время и нервные клетки.
2222

2323
Во всех главах в качестве операционной системы мы будем использовать что-нибудь семейства GNU/Linux,
24-
например, [Ubuntu](https://ubuntu.com/), Python 3.9 (в Virtual Environment) и среду разработки
24+
например, [Ubuntu](https://ubuntu.com/), Python 3.11 (в Virtual Environment) и среду разработки
2525
[PyCharm](https://www.jetbrains.com/ru-ru/pycharm/download/), впрочем, не возбраняется и [Visual Studio Code](https://code.visualstudio.com/).
2626
При этом пользователи Windows не в пролёте: всё, что касается кода, будет спокойно работать и у вас, а для специфичных вещей
2727
вроде systemd вы можете использовать Ubuntu в [VirtualBox](https://www.virtualbox.org).

book_src/inline-mode.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Инлайн-режим
66
# Инлайн-режим
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
## Теория {: id="theory" }
1212

book_src/messages.md

+113-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Работа с сообщениями
66
# Работа с сообщениями
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
В этой главе мы разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.
1212

@@ -66,15 +66,25 @@ async def any_message(message: Message):
6666
![Hello world с разным форматированием](images/messages/l02_1.png)
6767

6868
Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент `parse_mode` довольно
69-
накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект **Bot**, а если в каком-то конкретном случае
70-
нужно обойтись без этих ваших разметок, то просто укажите `parse_mode=None`:
71-
69+
накладно. К счастью, в aiogram можно задать параметры бота по умолчанию. Для этого создайте объект `DefaultBotProperties`
70+
и передайте туда нужные настройки:
7271

7372
```python
73+
from aiogram.client.default import DefaultBotProperties
74+
75+
bot = Bot(
76+
token="123:abcxyz",
77+
default=DefaultBotProperties(
78+
parse_mode=ParseMode.HTML
79+
# тут ещё много других интересных настроек
80+
)
81+
)
7482
bot = Bot(token="123:abcxyz", parse_mode="HTML")
7583

7684
# где-то в функции...
7785
await message.answer("Сообщение с <u>HTML-разметкой</u>")
86+
# чтобы явно отключить форматирование в конкретном запросе,
87+
# передайте parse_mode=None
7888
await message.answer(
7989
"Сообщение без <s>какой-либо разметки</s>",
8090
parse_mode=None
@@ -375,6 +385,87 @@ async def cmd_start_book(
375385
[https://core.telegram.org/api/links](https://core.telegram.org/api/links)
376386

377387

388+
### Предпросмотр ссылок {: id="link-previews" }
389+
390+
Обычно при отправке текстового сообщения со ссылками Telegram пытается найти и показать предпросмотр первой по порядку ссылки.
391+
Это поведение можно настроить по своему желанию, передав в качестве аргумента `link_preview_options` метода `send_message()`
392+
объект `LinkPreviewOptions`:
393+
394+
```python
395+
# Новый импорт
396+
from aiogram.types import LinkPreviewOptions
397+
398+
@dp.message(Command("links"))
399+
async def cmd_links(message: Message):
400+
links_text = (
401+
"https://nplus1.ru/news/2024/05/23/voyager-1-science-data"
402+
"\n"
403+
"https://t.me/telegram"
404+
)
405+
# Ссылка отключена
406+
options_1 = LinkPreviewOptions(is_disabled=True)
407+
await message.answer(
408+
f"Нет превью ссылок\n{links_text}",
409+
link_preview_options=options_1
410+
)
411+
412+
# -------------------- #
413+
414+
# Маленькое превью
415+
# Для использования prefer_small_media обязательно указывать ещё и url
416+
options_2 = LinkPreviewOptions(
417+
url="https://nplus1.ru/news/2024/05/23/voyager-1-science-data",
418+
prefer_small_media=True
419+
)
420+
await message.answer(
421+
f"Маленькое превью\n{links_text}",
422+
link_preview_options=options_2
423+
)
424+
425+
# -------------------- #
426+
427+
# Большое превью
428+
# Для использования prefer_large_media обязательно указывать ещё и url
429+
options_3 = LinkPreviewOptions(
430+
url="https://nplus1.ru/news/2024/05/23/voyager-1-science-data",
431+
prefer_large_media=True
432+
)
433+
await message.answer(
434+
f"Большое превью\n{links_text}",
435+
link_preview_options=options_3
436+
)
437+
438+
# -------------------- #
439+
440+
# Можно сочетать: маленькое превью и расположение над текстом
441+
options_4 = LinkPreviewOptions(
442+
url="https://nplus1.ru/news/2024/05/23/voyager-1-science-data",
443+
prefer_small_media=True,
444+
show_above_text=True
445+
)
446+
await message.answer(
447+
f"Маленькое превью над текстом\n{links_text}",
448+
link_preview_options=options_4
449+
)
450+
451+
# -------------------- #
452+
453+
# Можно выбрать, какая ссылка будет использоваться для предпосмотра,
454+
options_5 = LinkPreviewOptions(
455+
url="https://t.me/telegram"
456+
)
457+
await message.answer(
458+
f"Предпросмотр не первой ссылки\n{links_text}",
459+
link_preview_options=options_5
460+
)
461+
```
462+
463+
Результат:
464+
![Примеры предпросмотров ссылок](images/messages/link_preview_options.png)
465+
466+
Также некоторые параметры предпросмотра можно указать по умолчанию в `DefaultBotProperties`, о чём рассказывалось
467+
в начале главы.
468+
378469
## Медиафайлы {: id="media" }
379470

380471
### Отправка файлов {: id="uploading-media" }
@@ -454,6 +545,20 @@ async def upload_photo(message: Message):
454545
await message.answer("Отправленные файлы:\n"+"\n".join(file_ids))
455546
```
456547

548+
Подпись у фото, видео и GIF можно перенести наверх:
549+
550+
```python
551+
@dp.message(Command("gif"))
552+
async def send_gif(message: Message):
553+
await message.answer_animation(
554+
animation="<file_id гифки>",
555+
caption="Я сегодня:",
556+
show_caption_above_media=True
557+
)
558+
```
559+
560+
![подпись над анимацией](images/messages/caption_above_media.jpg)
561+
457562
### Скачивание файлов {: id="downloading-media" }
458563

459564
Помимо переиспользования для отправки, бот может скачать медиа к себе на компьютер/сервер. Для этого у объекта типа `Bot`
@@ -602,12 +707,10 @@ async def somebody_added(message: Message):
602707
## Бонус: прячем ссылку в тексте {: id="bonus" }
603708

604709
Бывают ситуации, когда хочется отправить длинное сообщение с картинкой, но лимит на подписи к медиафайлам составляет
605-
всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво. Более того,
606-
когда Telegram делает предпросмотр ссылок, он берёт первую из них и считывает метатеги, в результате сообщение может
607-
отправиться не с тем превью, которое хочется увидеть.
710+
всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво.
608711
Для решения этой проблемы ещё много лет назад придумали подход со «скрытыми ссылками» в HTML-разметке. Суть в том, что
609712
можно поместить ссылку в [пробел нулевой ширины](http://www.fileformat.info/info/unicode/char/200b/index.htm) и вставить
610-
всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении никаких ссылок нет, а сервер Telegram всё видит и честно
713+
всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении нет ничего лишнего, а сервер Telegram всё видит и честно
611714
добавляет предпросмотр.
612715
Разработчики aiogram для этого даже сделали специальный вспомогательный метод `hide_link()`:
613716
```python
@@ -626,5 +729,7 @@ async def cmd_hidden_link(message: Message):
626729

627730
![Изображение со скрытой ссылкой](images/messages/hidden_link.png)
628731

732+
А при помощи LinkPreviewOptions (см. выше) можно сделать медиафайл сверху с длинной подписью в 4096 символов ниже.
733+
629734
На этом всё. До следующих глав!
630735
<s><small>Ставьте лайки, подписывайтесь, прожимайте колокольчик</small></s>

book_src/quickstart.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Знакомство с aiogram
66
# Знакомство с aiogram
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
!!! warning "Некоторые детали сознательно упрощены!"
1212
Автор этой книги убеждён, что помимо теории должна быть и практика. Чтобы максимально упростить повторение
@@ -60,16 +60,16 @@ Type "help", "copyright", "credits" or "license" for more information.
6060
```
6161

6262
Теперь создадим файл `requirements.txt`, в котором укажем используемую нами версию aiogram. Также нам понадобится
63-
библиотека python-dotenv для файлов конфигурации.
63+
библиотека pydantic-settings для файлов конфигурации.
6464
!!! important "О версиях aiogram"
6565
В этой главе используется aiogram **3.x**, перед началом работы рекомендую заглянуть в
6666
[канал релизов](https://t.me/aiogram_live) библиотеки и проверить наличие более новой версии. Подойдёт любая
6767
более новая, начинающаяся с цифры 3, поскольку aiogram 2.x более рассматриваться не будет и считается устаревшим.
6868

6969
```plain
70-
[groosha@main 01_quickstart]$ python3.9 -m venv venv
70+
[groosha@main 01_quickstart]$ python3.11 -m venv venv
7171
[groosha@main 01_quickstart]$ echo "aiogram<4.0" > requirements.txt
72-
[groosha@main 01_quickstart]$ echo "python-dotenv==1.0.0" >> requirements.txt
72+
[groosha@main 01_quickstart]$ echo "pydantic-settings" >> requirements.txt
7373
[groosha@main 01_quickstart]$ source venv/bin/activate
7474
(venv) [groosha@main 01_quickstart]$ pip install -r requirements.txt
7575
# ...здесь куча строк про установку...
@@ -78,10 +78,10 @@ Successfully installed ...тут длинный список...
7878
```
7979

8080
Обратите внимание на префикс "venv" в терминале. Он указывает, что мы находимся в виртуальном окружении с именем "venv".
81-
Проверим, что внутри venv вызов команды `python` указывает на всё тот же Python 3.9:
81+
Проверим, что внутри venv вызов команды `python` указывает на всё тот же Python 3.11:
8282
```plain
8383
(venv) [groosha@main 01_quickstart]$ python
84-
Python 3.9.9 (main, Jan 11 2022, 16:35:07)
84+
Python 3.11.9 (main, Jan 11 2024, 16:35:07)
8585
[GCC 11.1.0] on linux
8686
Type "help", "copyright", "credits" or "license" for more information.
8787
>>> exit()
@@ -205,12 +205,12 @@ async def cmd_dice(message: types.Message):
205205
поэтому встроенная проверка типов, как, например, в C++ или Java, отсутствует. Однако начиная с версии 3.5
206206
в языке появилась поддержка [подсказок типов](https://docs.python.org/3/library/typing.html), благодаря которой
207207
различные чекеры и IDE вроде PyCharm анализируют типы используемых значений и подсказывают
208-
программисту, если он передаёт что-то не то. В данном случае подсказка `types.Message` соообщает
208+
программисту, если он передаёт что-то не то. В данном случае подсказка `types.Message` сообщает
209209
PyCharm-у, что переменная `message` имеет тип `Message`, описанный в модуле `types` библиотеки
210210
aiogram (см. импорты в начале кода). Благодаря этому IDE может на лету подсказывать атрибуты и функции.
211211

212212
При вызове команды `/dice` бот отправит в тот же чат игральный кубик. Разумеется, если его надо отправить в какой-то
213-
другой чат, то придётся по-старинке вызывать `await bot.send_dice(...)`. Но объект `bot` (экземпляр класса Bot) может быть
213+
другой чат, то придётся по старинке вызывать `await bot.send_dice(...)`. Но объект `bot` (экземпляр класса Bot) может быть
214214
недоступен в области видимости конкретной функции. В aiogram 3.x объект бота, которому пришёл апдейт, неявно
215215
прокидывается в хэндлер и его можно достать как аргумент `bot`. Предположим, вы хотите по команде `/dice`
216216
отправлять кубик не в тот же чат, а в канал с ID -100123456789. Перепишем предыдущую функцию:

book_src/routers.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: Роутеры, многофайловость и структур
66
# Роутеры, многофайловость и структура бота
77

88
!!! info ""
9-
Используемая версия aiogram: 3.1.1
9+
Используемая версия aiogram: 3.7.0
1010

1111
В этой главе мы познакомимся с новой фичей aiogram 3.x — роутерами, научимся разбивать наш код на отдельные
1212
компоненты, а также сформируем базовую структуру бота, которая пригодится в следующих главах и вообще по жизни.

0 commit comments

Comments
 (0)