@@ -6,7 +6,7 @@ description: Работа с сообщениями
6
6
# Работа с сообщениями
7
7
8
8
!!! info ""
9
- Используемая версия aiogram: 3.1.1
9
+ Используемая версия aiogram: 3.7.0
10
10
11
11
В этой главе мы разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.
12
12
@@ -66,15 +66,25 @@ async def any_message(message: Message):
66
66
![ Hello world с разным форматированием] ( images/messages/l02_1.png )
67
67
68
68
Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент ` parse_mode ` довольно
69
- накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект ** Bot** , а если в каком-то конкретном случае
70
- нужно обойтись без этих ваших разметок, то просто укажите ` parse_mode=None ` :
71
-
69
+ накладно. К счастью, в aiogram можно задать параметры бота по умолчанию. Для этого создайте объект ` DefaultBotProperties `
70
+ и передайте туда нужные настройки:
72
71
73
72
``` 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
+ )
74
82
bot = Bot(token = " 123:abcxyz" , parse_mode = " HTML" )
75
83
76
84
# где-то в функции...
77
85
await message.answer(" Сообщение с <u>HTML-разметкой</u>" )
86
+ # чтобы явно отключить форматирование в конкретном запросе,
87
+ # передайте parse_mode=None
78
88
await message.answer(
79
89
" Сообщение без <s>какой-либо разметки</s>" ,
80
90
parse_mode = None
@@ -375,6 +385,87 @@ async def cmd_start_book(
375
385
[ https://core.telegram.org/api/links ] ( https://core.telegram.org/api/links )
376
386
377
387
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
+
378
469
## Медиафайлы {: id="media" }
379
470
380
471
### Отправка файлов {: id="uploading-media" }
@@ -454,6 +545,20 @@ async def upload_photo(message: Message):
454
545
await message.answer(" Отправленные файлы:\n " + " \n " .join(file_ids))
455
546
```
456
547
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
+
457
562
### Скачивание файлов {: id="downloading-media" }
458
563
459
564
Помимо переиспользования для отправки, бот может скачать медиа к себе на компьютер/сервер. Для этого у объекта типа ` Bot `
@@ -602,12 +707,10 @@ async def somebody_added(message: Message):
602
707
## Бонус: прячем ссылку в тексте {: id="bonus" }
603
708
604
709
Бывают ситуации, когда хочется отправить длинное сообщение с картинкой, но лимит на подписи к медиафайлам составляет
605
- всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво. Более того,
606
- когда Telegram делает предпросмотр ссылок, он берёт первую из них и считывает метатеги, в результате сообщение может
607
- отправиться не с тем превью, которое хочется увидеть.
710
+ всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво.
608
711
Для решения этой проблемы ещё много лет назад придумали подход со «скрытыми ссылками» в HTML-разметке. Суть в том, что
609
712
можно поместить ссылку в [ пробел нулевой ширины] ( http://www.fileformat.info/info/unicode/char/200b/index.htm ) и вставить
610
- всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении никаких ссылок нет , а сервер Telegram всё видит и честно
713
+ всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении нет ничего лишнего , а сервер Telegram всё видит и честно
611
714
добавляет предпросмотр.
612
715
Разработчики aiogram для этого даже сделали специальный вспомогательный метод ` hide_link() ` :
613
716
``` python
@@ -626,5 +729,7 @@ async def cmd_hidden_link(message: Message):
626
729
627
730
![ Изображение со скрытой ссылкой] ( images/messages/hidden_link.png )
628
731
732
+ А при помощи LinkPreviewOptions (см. выше) можно сделать медиафайл сверху с длинной подписью в 4096 символов ниже.
733
+
629
734
На этом всё. До следующих глав!
630
735
<s ><small >Ставьте лайки, подписывайтесь, прожимайте колокольчик</small ></s >
0 commit comments